#!/usr/bin/perl -wT use strict; use lib 't/lib'; use Test::More tests => 227; use TAP::Parser::ResultFactory; use TAP::Parser::Result; use constant RESULT => 'TAP::Parser::Result'; use constant PLAN => 'TAP::Parser::Result::Plan'; use constant TEST => 'TAP::Parser::Result::Test'; use constant COMMENT => 'TAP::Parser::Result::Comment'; use constant BAILOUT => 'TAP::Parser::Result::Bailout'; use constant UNKNOWN => 'TAP::Parser::Result::Unknown'; my $warning; $SIG{__WARN__} = sub { $warning = shift }; # # Note that the are basic unit tests. More comprehensive path coverage is # found in the regression tests. # my $factory = TAP::Parser::ResultFactory->new; my %inherited_methods = ( is_plan => '', is_test => '', is_comment => '', is_bailout => '', is_unknown => '', is_ok => 1, ); my $abstract_class = bless { type => 'no_such_type' }, RESULT; # you didn't see this run_method_tests( $abstract_class, {} ); # check the defaults can_ok $abstract_class, 'type'; is $abstract_class->type, 'no_such_type', '... and &type should return the correct result'; can_ok $abstract_class, 'passed'; $warning = ''; ok $abstract_class->passed, '... and it should default to true'; like $warning, qr/^\Qpassed() is deprecated. Please use "is_ok()"/, '... but it should emit a deprecation warning'; can_ok RESULT, 'new'; can_ok $factory, 'make_result'; eval { $factory->make_result( { type => 'no_such_type' } ) }; ok my $error = $@, '... and calling it with an unknown class should fail'; like $error, qr/^Could not determine class for.*no_such_type/s, '... with an appropriate error message'; # register new Result types: can_ok $factory, 'class_for'; can_ok $factory, 'register_type'; { package MyResult; use strict; use vars qw($VERSION @ISA); @ISA = 'TAP::Parser::Result'; TAP::Parser::ResultFactory->register_type( 'my_type' => __PACKAGE__ ); } { my $r = eval { $factory->make_result( { type => 'my_type' } ) }; my $error = $@; isa_ok( $r, 'MyResult', 'register custom type' ); ok( !$error, '... and no error' ); } # # test unknown tokens # run_tests( { class => UNKNOWN, data => { type => 'unknown', raw => '... this line is junk ... ', }, }, { is_unknown => 1, raw => '... this line is junk ... ', as_string => '... this line is junk ... ', type => 'unknown', has_directive => '', } ); # # test comment tokens # run_tests( { class => COMMENT, data => { type => 'comment', raw => '# this is a comment', comment => 'this is a comment', }, }, { is_comment => 1, raw => '# this is a comment', as_string => '# this is a comment', comment => 'this is a comment', type => 'comment', has_directive => '', } ); # # test bailout tokens # run_tests( { class => BAILOUT, data => { type => 'bailout', raw => 'Bailout! This blows!', bailout => 'This blows!', }, }, { is_bailout => 1, raw => 'Bailout! This blows!', as_string => 'This blows!', type => 'bailout', has_directive => '', } ); # # test plan tokens # run_tests( { class => PLAN, data => { type => 'plan', raw => '1..20', tests_planned => 20, directive => '', explanation => '', }, }, { is_plan => 1, raw => '1..20', tests_planned => 20, directive => '', explanation => '', has_directive => '', } ); run_tests( { class => PLAN, data => { type => 'plan', raw => '1..0 # SKIP help me, Rhonda!', tests_planned => 0, directive => 'SKIP', explanation => 'help me, Rhonda!', }, }, { is_plan => 1, raw => '1..0 # SKIP help me, Rhonda!', tests_planned => 0, directive => 'SKIP', explanation => 'help me, Rhonda!', has_directive => 1, } ); # # test 'test' tokens # my $test = run_tests( { class => TEST, data => { ok => 'ok', test_num => 5, description => '... and this test is fine', directive => '', explanation => '', raw => 'ok 5 and this test is fine', type => 'test', }, }, { is_test => 1, type => 'test', ok => 'ok', number => 5, description => '... and this test is fine', directive => '', explanation => '', is_ok => 1, is_actual_ok => 1, todo_passed => '', has_skip => '', has_todo => '', as_string => 'ok 5 ... and this test is fine', is_unplanned => '', has_directive => '', } ); can_ok $test, 'actual_passed'; $warning = ''; is $test->actual_passed, $test->is_actual_ok, '... and it should return the correct value'; like $warning, qr/^\Qactual_passed() is deprecated. Please use "is_actual_ok()"/, '... but issue a deprecation warning'; can_ok $test, 'todo_failed'; $warning = ''; is $test->todo_failed, $test->todo_passed, '... and it should return the correct value'; like $warning, qr/^\Qtodo_failed() is deprecated. Please use "todo_passed()"/, '... but issue a deprecation warning'; # TODO directive $test = run_tests( { class => TEST, data => { ok => 'not ok', test_num => 5, description => '... and this test is fine', directive => 'TODO', explanation => 'why not?', raw => 'not ok 5 and this test is fine # TODO why not?', type => 'test', }, }, { is_test => 1, type => 'test', ok => 'not ok', number => 5, description => '... and this test is fine', directive => 'TODO', explanation => 'why not?', is_ok => 1, is_actual_ok => '', todo_passed => '', has_skip => '', has_todo => 1, as_string => 'not ok 5 ... and this test is fine # TODO why not?', is_unplanned => '', has_directive => 1, } ); sub run_tests { my ( $instantiated, $value_for ) = @_; my $result = instantiate($instantiated); run_method_tests( $result, $value_for ); return $result; } sub instantiate { my $instantiated = shift; my $class = $instantiated->{class}; ok my $result = $factory->make_result( $instantiated->{data} ), 'Creating $class results should succeed'; isa_ok $result, $class, '.. and the object it returns'; return $result; } sub run_method_tests { my ( $result, $value_for ) = @_; while ( my ( $method, $default ) = each %inherited_methods ) { can_ok $result, $method; if ( defined( my $value = delete $value_for->{$method} ) ) { is $result->$method(), $value, "... and $method should be correct"; } else { is $result->$method(), $default, "... and $method default should be correct"; } } while ( my ( $method, $value ) = each %$value_for ) { can_ok $result, $method; is $result->$method(), $value, "... and $method should be correct"; } }