From 1bd4c983dbbd9298d881ff06bdfd3675a5c03916 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Mon, 16 May 2011 21:45:30 +0200 Subject: [PATCH] tests: add test for the for_window config directive, use separate config for tests This test increases code coverage to 60.7% --- testcases/complete-run.pl | 2 +- testcases/i3-test.config | 105 ++++++++++++++++++++++++++++++ testcases/t/65-for_window.t | 123 ++++++++++++++++++++++++++++++++++++ 3 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 testcases/i3-test.config create mode 100644 testcases/t/65-for_window.t diff --git a/testcases/complete-run.pl b/testcases/complete-run.pl index c3a65480..e28bc19e 100755 --- a/testcases/complete-run.pl +++ b/testcases/complete-run.pl @@ -28,7 +28,7 @@ my $result = GetOptions( "coverage-testing" => \$coverage_testing ); -my $i3cmd = "export DISPLAY=:0; exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c " . abs_path("../i3.config"); +my $i3cmd = "export DISPLAY=:0; exec " . abs_path("../i3") . " -V -d all --disable-signalhandler -c i3-test.config"; # 1: get a list of all testcases my @testfiles = @ARGV; diff --git a/testcases/i3-test.config b/testcases/i3-test.config new file mode 100644 index 00000000..4065e5bb --- /dev/null +++ b/testcases/i3-test.config @@ -0,0 +1,105 @@ +for_window [class="borderless"] border none +for_window [title="special borderless title"] border none + +# ISO 10646 = Unicode +font -misc-fixed-medium-r-normal--13-120-75-75-C-70-iso10646-1 + +# Use Mouse+Mod1 to drag floating windows to their wanted position +floating_modifier Mod1 + +# temporary path during development +ipc-socket /tmp/nestedcons + +# Open empty container +bindsym Mod1+Shift+Return open + +# Start terminal (Mod1+Enter) +bindsym Mod1+Return exec /usr/bin/urxvt + +# Start dmenu (Mod1+p) +bindsym Mod1+p exec /usr/bin/dmenu_run + +# Horizontal orientation +bindsym Mod1+h split h + +# Vertical orientation +bindsym Mod1+v split v + +# Fullscreen (Mod1+f) +bindsym Mod1+f fullscreen + +# Stacking (Mod1+s) +bindsym Mod1+s layout stacking + +# Tabbed (Mod1+w) +bindsym Mod1+w layout tabbed + +# Default (Mod1+l) +bindsym Mod1+l layout default + +# toggle tiling / floating +bindsym Mod1+Shift+space mode toggle + +bindsym Mod1+u level up +#bindsym Mod1+d level down + +# Kill current client (Mod1+c) +bindsym Mod1+c kill + +# Restore saved JSON layout +bindsym Mod1+y restore /home/michael/i3/layout.json + +# Restart i3 +bindsym Mod1+Shift+c restart +# Reload i3 +bindsym Mod1+Shift+j reload +# Exit i3 +bindsym Mod1+Shift+l exit + +# Focus (Mod1+n/r/t/d) +bindsym Mod1+n prev h +bindsym Mod1+r next v +bindsym Mod1+t prev v +bindsym Mod1+d next h + +# alternatively, you can use the cursor keys: +bindsym Mod1+Left prev h +bindsym Mod1+Right next h +bindsym Mod1+Down next v +bindsym Mod1+Up prev v + +# Move +bindsym Mod1+Shift+n move left +bindsym Mod1+Shift+r move down +bindsym Mod1+Shift+t move up +bindsym Mod1+Shift+d move right + +# alternatively, you can use the cursor keys: +bindsym Mod1+Shift+Left move left +bindsym Mod1+Shift+Right move right +bindsym Mod1+Shift+Down move down +bindsym Mod1+Shift+Up move up + +# Workspaces (Mod1+1/2/…) +bindsym Mod1+1 workspace 1 +bindsym Mod1+2 workspace 2 +bindsym Mod1+3 workspace 3 +bindsym Mod1+4 workspace 4 +bindsym Mod1+5 workspace 5 +bindsym Mod1+6 workspace 6 +bindsym Mod1+7 workspace 7 +bindsym Mod1+8 workspace 8 +bindsym Mod1+9 workspace 9 +bindsym Mod1+0 workspace 10 + +# Move to Workspaces +bindsym Mod1+Shift+1 move workspace 1 +bindsym Mod1+Shift+2 move workspace 2 +bindsym Mod1+Shift+3 move workspace 3 +bindsym Mod1+Shift+4 move workspace 4 +bindsym Mod1+Shift+5 move workspace 5 +bindsym Mod1+Shift+6 move workspace 6 +bindsym Mod1+Shift+7 move workspace 7 +bindsym Mod1+Shift+8 move workspace 8 +bindsym Mod1+Shift+9 move workspace 9 +bindsym Mod1+Shift+0 move workspace 10 diff --git a/testcases/t/65-for_window.t b/testcases/t/65-for_window.t new file mode 100644 index 00000000..f780ce4b --- /dev/null +++ b/testcases/t/65-for_window.t @@ -0,0 +1,123 @@ +#!perl +# vim:ts=4:sw=4:expandtab +# +# +use X11::XCB qw(:all); +use X11::XCB::Connection; +use i3test; + +my $x = X11::XCB::Connection->new; + +my $tmp = fresh_workspace; + +############################################################## +# 1: test the following directive: +# for_window [class="borderless"] border none +# by first creating a window with a different class (should get +# the normal border), then creating a window with the class +# "borderless" (should get no border) +############################################################## + +my $window = $x->root->create_child( + class => WINDOW_CLASS_INPUT_OUTPUT, + rect => [ 0, 0, 30, 30 ], + background_color => '#00ff00', +); + +$window->name('Border window'); +$window->map; +sleep 0.25; + +my @content = @{get_ws_content($tmp)}; +cmp_ok(@content, '==', 1, 'one node on this workspace now'); +is($content[0]->{border}, 'normal', 'normal border'); + +$window->unmap; +sleep 0.25; + +my @content = @{get_ws_content($tmp)}; +cmp_ok(@content, '==', 0, 'no more nodes'); +diag('content = '. Dumper(\@content)); + +$window = $x->root->create_child( + class => WINDOW_CLASS_INPUT_OUTPUT, + rect => [ 0, 0, 30, 30 ], + background_color => '#00ff00', +); + +$window->_create; + +# TODO: move this to X11::XCB::Window +sub set_wm_class { + my ($id, $class, $instance) = @_; + + # Add a _NET_WM_STRUT_PARTIAL hint + my $atomname = $x->atom(name => 'WM_CLASS'); + my $atomtype = $x->atom(name => 'STRING'); + + $x->change_property( + PROP_MODE_REPLACE, + $window->id, + $atomname->id, + $atomtype->id, + 8, + length($class) + length($instance) + 2, + "$instance\x00$class\x00" + ); +} + +set_wm_class($window->id, 'borderless', 'borderless'); +$window->name('Borderless window'); +$window->map; +sleep 0.25; + +@content = @{get_ws_content($tmp)}; +cmp_ok(@content, '==', 1, 'one node on this workspace now'); +is($content[0]->{border}, 'none', 'no border'); + +$window->unmap; +sleep 0.25; + +@content = @{get_ws_content($tmp)}; +cmp_ok(@content, '==', 0, 'no more nodes'); + +############################################################## +# 2: match on the title, check if for_window is really executed +# only once +############################################################## + +$window = $x->root->create_child( + class => WINDOW_CLASS_INPUT_OUTPUT, + rect => [ 0, 0, 30, 30 ], + background_color => '#00ff00', +); + +$window->name('special title'); +$window->map; +sleep 0.25; + +@content = @{get_ws_content($tmp)}; +cmp_ok(@content, '==', 1, 'one node on this workspace now'); +is($content[0]->{border}, 'normal', 'normal border'); + +$window->name('special borderless title'); +sleep 0.25; + +@content = @{get_ws_content($tmp)}; +is($content[0]->{border}, 'none', 'no border'); + +$window->name('special title'); +sleep 0.25; + +cmd 'border normal'; + +@content = @{get_ws_content($tmp)}; +is($content[0]->{border}, 'normal', 'border reset to normal'); + +$window->name('special borderless title'); +sleep 0.25; + +@content = @{get_ws_content($tmp)}; +is($content[0]->{border}, 'normal', 'still normal border'); + +done_testing; -- 2.39.5