use Test2::Bundle::Extended -target => 'Test2::Tools::Subtest'; use Test2::Tools::Subtest qw/subtest_streamed subtest_buffered/; use File::Temp qw/tempfile/; # A bug in older perls causes a strange error AFTER the program appears to be # done if this test is run. # "Size magic not implemented." if ($] > 5.020000 && $ENV{AUTHOR_TESTING}) { like( intercept { subtest_streamed 'foo' => sub { my ($fh, $name) = tempfile; print $fh <<" EOT"; use Test2::Bundle::Extended; BEGIN { skip_all 'because' } 1; EOT close($fh); do $name; unlink($name) or warn "Could not remove temp file $name: $!"; die $@ if $@; die "Ooops"; }; }, subset { event Note => { message => 'Subtest: foo' }; event Subtest => sub { field pass => 1; field name => 'Subtest: foo'; field subevents => subset { event Plan => { directive => 'SKIP', reason => 'because' }; }; } }, "skip_all in BEGIN inside a subtest works" ); } subtest_streamed 'hub tests' => sub { my $hub = Test2::API::test2_stack->top; isa_ok($hub, 'Test2::Hub', 'Test2::Hub::Subtest'); my $todo = todo "testing parent_todo"; subtest_streamed 'inner hub tests' => sub { my $ihub = Test2::API::test2_stack->top; isa_ok($ihub, 'Test2::Hub', 'Test2::Hub::Subtest'); }; }; like( intercept { subtest_streamed 'foo' => sub { subtest_buffered 'bar' => sub { ok(1, "pass"); }; }; }, subset { event Note => { message => 'Subtest: foo' }; event Subtest => sub { field pass => 1; field name => 'Subtest: foo'; field subevents => subset { event Subtest => sub { field pass => 1; field name => 'bar'; field subevents => subset { event Ok => sub { field name => 'pass'; field pass => 1; }; }; }; }; }; }, "Can nest subtests" ); my @lines = (); like( intercept { push @lines => __LINE__ + 4; subtest_streamed 'foo' => sub { push @lines => __LINE__ + 1; ok(1, "pass"); }; }, subset { event Note => { message => 'Subtest: foo' }; event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'Subtest: foo'; field subevents => subset { event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'pass'; field pass => 1; }; }; }; }, "Got events for passing subtest" ); @lines = (); like( intercept { push @lines => __LINE__ + 4; subtest_streamed 'foo' => sub { push @lines => __LINE__ + 1; ok(0, "fail"); }; }, subset { event Note => { message => 'Subtest: foo' }; event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 0; field name => 'Subtest: foo'; field subevents => subset { event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'fail'; field pass => 0; }; }; }; }, "Got events for failing subtest" ); @lines = (); like( intercept { push @lines => __LINE__ + 5; subtest_streamed 'foo' => sub { push @lines => __LINE__ + 1; ok(1, "pass"); done_testing; }; }, subset { event Note => { message => 'Subtest: foo' }; event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'Subtest: foo'; field subevents => subset { event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'pass'; field pass => 1; }; event Plan => { max => 1 }; }; }; }, "Can use done_testing" ); @lines = (); like( intercept { push @lines => __LINE__ + 5; subtest_streamed 'foo' => sub { plan 1; push @lines => __LINE__ + 1; ok(1, "pass"); }; }, subset { event Note => { message => 'Subtest: foo' }; event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'Subtest: foo'; field subevents => subset { event Plan => { max => 1 }; event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'pass'; field pass => 1; }; }; }; }, "Can plan" ); @lines = (); like( intercept { push @lines => __LINE__ + 5; subtest_streamed 'foo' => sub { skip_all 'bleh'; push @lines => __LINE__ + 1; ok(1, "pass"); }; }, subset { event Note => { message => 'Subtest: foo' }; event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'Subtest: foo'; field subevents => subset { event Plan => { directive => 'SKIP', reason => 'bleh' }; }; }; }, "Can skip_all" ); @lines = (); like( intercept { subtest_streamed 'foo' => sub { bail_out 'cause'; ok(1, "should not see this"); }; }, subset { event Note => { message => 'Subtest: foo' }; event Bail => { reason => 'cause' }; }, "Can bail out" ); @lines = (); like( intercept { push @lines => __LINE__ + 4; subtest_buffered 'foo' => sub { push @lines => __LINE__ + 1; ok(1, "pass"); }; }, subset { event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'foo'; field subevents => subset { event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'pass'; field pass => 1; }; }; }; }, "Got events for passing subtest" ); @lines = (); like( intercept { push @lines => __LINE__ + 4; subtest_buffered 'foo' => sub { push @lines => __LINE__ + 1; ok(0, "fail"); }; }, subset { event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 0; field name => 'foo'; field subevents => subset { event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'fail'; field pass => 0; }; }; }; }, "Got events for failing subtest" ); @lines = (); like( intercept { push @lines => __LINE__ + 5; subtest_buffered 'foo' => sub { push @lines => __LINE__ + 1; ok(1, "pass"); done_testing; }; }, subset { event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'foo'; field subevents => subset { event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'pass'; field pass => 1; }; event Plan => { max => 1 }; }; }; }, "Can use done_testing" ); @lines = (); like( intercept { push @lines => __LINE__ + 5; subtest_buffered 'foo' => sub { plan 1; push @lines => __LINE__ + 1; ok(1, "pass"); }; }, subset { event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'foo'; field subevents => subset { event Plan => { max => 1 }; event Ok => sub { prop file => __FILE__; prop line => $lines[1]; field name => 'pass'; field pass => 1; }; }; }; }, "Can plan" ); @lines = (); like( intercept { push @lines => __LINE__ + 5; subtest_buffered 'foo' => sub { skip_all 'bleh'; push @lines => __LINE__ + 1; ok(1, "pass"); }; }, subset { event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'foo'; field subevents => subset { event Plan => { directive => 'SKIP', reason => 'bleh' }; }; }; }, "Can skip_all" ); @lines = (); like( intercept { subtest_buffered 'foo' => sub { bail_out 'cause'; ok(1, "should not see this"); }; }, subset { event Bail => { reason => 'cause' }; }, "Can bail out" ); @lines = (); my $xyz = 0; like( intercept { push @lines => __LINE__ + 5; subtest_buffered 'foo' => {manual_skip_all => 1}, sub { skip_all 'bleh'; $xyz = 1; return; }; }, subset { event Subtest => sub { prop file => __FILE__; prop line => $lines[0]; field pass => 1; field name => 'foo'; field subevents => subset { event Plan => { directive => 'SKIP', reason => 'bleh' }; }; }; }, "Can skip_all" ); ok($xyz, "skip_all did not auto-abort"); done_testing;