diff --git a/Changes b/Changes index 7d146a8..2b47f54 100644 --- a/Changes +++ b/Changes @@ -5,6 +5,9 @@ Revision history for Perl distribution Test-Class-Moose [ENHANCEMENTS] * Greatly expanded documentation for the test control methods. + * When using the sequential executor, the subtests used by + Test::Class::Moose are now streamed. Implemented by Greg Oschwald. GH + #107. 0.98 2019-10-26 diff --git a/lib/Test/Class/Moose/Executor/Parallel.pm b/lib/Test/Class/Moose/Executor/Parallel.pm index abbab2c..4f7b480 100755 --- a/lib/Test/Class/Moose/Executor/Parallel.pm +++ b/lib/Test/Class/Moose/Executor/Parallel.pm @@ -20,6 +20,7 @@ use Scalar::Util qw(reftype); use TAP::Formatter::Color 3.29; use Test2::API qw( test2_stack ); use Test2::AsyncSubtest 0.000018 (); +use Test2::Tools::AsyncSubtest qw( async_subtest ); use Test::Class::Moose::AttributeRegistry; use Test::Class::Moose::Report::Class; use Try::Tiny; @@ -194,6 +195,12 @@ sub _build_color { return TAP::Formatter::Color->new; } +sub _run_subtest { + shift; + + async_subtest(@_)->finish; +} + 1; =for Pod::Coverage Tags Tests runtests diff --git a/lib/Test/Class/Moose/Executor/Sequential.pm b/lib/Test/Class/Moose/Executor/Sequential.pm index 389ad1f..a2f889d 100644 --- a/lib/Test/Class/Moose/Executor/Sequential.pm +++ b/lib/Test/Class/Moose/Executor/Sequential.pm @@ -8,9 +8,28 @@ our $VERSION = '0.99'; use Moose 2.0000; use Carp; +use Test2::API qw( context run_subtest ); use namespace::autoclean; with 'Test::Class::Moose::Role::Executor'; +sub _run_subtest { + shift; + my $name = shift; + my $params = shift; + my $code = shift; + + my $ctx = context(); + my $pass = run_subtest( + $name, + $code, + { %{$params}, buffered => 0 }, + @_, + ); + $ctx->release; + + return $pass; +} + __PACKAGE__->meta->make_immutable; 1; diff --git a/lib/Test/Class/Moose/Role/Executor.pm b/lib/Test/Class/Moose/Role/Executor.pm index 3d081cd..c9763de 100644 --- a/lib/Test/Class/Moose/Role/Executor.pm +++ b/lib/Test/Class/Moose/Role/Executor.pm @@ -13,7 +13,6 @@ use namespace::autoclean; use List::SomeUtils qw(uniq); use List::Util qw(shuffle); use Test2::API qw( test2_stack ); -use Test2::Tools::AsyncSubtest qw( async_subtest ); use Test::Class::Moose::AttributeRegistry; use Test::Class::Moose::Config; use Test::Class::Moose::Report::Class; @@ -23,6 +22,8 @@ use Test::Class::Moose::Report; use Test::Class::Moose::Util qw( context_do ); use Try::Tiny; +requires '_run_subtest'; + has 'test_configuration' => ( is => 'ro', isa => 'Test::Class::Moose::Config', @@ -94,11 +95,11 @@ sub _run_test_classes { my @test_classes = @_; for my $test_class (@test_classes) { - async_subtest( + $self->_run_subtest( $test_class, { manual_skip_all => 1 }, sub { $self->run_test_class($test_class) } - )->finish; + ); } } @@ -180,7 +181,7 @@ sub _maybe_wrap_test_instance { ) unless $in_subtest; my $instance_report; - async_subtest( + $self->_run_subtest( $test_instance->test_instance_name, { manual_skip_all => 1 }, sub { @@ -189,7 +190,7 @@ sub _maybe_wrap_test_instance { $class_report, ); }, - )->finish; + ); return $instance_report; } @@ -225,8 +226,6 @@ sub run_test_instance { return; } - my $report = $self->test_report; - unless ( $self->run_test_control_method( $test_instance, 'test_startup', $instance_report, @@ -436,8 +435,7 @@ sub run_test_method { $method_report->_start_benchmark; - my $num_tests = 0; - my $test_class = $test_instance->test_class; + my $num_tests = 0; context_do { my $ctx = shift; @@ -446,7 +444,7 @@ sub run_test_method { # If the call to ->$test_method fails then this subtest will fail and # Test2::API will also include a diagnostic message with the error. - my $p = async_subtest( + my $p = $self->_run_subtest( $test_method, { manual_skip_all => 1 }, sub { @@ -466,7 +464,7 @@ sub run_test_method { $test_instance->$test_method($method_report); $num_tests = $hub->count; }, - )->finish; + ); $method_report->_end_benchmark; if ( $self->test_configuration->show_timing ) { diff --git a/t/basic.t b/t/basic.t index 293c001..fe51f56 100644 --- a/t/basic.t +++ b/t/basic.t @@ -91,6 +91,9 @@ subtest_streamed( call max => 2; }; TestsFor::Basic->expected_test_events; + event Note => sub { + call message => 'TestsFor::Basic::Subclass'; + }; event Subtest => sub { call name => 'TestsFor::Basic::Subclass'; call pass => F(); @@ -98,6 +101,9 @@ subtest_streamed( event Plan => sub { call max => 6; }; + event Note => sub { + call message => 'test_me'; + }; event Subtest => sub { call name => 'test_me'; call pass => T(); @@ -113,6 +119,9 @@ subtest_streamed( end(); }; }; + event Note => sub { + call message => 'test_my_instance_name'; + }; event Subtest => sub { call name => 'test_my_instance_name'; call pass => T(); @@ -128,6 +137,9 @@ subtest_streamed( end(); }; }; + event Note => sub { + call message => 'test_reporting'; + }; event Subtest => sub { call name => 'test_reporting'; call pass => T(); @@ -158,6 +170,9 @@ subtest_streamed( end(); }; }; + event Note => sub { + call message => 'test_this_baby'; + }; event Subtest => sub { call name => 'test_this_baby'; call pass => T(); @@ -188,6 +203,9 @@ subtest_streamed( end(); }; }; + event Note => sub { + call message => 'test_this_should_be_run'; + }; event Subtest => sub { call name => 'test_this_should_be_run'; call pass => T(); @@ -223,30 +241,28 @@ subtest_streamed( end(); }; }; + event Note => sub { + call message => 'test_this_will_die'; + }; event Subtest => sub { call name => 'test_this_will_die'; call pass => F(); call subevents => array { - event Exception => sub { - call error => match - qr{\Qforced die at \E.*\Qbasic.t\E.+}s; - }; - event Plan => sub { - call max => 0; - }; end(); }; }; + event Diag => sub { + call message => match qr{^\n?Failed test}; + }; event Diag => sub { call message => match - qr{\QFailed test 'test_this_will_die'\E.+}s; + qr{\Qforced die at \E.*\Qbasic.t\E.+}s; }; end(); }; }; event Diag => sub { - call message => match - qr{\QFailed test 'TestsFor::Basic::Subclass'\E.+}s; + call message => match qr{^\n?Failed test}; }; end(); } diff --git a/t/basiclib/TestsFor/Basic.pm b/t/basiclib/TestsFor/Basic.pm index 1e28b29..bed73ad 100644 --- a/t/basiclib/TestsFor/Basic.pm +++ b/t/basiclib/TestsFor/Basic.pm @@ -61,6 +61,149 @@ sub test_reporting { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Basic'; + }; + event Subtest => sub { + call name => 'TestsFor::Basic'; + call pass => T(); + call subevents => array { + filter_items { + grep { + !$_->isa('Test2::AsyncSubtest::Event::Attach') + && !$_->isa('Test2::AsyncSubtest::Event::Detach') + } @_; + }; + event Plan => sub { + call max => 4; + call trace => object { + call package => 'Test::Class::Moose::Role::Executor'; + call subname => 'Test::Class::Moose::Util::context_do'; + }; + }; + event Note => sub { + call message => 'test_me'; + }; + event Subtest => sub { + call name => 'test_me'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => 'test_me() ran (TestsFor::Basic)'; + call trace => object { + call package => 'TestsFor::Basic'; + call subname => 'Test2::Tools::Basic::ok'; + }; + }; + event Ok => sub { + call pass => T(); + call name => 'this is another test (TestsFor::Basic)'; + call trace => object { + call package => 'TestsFor::Basic'; + call subname => 'Test2::Tools::Basic::ok'; + }; + }; + event Ok => sub { + call pass => T(); + call name => + 'test_setup() should know our current class name'; + }; + event Ok => sub { + call pass => T(); + call name => '... and our current method name'; + }; + event Plan => sub { + call max => 4; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_my_instance_name'; + }; + event Subtest => sub { + call name => 'test_my_instance_name'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => 'test_instance_name matches class name'; + call trace => object { + call package => 'TestsFor::Basic'; + call subname => 'Test2::Tools::Compare::is'; + }; + }; + event Plan => sub { + call max => 1; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_reporting'; + }; + event Subtest => sub { + call name => 'test_reporting'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => + 'current_instance() should report the correct class name'; + }; + event Ok => sub { + call pass => T(); + call name => + '... and we should also be able to get the current method name'; + }; + event Ok => sub { + call pass => T(); + call name => + 'test_setup() should know our current class name'; + }; + event Ok => sub { + call pass => T(); + call name => '... and our current method name'; + }; + event Plan => sub { + call max => 4; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_this_baby'; + }; + event Subtest => sub { + call name => 'test_this_baby'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => 'whee! (TestsFor::Basic)'; + }; + event Ok => sub { + call pass => T(); + call name => + 'test_setup() should know our current class name'; + }; + event Ok => sub { + call pass => T(); + call name => '... and our current method name'; + }; + event Plan => sub { + call max => 3; + }; + end(); + }; + }; + end(); + }; + }; +} + +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Basic'; call pass => T(); diff --git a/t/basiclib/TestsFor/Basic/Subclass.pm b/t/basiclib/TestsFor/Basic/Subclass.pm index 39a9869..47896ad 100644 --- a/t/basiclib/TestsFor/Basic/Subclass.pm +++ b/t/basiclib/TestsFor/Basic/Subclass.pm @@ -28,6 +28,159 @@ sub test_this_should_be_run { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Basic::Subclass'; + }; + event Subtest => sub { + call name => 'TestsFor::Basic::Subclass'; + call pass => T(); + call subevents => array { + filter_items { + grep { + !$_->isa('Test2::AsyncSubtest::Event::Attach') + && !$_->isa('Test2::AsyncSubtest::Event::Detach') + } @_; + }; + event Plan => sub { + call max => 5; + }; + event Note => sub { + call message => 'test_me'; + }; + event Subtest => sub { + call name => 'test_me'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => + 'I overrode my parent! (TestsFor::Basic::Subclass)'; + }; + event Plan => sub { + call max => 1; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_my_instance_name'; + }; + event Subtest => sub { + call name => 'test_my_instance_name'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => 'test_instance_name matches class name'; + }; + event Plan => sub { + call max => 1; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_reporting'; + }; + event Subtest => sub { + call name => 'test_reporting'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => + 'current_instance() should report the correct class name'; + }; + event Ok => sub { + call pass => T(); + call name => + '... and we should also be able to get the current method name'; + }; + event Ok => sub { + call pass => T(); + call name => + 'test_setup() should know our current class name'; + }; + event Ok => sub { + call pass => T(); + call name => '... and our current method name'; + }; + event Plan => sub { + call max => 4; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_this_baby'; + }; + event Subtest => sub { + call name => 'test_this_baby'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => + 'This should run before my parent method (TestsFor::Basic::Subclass)'; + }; + event Ok => sub { + call pass => T(); + call name => 'whee! (TestsFor::Basic::Subclass)'; + }; + event Ok => sub { + call pass => T(); + call name => + 'test_setup() should know our current class name'; + }; + event Ok => sub { + call pass => T(); + call name => '... and our current method name'; + }; + event Plan => sub { + call max => 4; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_this_should_be_run'; + }; + event Subtest => sub { + call name => 'test_this_should_be_run'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => 'This is test number 1 in this method'; + }; + event Ok => sub { + call pass => T(); + call name => 'This is test number 2 in this method'; + }; + event Ok => sub { + call pass => T(); + call name => 'This is test number 3 in this method'; + }; + event Ok => sub { + call pass => T(); + call name => 'This is test number 4 in this method'; + }; + event Ok => sub { + call pass => T(); + call name => 'This is test number 5 in this method'; + }; + event Plan => sub { + call max => 5; + }; + end(); + }; + }; + end(); + }; + }; +} + +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Basic::Subclass'; call pass => T(); diff --git a/t/controllib/TestsFor/Control/SkipClass.pm b/t/controllib/TestsFor/Control/SkipClass.pm index f50ed54..21af628 100644 --- a/t/controllib/TestsFor/Control/SkipClass.pm +++ b/t/controllib/TestsFor/Control/SkipClass.pm @@ -22,6 +22,9 @@ sub test_method { sub run_control_methods_on_skip {1} sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Control::SkipClass'; + }; event Subtest => sub { call name => 'TestsFor::Control::SkipClass'; call pass => T(); @@ -61,4 +64,3 @@ sub expected_report { } 1; - diff --git a/t/controllib/TestsFor/Control/SkipMethod.pm b/t/controllib/TestsFor/Control/SkipMethod.pm index 942298c..3578365 100644 --- a/t/controllib/TestsFor/Control/SkipMethod.pm +++ b/t/controllib/TestsFor/Control/SkipMethod.pm @@ -28,6 +28,9 @@ sub test_will_skip { sub run_control_methods_on_skip {1} sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Control::SkipMethod'; + }; event Subtest => sub { call name => 'TestsFor::Control::SkipMethod'; call pass => T(); @@ -41,6 +44,9 @@ sub expected_test_events { event Plan => sub { call max => 2; }; + event Note => sub { + call message => 'test_method'; + }; event Subtest => sub { call name => 'test_method'; call pass => T(); @@ -58,6 +64,9 @@ sub expected_test_events { event Diag => sub { call message => 'in teardown'; }; + event Note => sub { + call message => 'test_will_skip'; + }; event Subtest => sub { call name => 'test_will_skip'; call pass => T(); diff --git a/t/include_exclude.t b/t/include_exclude.t index 6f2c481..15df1b9 100644 --- a/t/include_exclude.t +++ b/t/include_exclude.t @@ -37,6 +37,9 @@ test_events_is( event Plan => sub { call max => 2; }; + event Note => sub { + call message => 'TestsFor::Basic'; + }; event Subtest => sub { call name => 'TestsFor::Basic'; call pass => T(); @@ -44,6 +47,9 @@ test_events_is( event Plan => sub { call max => 1; }; + event Note => sub { + call message => 'test_this_baby'; + }; event Subtest => sub { call name => 'test_this_baby'; call pass => T(); @@ -71,6 +77,9 @@ test_events_is( }; end(); }; + event Note => sub { + call message => 'TestsFor::Basic::Subclass'; + }; event Subtest => sub { call name => 'TestsFor::Basic::Subclass'; call pass => T(); @@ -78,6 +87,9 @@ test_events_is( event Plan => sub { call max => 1; }; + event Note => sub { + call message => 'test_this_baby'; + }; event Subtest => sub { call name => 'test_this_baby'; call pass => T(); @@ -162,6 +174,9 @@ test_events_is( event Plan => sub { call max => 2; }; + event Note => sub { + call message => 'TestsFor::Basic'; + }; event Subtest => sub { call name => 'TestsFor::Basic'; call pass => T(); @@ -169,6 +184,9 @@ test_events_is( event Plan => sub { call max => 3; }; + event Note => sub { + call message => 'test_me'; + }; event Subtest => sub { call name => 'test_me'; call pass => T(); @@ -197,6 +215,9 @@ test_events_is( end(); }; }; + event Note => sub { + call message => 'test_my_instance_name'; + }; event Subtest => sub { call name => 'test_my_instance_name'; call pass => T(); @@ -212,6 +233,9 @@ test_events_is( end(); }; }; + event Note => sub { + call message => 'test_reporting'; + }; event Subtest => sub { call name => 'test_reporting'; call pass => T(); @@ -244,6 +268,9 @@ test_events_is( end(); }; }; + event Note => sub { + call message => 'TestsFor::Basic::Subclass'; + }; event Subtest => sub { call name => 'TestsFor::Basic::Subclass'; call pass => T(); @@ -251,6 +278,9 @@ test_events_is( event Plan => sub { call max => 4; }; + event Note => sub { + call message => 'test_me'; + }; event Subtest => sub { call name => 'test_me'; call pass => T(); @@ -266,6 +296,9 @@ test_events_is( end(); }; }; + event Note => sub { + call message => 'test_my_instance_name'; + }; event Subtest => sub { call name => 'test_my_instance_name'; call pass => T(); @@ -281,6 +314,9 @@ test_events_is( end(); }; }; + event Note => sub { + call message => 'test_reporting'; + }; event Subtest => sub { call name => 'test_reporting'; call pass => T(); @@ -310,6 +346,9 @@ test_events_is( end(); }; }; + event Note => sub { + call message => 'test_this_should_be_run'; + }; event Subtest => sub { call name => 'test_this_should_be_run'; call pass => T(); diff --git a/t/parallel.t b/t/parallel.t index d860d39..8066fcb 100644 --- a/t/parallel.t +++ b/t/parallel.t @@ -89,7 +89,7 @@ for my $class (@classes) { @_; return @_[ $i .. $#_ ]; }; - $class->expected_test_events; + $class->expected_parallel_test_events; }, "parallel tests produce the events for $class" ); diff --git a/t/parallellib/TestsFor/Alpha.pm b/t/parallellib/TestsFor/Alpha.pm index 0c59093..a2b68ea 100644 --- a/t/parallellib/TestsFor/Alpha.pm +++ b/t/parallellib/TestsFor/Alpha.pm @@ -16,7 +16,7 @@ sub test_second { ok 1, 'make sure plans work'; } -sub expected_test_events { +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Alpha'; call pass => T(); diff --git a/t/parallellib/TestsFor/Alpha/Subclass.pm b/t/parallellib/TestsFor/Alpha/Subclass.pm index ffef564..5b410a1 100644 --- a/t/parallellib/TestsFor/Alpha/Subclass.pm +++ b/t/parallellib/TestsFor/Alpha/Subclass.pm @@ -9,7 +9,7 @@ sub test_another { ok 1; } -sub expected_test_events { +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Alpha::Subclass'; call pass => T(); diff --git a/t/parallellib/TestsFor/Beta.pm b/t/parallellib/TestsFor/Beta.pm index 7473cad..b5dff5f 100644 --- a/t/parallellib/TestsFor/Beta.pm +++ b/t/parallellib/TestsFor/Beta.pm @@ -15,7 +15,7 @@ sub test_second { ok 2; } -sub expected_test_events { +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Beta'; call pass => T(); diff --git a/t/parallellib/TestsFor/Sequential.pm b/t/parallellib/TestsFor/Sequential.pm index 13d741c..a024f24 100644 --- a/t/parallellib/TestsFor/Sequential.pm +++ b/t/parallellib/TestsFor/Sequential.pm @@ -13,7 +13,7 @@ sub test_sequential_second { ok 1; } -sub expected_test_events { +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Sequential'; call pass => T(); diff --git a/t/parameterizedlib/TestsFor/Empty.pm b/t/parameterizedlib/TestsFor/Empty.pm index 4809d71..9d034af 100644 --- a/t/parameterizedlib/TestsFor/Empty.pm +++ b/t/parameterizedlib/TestsFor/Empty.pm @@ -20,6 +20,31 @@ sub test_one_set { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Empty'; + }; + event Subtest => sub { + call name => 'TestsFor::Empty'; + call pass => T(); + call subevents => array { + filter_items { + grep { + !$_->isa('Test2::AsyncSubtest::Event::Attach') + && !$_->isa('Test2::AsyncSubtest::Event::Detach') + } @_; + }; + event Plan => sub { + call directive => 'SKIP'; + call reason => + q{Skipping 'TestsFor::Empty': no test instances found}; + call max => 0; + }; + end(); + }; + }; +} + +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Empty'; call pass => T(); diff --git a/t/parameterizedlib/TestsFor/Parameterized.pm b/t/parameterizedlib/TestsFor/Parameterized.pm index a7738fd..512afac 100644 --- a/t/parameterizedlib/TestsFor/Parameterized.pm +++ b/t/parameterizedlib/TestsFor/Parameterized.pm @@ -33,6 +33,88 @@ sub test_one_set { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Parameterized'; + }; + event Subtest => sub { + call name => 'TestsFor::Parameterized'; + call pass => T(); + call subevents => array { + filter_items { + grep { + !$_->isa('Test2::AsyncSubtest::Event::Attach') + && !$_->isa('Test2::AsyncSubtest::Event::Detach') + } @_; + }; + event Plan => sub { + call max => 2; + }; + event Note => sub { + call message => 'TestsFor::Parameterized with bar'; + }; + event Subtest => sub { + call name => 'TestsFor::Parameterized with bar'; + call pass => T(); + call subevents => array { + event Plan => sub { + call max => 1; + }; + event Note => sub { + call message => 'test_one_set'; + }; + event Subtest => sub { + call name => 'test_one_set'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => 'ran a test where bar is 42'; + }; + event Plan => sub { + call max => 1; + }; + end(); + }; + }; + end(); + }; + }; + event Note => sub { + call message => 'TestsFor::Parameterized with foo'; + }; + event Subtest => sub { + call name => 'TestsFor::Parameterized with foo'; + call pass => T(); + call subevents => array { + event Plan => sub { + call max => 1; + }; + event Note => sub { + call message => 'test_one_set'; + }; + event Subtest => sub { + call name => 'test_one_set'; + call pass => T(); + call subevents => array { + event Ok => sub { + call pass => T(); + call name => 'ran a test where foo is 42'; + }; + event Plan => sub { + call max => 1; + }; + end(); + }; + }; + end(); + }; + }; + end(); + }; + }; +} + +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Parameterized'; call pass => T(); diff --git a/t/planlib/TestsFor/Attributes.pm b/t/planlib/TestsFor/Attributes.pm index 6749081..942406e 100644 --- a/t/planlib/TestsFor/Attributes.pm +++ b/t/planlib/TestsFor/Attributes.pm @@ -23,6 +23,9 @@ sub this_is_a_test_method_because_of_the_attribute : Tests(3) { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Attributes'; + }; event Subtest => sub { call name => 'TestsFor::Attributes'; call pass => T(); @@ -30,6 +33,9 @@ sub expected_test_events { event Plan => sub { call max => 4; }; + event Note => sub { + call message => 'test_just_one_test'; + }; event Subtest => sub { call name => 'test_just_one_test'; call pass => T(); @@ -44,6 +50,9 @@ sub expected_test_events { end(); }; }; + event Note => sub { + call message => 'test_more_than_one_test'; + }; event Subtest => sub { call name => 'test_more_than_one_test'; call pass => T(); @@ -62,6 +71,9 @@ sub expected_test_events { end(); }; }; + event Note => sub { + call message => 'test_with_attribute_but_no_plan'; + }; event Subtest => sub { call name => 'test_with_attribute_but_no_plan'; call pass => T(); @@ -92,6 +104,10 @@ sub expected_test_events { end(); }; }; + event Note => sub { + call message => + 'this_is_a_test_method_because_of_the_attribute'; + }; event Subtest => sub { call name => 'this_is_a_test_method_because_of_the_attribute'; call pass => T(); diff --git a/t/planlib/TestsFor/Attributes/Subclass.pm b/t/planlib/TestsFor/Attributes/Subclass.pm index 4a4551b..cb2ff67 100644 --- a/t/planlib/TestsFor/Attributes/Subclass.pm +++ b/t/planlib/TestsFor/Attributes/Subclass.pm @@ -28,6 +28,9 @@ sub this_is_a_test_method_because_of_the_attribute : Tests { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Attributes::Subclass'; + }; event Subtest => sub { call name => 'TestsFor::Attributes::Subclass'; call pass => T(); @@ -35,6 +38,9 @@ sub expected_test_events { event Plan => sub { call max => 4; }; + event Note => sub { + call message => 'test_just_one_test'; + }; event Subtest => sub { call name => 'test_just_one_test'; call pass => T(); @@ -49,6 +55,9 @@ sub expected_test_events { end(); }; }; + event Note => sub { + call message => 'test_more_than_one_test'; + }; event Subtest => sub { call name => 'test_more_than_one_test'; call pass => T(); @@ -71,6 +80,9 @@ sub expected_test_events { end(); }; }; + event Note => sub { + call message => 'test_with_attribute_but_no_plan'; + }; event Subtest => sub { call name => 'test_with_attribute_but_no_plan'; call pass => T(); @@ -93,6 +105,10 @@ sub expected_test_events { end(); }; }; + event Note => sub { + call message => + 'this_is_a_test_method_because_of_the_attribute'; + }; event Subtest => sub { call name => 'this_is_a_test_method_because_of_the_attribute'; call pass => T(); diff --git a/t/planlib/TestsFor/Person.pm b/t/planlib/TestsFor/Person.pm index 41dd725..e2f26a3 100644 --- a/t/planlib/TestsFor/Person.pm +++ b/t/planlib/TestsFor/Person.pm @@ -29,6 +29,9 @@ sub test_person { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Person'; + }; event Subtest => sub { call name => 'TestsFor::Person'; call pass => T(); @@ -36,6 +39,9 @@ sub expected_test_events { event Plan => sub { call max => 1; }; + event Note => sub { + call message => 'test_person'; + }; event Subtest => sub { call name => 'test_person'; call pass => T(); diff --git a/t/planlib/TestsFor/Person/Employee.pm b/t/planlib/TestsFor/Person/Employee.pm index 04fcef2..96d4e2a 100644 --- a/t/planlib/TestsFor/Person/Employee.pm +++ b/t/planlib/TestsFor/Person/Employee.pm @@ -18,6 +18,9 @@ BEGIN { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Person::Employee'; + }; event Subtest => sub { call name => 'TestsFor::Person::Employee'; call pass => T(); @@ -25,6 +28,9 @@ sub expected_test_events { event Plan => sub { call max => 1; }; + event Note => sub { + call message => 'test_person'; + }; event Subtest => sub { call name => 'test_person'; call pass => T(); diff --git a/t/skiplib/TestsFor/SkipAll.pm b/t/skiplib/TestsFor/SkipAll.pm index f46cf92..c79cc29 100644 --- a/t/skiplib/TestsFor/SkipAll.pm +++ b/t/skiplib/TestsFor/SkipAll.pm @@ -29,6 +29,30 @@ sub test_this_baby { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::SkipAll'; + }; + event Subtest => sub { + call name => 'TestsFor::SkipAll'; + call pass => T(); + call subevents => array { + filter_items { + grep { + !$_->isa('Test2::AsyncSubtest::Event::Attach') + && !$_->isa('Test2::AsyncSubtest::Event::Detach') + } @_; + }; + event Plan => sub { + call directive => 'SKIP'; + call reason => 'all methods should be skipped'; + call max => 0; + }; + end(); + }; + }; +} + +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::SkipAll'; call pass => T(); diff --git a/t/skiplib/TestsFor/SkipSomeMethods.pm b/t/skiplib/TestsFor/SkipSomeMethods.pm index 2954441..beb20ac 100644 --- a/t/skiplib/TestsFor/SkipSomeMethods.pm +++ b/t/skiplib/TestsFor/SkipSomeMethods.pm @@ -33,6 +33,84 @@ sub test_this_baby { sub test_again { ok 1, 'in test_again' } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::SkipSomeMethods'; + }; + event Subtest => sub { + call name => 'TestsFor::SkipSomeMethods'; + call pass => T(); + call subevents => array { + filter_items { + grep { + !$_->isa('Test2::AsyncSubtest::Event::Attach') + && !$_->isa('Test2::AsyncSubtest::Event::Detach') + } @_; + }; + event Plan => sub { + call max => 3; + }; + event Note => sub { + call message => 'test_again'; + }; + event Subtest => sub { + call name => 'test_again'; + call pass => T(); + call subevents => array { + event Ok => sub { + call name => 'in test_again'; + call pass => T(); + }; + event Plan => sub { + call max => 1; + }; + end(); + }; + }; + event Diag => sub { + call message => 'in teardown'; + }; + event Note => sub { + call message => 'test_me'; + }; + event Subtest => sub { + call name => 'test_me'; + call pass => T(); + call subevents => array { + event Plan => sub { + call directive => 'SKIP'; + call reason => + 'only methods listed as skipped should be skipped'; + call max => 0; + }; + end(); + }; + }; + event Note => sub { + call message => 'test_this_baby'; + }; + event Subtest => sub { + call name => 'test_this_baby'; + call pass => T(); + call subevents => array { + event Ok => sub { + call name => 'whee! (TestsFor::SkipSomeMethods)'; + call pass => T(); + }; + event Plan => sub { + call max => 1; + }; + end(); + }; + }; + event Diag => sub { + call message => 'in teardown'; + }; + end(); + }; + }; +} + +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::SkipSomeMethods'; call pass => T(); diff --git a/t/test_control_methods.t b/t/test_control_methods.t index 05d7c2d..eab3719 100644 --- a/t/test_control_methods.t +++ b/t/test_control_methods.t @@ -47,6 +47,9 @@ subtest_streamed( call max => 2; }; TestsFor::Basic->expected_test_events; + event Note => sub { + call message => 'TestsFor::Basic::Subclass'; + }; event Subtest => sub { call name => 'TestsFor::Basic::Subclass'; call pass => F(); @@ -95,6 +98,9 @@ subtest_streamed( call max => 2; }; TestsFor::Basic->expected_test_events; + event Note => sub { + call message => 'TestsFor::Basic::Subclass'; + }; event Subtest => sub { call name => 'TestsFor::Basic::Subclass'; call pass => F(); diff --git a/t/todolib/TestsFor/Todo.pm b/t/todolib/TestsFor/Todo.pm index 7e6dc1a..1e6ad23 100644 --- a/t/todolib/TestsFor/Todo.pm +++ b/t/todolib/TestsFor/Todo.pm @@ -47,6 +47,122 @@ sub test_todo_die2 { } sub expected_test_events { + event Note => sub { + call message => 'TestsFor::Todo'; + }; + event Subtest => sub { + call name => 'TestsFor::Todo'; + call pass => F(); + call effective_pass => F(); + + call subevents => array { + filter_items { + grep { + !$_->isa('Test2::AsyncSubtest::Event::Attach') + && !$_->isa('Test2::AsyncSubtest::Event::Detach') + } @_; + }; + + event Plan => sub { + call max => 3; + }; + + event Note => sub { + call message => 'test_todo'; + }; + event Subtest => sub { + call name => 'test_todo'; + call pass => T(); + call effective_pass => T(); + + call subevents => array { + event Ok => sub { + call name => 'pre-todo'; + call pass => T(); + call effective_pass => T(); + }; + + event Ok => sub { + call name => 'in todo'; + call pass => F(); + call effective_pass => T(); + }; + + event Note => sub { + call message => match qr{^\n?Failed test}; + }; + + event Ok => sub { + call name => 'post-todo'; + call pass => T(); + call effective_pass => T(); + }; + + event Plan => sub { + call max => 3; + }; + end(); + }; + }; + + event Note => sub { + call message => 'test_todo_die1'; + }; + event Subtest => sub { + call name => 'test_todo_die1'; + call pass => F(); + call effective_pass => F(); + + call subevents => array { + event Ok => sub { + call name => 'pre-todo'; + call pass => T(); + call effective_pass => T(); + }; + end(); + }; + }; + + event Diag => sub { + call message => match qr{^\n?Failed test}; + }; + + event Diag => sub { + call message => match qr/in todo at .+/; + }; + + event Note => sub { + call message => 'test_todo_die2'; + }; + event Subtest => sub { + call name => 'test_todo_die2'; + call pass => F(); + call effective_pass => F(); + + call subevents => array { + event Ok => sub { + call name => 'pre-todo'; + call pass => T(); + call effective_pass => T(); + }; + end(); + }; + }; + + event Diag => sub { + call message => match qr{^\n?Failed test}; + }; + + event Diag => sub { + call message => match qr/in todo at .+/; + }; + + end(); + }; + }; +} + +sub expected_parallel_test_events { event Subtest => sub { call name => 'TestsFor::Todo'; call pass => F();