diff --git a/testcases/lib/i3test.pm b/testcases/lib/i3test.pm index aff23009..52deebc4 100644 --- a/testcases/lib/i3test.pm +++ b/testcases/lib/i3test.pm @@ -116,6 +116,7 @@ use Test::More $test_more_args; use Data::Dumper; use AnyEvent::I3; use Time::HiRes qw(sleep); +use i3test::Test; __ $tester->BAIL_OUT("$@") if $@; feature->import(":5.10"); diff --git a/testcases/lib/i3test/Test.pm b/testcases/lib/i3test/Test.pm new file mode 100644 index 00000000..d83de55b --- /dev/null +++ b/testcases/lib/i3test/Test.pm @@ -0,0 +1,63 @@ +package i3test::Test; + +use base 'Test::Builder::Module'; + +our @EXPORT = qw(is_num_children); + +my $CLASS = __PACKAGE__; + +=head1 NAME + +i3test::Test - Additional test instructions for use in i3 testcases + +=head1 SYNOPSIS + + use i3test; + + my $ws = fresh_workspace; + is_num_children($ws, 0, 'no containers on this workspace yet'); + cmd 'open'; + is_num_children($ws, 1, 'one container after "open"'); + + done_testing; + +=head1 DESCRIPTION + +This module provides convenience methods for i3 testcases. If you notice that a +certain pattern is present in 5 or more test cases, it should most likely be +moved into this module. + +=head1 EXPORT + +=head2 is_num_children($workspace, $expected, $test_name) + +Gets the number of children on the given workspace and verifies that they match +the expected amount of children. + + is_num_children('1', 0, 'no containers on workspace 1 at startup'); + +=cut + +sub is_num_children { + my ($workspace, $num_children, $name) = @_; + my $tb = $CLASS->builder; + + my $con = i3test::get_ws($workspace); + $tb->ok(defined($con), "Workspace $workspace exists"); + if (!defined($con)) { + $tb->skip("Workspace does not exist, skipping is_num_children"); + return; + } + + my $got_num_children = scalar @{$con->{nodes}}; + + $tb->is_num($got_num_children, $num_children, $name); +} + +=head1 AUTHOR + +Michael Stapelberg + +=cut + +1 diff --git a/testcases/t/119-match.t b/testcases/t/119-match.t index e6a4e832..b02cc1e0 100644 --- a/testcases/t/119-match.t +++ b/testcases/t/119-match.t @@ -26,8 +26,7 @@ my $win = $content->[0]; cmd q|[class=".*"] kill|; cmd q|[con_id="99999"] kill|; -$content = get_ws_content($tmp); -ok(@{$content} == 1, 'window still there'); +is_num_children($tmp, 1, 'window still there'); # now kill the window cmd 'nop now killing the window'; @@ -37,8 +36,7 @@ cmd qq|[con_id="$id"] kill|; wait_for_unmap $window; cmd 'nop checking if its gone'; -$content = get_ws_content($tmp); -ok(@{$content} == 0, 'window killed'); +is_num_children($tmp, 0, 'window killed'); # TODO: same test, but with pcre expressions @@ -86,15 +84,13 @@ my $right = open_special(name => 'right'); ok($right->mapped, 'right window mapped'); # two windows should be here -$content = get_ws_content($tmp); -ok(@{$content} == 2, 'two windows opened'); +is_num_children($tmp, 2, 'two windows opened'); cmd '[class="special" title="left"] kill'; sync_with_i3; -$content = get_ws_content($tmp); -is(@{$content}, 1, 'one window still there'); +is_num_children($tmp, 1, 'one window still there'); ###################################################################### # check that regular expressions work @@ -104,17 +100,11 @@ $tmp = fresh_workspace; $left = open_special(name => 'left', wm_class => 'special7'); ok($left->mapped, 'left window mapped'); - -# two windows should be here -$content = get_ws_content($tmp); -ok(@{$content} == 1, 'window opened'); +is_num_children($tmp, 1, 'window opened'); cmd '[class="^special[0-9]$"] kill'; - wait_for_unmap $left; - -$content = get_ws_content($tmp); -is(@{$content}, 0, 'window killed'); +is_num_children($tmp, 0, 'window killed'); ###################################################################### # check that UTF-8 works when matching @@ -124,16 +114,10 @@ $tmp = fresh_workspace; $left = open_special(name => 'รค 3', wm_class => 'special7'); ok($left->mapped, 'left window mapped'); - -# two windows should be here -$content = get_ws_content($tmp); -ok(@{$content} == 1, 'window opened'); +is_num_children($tmp, 1, 'window opened'); cmd '[title="^\w [3]$"] kill'; - wait_for_unmap $left; - -$content = get_ws_content($tmp); -is(@{$content}, 0, 'window killed'); +is_num_children($tmp, 0, 'window killed'); done_testing; diff --git a/testcases/t/124-move.t b/testcases/t/124-move.t index 052cdbff..c093e47b 100644 --- a/testcases/t/124-move.t +++ b/testcases/t/124-move.t @@ -100,14 +100,12 @@ is($nodes->[1]->{id}, $second, 'second container on bottom'); # move it outside again cmd 'move left'; -$content = get_ws_content($tmp); -is(@{$content}, 3, 'three nodes on this workspace'); +is_num_children($tmp, 3, 'three containers after moving left'); # due to automatic flattening/cleanup, the remaining split container # will be replaced by the con itself, so we will still have 3 nodes cmd 'move right'; -$content = get_ws_content($tmp); -is(@{$content}, 2, 'two nodes on this workspace'); +is_num_children($tmp, 2, 'two containers after moving right (flattening)'); ###################################################################### # 4) We create two v-split containers on the workspace, then we move @@ -128,8 +126,7 @@ cmd "move right"; cmd 'focus left'; cmd "move right"; -$content = get_ws_content($otmp); -is(@{$content}, 1, 'only one nodes on this workspace'); +is_num_children($otmp, 1, 'only one node on this workspace'); ###################################################################### # 5) test moving floating containers. diff --git a/testcases/t/132-move-workspace.t b/testcases/t/132-move-workspace.t index 0f1cbcc1..c56a17a4 100644 --- a/testcases/t/132-move-workspace.t +++ b/testcases/t/132-move-workspace.t @@ -18,20 +18,20 @@ sub move_workspace_test { my $tmp2 = get_unused_workspace(); cmd "workspace $tmp"; - ok(@{get_ws_content($tmp)} == 0, 'no containers yet'); + is_num_children($tmp, 0, 'no containers yet'); my $first = open_empty_con($i3); my $second = open_empty_con($i3); - ok(@{get_ws_content($tmp)} == 2, 'two containers on first ws'); + is_num_children($tmp, 2, 'two containers on first ws'); cmd "workspace $tmp2"; - ok(@{get_ws_content($tmp2)} == 0, 'no containers on second ws yet'); + is_num_children($tmp2, 0, 'no containers on second ws yet'); cmd "workspace $tmp"; cmd "$movecmd $tmp2"; - ok(@{get_ws_content($tmp)} == 1, 'one container on first ws anymore'); - ok(@{get_ws_content($tmp2)} == 1, 'one container on second ws'); + is_num_children($tmp, 1, 'one container on first ws anymore'); + is_num_children($tmp2, 1, 'one container on second ws'); my ($nodes, $focus) = get_ws_content($tmp2); is($focus->[0], $second, 'same container on different ws'); @@ -53,7 +53,7 @@ move_workspace_test('move container to workspace'); cmd 'workspace 13: meh'; cmd 'open'; -ok(@{get_ws_content('13: meh')} == 1, 'one container on 13: meh'); +is_num_children('13: meh', 1, 'one container on 13: meh'); ok(!workspace_exists('13'), 'workspace 13 does not exist yet'); @@ -61,8 +61,8 @@ cmd 'workspace 12'; cmd 'open'; cmd 'move to workspace number 13'; -ok(@{get_ws_content('13: meh')} == 2, 'two containers on 13: meh'); -ok(@{get_ws_content('12')} == 0, 'no container on 12 anymore'); +is_num_children('13: meh', 2, 'one container on 13: meh'); +is_num_children('12', 0, 'no container on 12 anymore'); ok(!workspace_exists('13'), 'workspace 13 does still not exist'); @@ -76,28 +76,28 @@ ok(!workspace_exists('13'), 'workspace 13 does still not exist'); my $tmp = get_unused_workspace(); my $tmp2 = get_unused_workspace(); cmd "workspace $tmp"; -ok(@{get_ws_content($tmp)} == 0, 'no containers yet'); +is_num_children($tmp, 0, 'no containers yet'); my $first = open_empty_con($i3); my $second = open_empty_con($i3); -ok(@{get_ws_content($tmp)} == 2, 'two containers on first ws'); +is_num_children($tmp, 2, 'two containers'); cmd "workspace $tmp2"; -ok(@{get_ws_content($tmp2)} == 0, 'no containers yet'); +is_num_children($tmp2, 0, 'no containers yet'); my $third = open_empty_con($i3); -ok(@{get_ws_content($tmp2)} == 1, 'one container on second ws'); +is_num_children($tmp2, 1, 'one container on second ws'); # go back to the first workspace, move one of the containers to the next one cmd "workspace $tmp"; cmd 'move workspace next'; -ok(@{get_ws_content($tmp)} == 1, 'one container on first ws'); -ok(@{get_ws_content($tmp2)} == 2, 'two containers on second ws'); +is_num_children($tmp, 1, 'one container on first ws'); +is_num_children($tmp2, 2, 'two containers on second ws'); # go to the second workspace and move two containers to the first one cmd "workspace $tmp2"; cmd 'move workspace prev'; cmd 'move workspace prev'; -ok(@{get_ws_content($tmp)} == 3, 'three containers on first ws'); -ok(@{get_ws_content($tmp2)} == 0, 'no containers on second ws'); +is_num_children($tmp, 3, 'three containers on first ws'); +is_num_children($tmp2, 0, 'no containers on second ws'); ################################################################### # check if 'move workspace current' works @@ -108,16 +108,16 @@ $tmp2 = get_unused_workspace(); cmd "workspace $tmp"; $first = open_window(name => 'win-name'); -ok(@{get_ws_content($tmp)} == 1, 'one container on first ws'); +is_num_children($tmp, 1, 'one container on first ws'); cmd "workspace $tmp2"; -ok(@{get_ws_content($tmp2)} == 0, 'no containers yet'); +is_num_children($tmp2, 0, 'no containers yet'); cmd qq|[title="win-name"] move workspace $tmp2|; -ok(@{get_ws_content($tmp2)} == 1, 'one container on second ws'); +is_num_children($tmp2, 1, 'one container on second ws'); cmd qq|[title="win-name"] move workspace $tmp|; -ok(@{get_ws_content($tmp2)} == 0, 'no containers on second ws'); +is_num_children($tmp2, 0, 'no containers on second ws'); ################################################################### # check if floating cons are moved to new workspaces properly @@ -150,12 +150,12 @@ cmd 'open'; cmd 'workspace 16'; cmd 'open'; -is(@{get_ws('16')->{nodes}}, 1, 'one node on ws 16'); +is_num_children('16', 1, 'one node on ws 16'); cmd "workspace $tmp"; cmd 'open'; cmd 'move workspace number 16'; -is(@{get_ws('16')->{nodes}}, 2, 'two nodes on ws 16'); +is_num_children('16', 2, 'two nodes on ws 16'); ok(!workspace_exists('17'), 'workspace 17 does not exist yet'); cmd 'open'; diff --git a/testcases/t/175-startup-notification.t b/testcases/t/175-startup-notification.t index 3a4dbc81..2c6ce353 100644 --- a/testcases/t/175-startup-notification.t +++ b/testcases/t/175-startup-notification.t @@ -58,7 +58,7 @@ END_OF_C_CODE my $first_ws = fresh_workspace; -is(@{get_ws_content($first_ws)}, 0, 'no containers on this workspace yet'); +is_num_children($first_ws, 0, 'no containers on this workspace yet'); ###################################################################### # 1) initiate startup, switch workspace, create window @@ -95,7 +95,7 @@ is(get_startup_id(), $startup_id, 'libstartup-notification returns the same id') my $second_ws = fresh_workspace; -is(@{get_ws_content($second_ws)}, 0, 'no containers on the second workspace yet'); +is_num_children($second_ws, 0, 'no containers on the second workspace yet'); my $win = open_window({ dont_map => 1 }); mark_window($win->id); @@ -105,8 +105,8 @@ $win->map; # We sync with i3 here to make sure $x->input_focus is updated. sync_with_i3; -is(@{get_ws_content($second_ws)}, 0, 'still no containers on the second workspace'); -is(@{get_ws_content($first_ws)}, 1, 'one container on the first workspace'); +is_num_children($second_ws, 0, 'still no containers on the second workspace'); +is_num_children($first_ws, 1, 'one container on the first workspace'); ###################################################################### # same thing, but with _NET_STARTUP_ID set on the leader @@ -119,8 +119,8 @@ $win = open_window({ dont_map => 1, client_leader => $leader }); $win->map; sync_with_i3; -is(@{get_ws_content($second_ws)}, 0, 'still no containers on the second workspace'); -is(@{get_ws_content($first_ws)}, 2, 'two containers on the first workspace'); +is_num_children($second_ws, 0, 'still no containers on the second workspace'); +is_num_children($first_ws, 2, 'two containers on the first workspace'); ###################################################################### # 2) open another window after the startup process is completed @@ -131,7 +131,7 @@ complete_startup(); sync_with_i3; my $otherwin = open_window; -is(@{get_ws_content($second_ws)}, 1, 'one container on the second workspace'); +is_num_children($second_ws, 1, 'one container on the second workspace'); ###################################################################### # 3) test that the --no-startup-id flag for exec leads to no DESKTOP_STARTUP_ID @@ -166,5 +166,4 @@ unlink($tmp); is($startup_id, '', 'startup_id empty'); - done_testing; diff --git a/testcases/t/179-regress-multiple-ws.t b/testcases/t/179-regress-multiple-ws.t index 21271170..be3cc687 100644 --- a/testcases/t/179-regress-multiple-ws.t +++ b/testcases/t/179-regress-multiple-ws.t @@ -15,11 +15,11 @@ my $keep_open_con = open_empty_con($i3); my $tmp = fresh_workspace; my $con = open_empty_con($i3); -is(@{get_ws_content($tmp)}, 1, 'one container'); -is(@{get_ws_content($old)}, 1, 'one container on old ws'); +is_num_children($tmp, 1, 'one container'); +is_num_children($old, 1, 'one container on old ws'); cmd 'move workspace prev; workspace prev'; -is(@{get_ws_content($old)}, 2, 'container moved away'); +is_num_children($old, 2, 'container moved away'); done_testing; diff --git a/testcases/t/186-regress-assign-focus-parent.t b/testcases/t/186-regress-assign-focus-parent.t index 6f2e584f..4f4db430 100644 --- a/testcases/t/186-regress-assign-focus-parent.t +++ b/testcases/t/186-regress-assign-focus-parent.t @@ -22,29 +22,21 @@ my $i3 = i3(get_socket_path(0)); cmd 'workspace targetws'; open_window(name => "testcase"); - -my $nodes = get_ws_content('targetws'); -is(scalar @$nodes, 1, 'precisely one window'); +is_num_children('targetws', 1, 'precisely one window'); open_window(name => "testcase"); - -$nodes = get_ws_content('targetws'); -is(scalar @$nodes, 2, 'precisely two windows'); +is_num_children('targetws', 2, 'precisely two windows'); cmd 'split v'; open_window(name => "testcase"); - -$nodes = get_ws_content('targetws'); -is(scalar @$nodes, 2, 'still two windows'); +is_num_children('targetws', 2, 'still two windows'); # focus parent. the new window should now be opened right next to the last one. cmd 'focus parent'; open_window(name => "testcase"); - -$nodes = get_ws_content('targetws'); -is(scalar @$nodes, 3, 'new window opened next to last one'); +is_num_children('targetws', 3, 'new window opened next to last one'); exit_gracefully($pid); diff --git a/testcases/t/190-scratchpad-diff-ws.t b/testcases/t/190-scratchpad-diff-ws.t index 9b6e6c7a..ed03f210 100644 --- a/testcases/t/190-scratchpad-diff-ws.t +++ b/testcases/t/190-scratchpad-diff-ws.t @@ -45,8 +45,7 @@ my $win = open_window; my $scratch = open_special; cmd '[class="special"] move scratchpad'; -my ($nodes, $focus) = get_ws_content($tmp); -is(scalar @$nodes, 1, 'one window on current ws'); +is_num_children($tmp, 1, 'one window on current ws'); my $otmp = fresh_workspace; cmd 'scratchpad show'; diff --git a/testcases/t/501-scratchpad.t b/testcases/t/501-scratchpad.t index 97a64a4a..9305239a 100644 --- a/testcases/t/501-scratchpad.t +++ b/testcases/t/501-scratchpad.t @@ -25,18 +25,18 @@ my $i3 = i3(get_socket_path()); sub verify_scratchpad_on_same_ws { my ($ws) = @_; - is(scalar @{get_ws($ws)->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($ws, 0, 'no nodes on this ws'); my $window = open_window; - is(scalar @{get_ws($ws)->{nodes}}, 1, 'one nodes on this ws'); + is_num_children($ws, 1, 'one nodes on this ws'); cmd 'move scratchpad'; - is(scalar @{get_ws($ws)->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($ws, 0, 'no nodes on this ws'); cmd 'scratchpad show'; - is(scalar @{get_ws($ws)->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($ws, 0, 'no nodes on this ws'); is(scalar @{get_ws($ws)->{floating_nodes}}, 1, 'one floating node on this ws'); } @@ -61,21 +61,21 @@ sub verify_scratchpad_switch { cmd "workspace $first"; - is(scalar @{get_ws($first)->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($first, 0, 'no nodes on this ws'); my $window = open_window; - is(scalar @{get_ws($first)->{nodes}}, 1, 'one nodes on this ws'); + is_num_children($first, 1, 'one nodes on this ws'); cmd 'move scratchpad'; - is(scalar @{get_ws($first)->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($first, 0, 'no nodes on this ws'); cmd "workspace $second"; cmd 'scratchpad show'; my $ws = get_ws($second); - is(scalar @{$ws->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($second, 0, 'no nodes on this ws'); is(scalar @{$ws->{floating_nodes}}, 1, 'one floating node on this ws'); # Verify that the coordinates are within bounds. diff --git a/testcases/t/505-scratchpad-resolution.t b/testcases/t/505-scratchpad-resolution.t index 3d0bcfa6..ce85cfc0 100644 --- a/testcases/t/505-scratchpad-resolution.t +++ b/testcases/t/505-scratchpad-resolution.t @@ -22,15 +22,13 @@ sync_with_i3; sub verify_scratchpad_doesnt_move { my ($ws) = @_; - is(scalar @{get_ws($ws)->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($ws, 0, 'no nodes on this ws'); my $window = open_window; - - is(scalar @{get_ws($ws)->{nodes}}, 1, 'one nodes on this ws'); + is_num_children($ws, 1, 'one node on this ws'); cmd 'move scratchpad'; - - is(scalar @{get_ws($ws)->{nodes}}, 0, 'no nodes on this ws'); + is_num_children($ws, 0, 'no nodes on this ws'); my $last_x = -1; for (1 .. 20) {