1#!/usr/bin/perl -wT 2 3use strict; 4use warnings; 5use lib 't/lib'; 6 7use Test::More tests => 38; 8 9use TAP::Base; 10 11{ 12 13 # No callbacks allowed 14 can_ok 'TAP::Base', 'new'; 15 my $base = TAP::Base->new(); 16 isa_ok $base, 'TAP::Base', 'object of correct type'; 17 for my $method (qw(callback _croak _callback_for _initialize)) { 18 can_ok $base, $method; 19 } 20 21 eval { 22 $base->callback( 23 some_event => sub { 24 25 # do nothing 26 } 27 ); 28 }; 29 like( $@, qr/No callbacks/, 'no callbacks allowed croaks OK' ); 30 my $cb = $base->_callback_for('some_event'); 31 ok( !$cb, 'no callback installed' ); 32} 33 34{ 35 36 # No callbacks allowed, constructor should croak 37 eval { 38 my $base = TAP::Base->new( 39 { callbacks => { 40 some_event => sub { 41 42 # do nothing 43 } 44 } 45 } 46 ); 47 }; 48 like( 49 $@, qr/No callbacks/, 50 'no callbacks in constructor croaks OK' 51 ); 52} 53 54package CallbackOK; 55 56use TAP::Base; 57use base 'TAP::Base'; 58 59sub _initialize { 60 my $self = shift; 61 my $args = shift; 62 $self->SUPER::_initialize( $args, [qw( nice_event other_event )] ); 63 return $self; 64} 65 66package main; 67{ 68 my $base = CallbackOK->new(); 69 isa_ok $base, 'TAP::Base'; 70 71 eval { 72 $base->callback( 73 some_event => sub { 74 75 # do nothing 76 } 77 ); 78 }; 79 like( $@, qr/Callback some_event/, 'illegal callback croaks OK' ); 80 81 my ( $nice, $other ) = ( 0, 0 ); 82 83 eval { 84 $base->callback( other_event => sub { $other-- } ); 85 $base->callback( nice_event => sub { $nice++; return shift() . 'OK' } 86 ); 87 }; 88 89 ok( !$@, 'callbacks installed OK' ); 90 91 my $nice_cbs = $base->_callback_for('nice_event'); 92 is( ref $nice_cbs, 'ARRAY', 'callbacks type ok' ); 93 is( scalar @$nice_cbs, 1, 'right number of callbacks' ); 94 my $nice_cb = $nice_cbs->[0]; 95 ok( ref $nice_cb eq 'CODE', 'callback for nice_event returned' ); 96 my $got = $nice_cb->('Is '); 97 is( $got, 'Is OK', 'args passed to callback' ); 98 cmp_ok( $nice, '==', 1, 'callback calls the right sub' ); 99 100 my $other_cbs = $base->_callback_for('other_event'); 101 is( ref $other_cbs, 'ARRAY', 'callbacks type ok' ); 102 is( scalar @$other_cbs, 1, 'right number of callbacks' ); 103 my $other_cb = $other_cbs->[0]; 104 ok( ref $other_cb eq 'CODE', 'callback for other_event returned' ); 105 $other_cb->(); 106 cmp_ok( $other, '==', -1, 'callback calls the right sub' ); 107 108 my @got = $base->_make_callback( 'nice_event', 'I am ' ); 109 is( scalar @got, 1, 'right number of results' ); 110 is( $got[0], 'I am OK', 'callback via _make_callback works' ); 111} 112 113{ 114 my ( $nice, $other ) = ( 0, 0 ); 115 116 my $base = CallbackOK->new( 117 { callbacks => { 118 nice_event => sub { $nice++ } 119 } 120 } 121 ); 122 123 isa_ok $base, 'TAP::Base', 'object creation with callback succeeds'; 124 125 eval { 126 $base->callback( 127 some_event => sub { 128 129 # do nothing 130 } 131 ); 132 }; 133 like( $@, qr/Callback some_event/, 'illegal callback croaks OK' ); 134 135 eval { 136 $base->callback( other_event => sub { $other-- } ); 137 }; 138 139 ok( !$@, 'callback installed OK' ); 140 141 my $nice_cbs = $base->_callback_for('nice_event'); 142 is( ref $nice_cbs, 'ARRAY', 'callbacks type ok' ); 143 is( scalar @$nice_cbs, 1, 'right number of callbacks' ); 144 my $nice_cb = $nice_cbs->[0]; 145 ok( ref $nice_cb eq 'CODE', 'callback for nice_event returned' ); 146 $nice_cb->(); 147 cmp_ok( $nice, '==', 1, 'callback calls the right sub' ); 148 149 my $other_cbs = $base->_callback_for('other_event'); 150 is( ref $other_cbs, 'ARRAY', 'callbacks type ok' ); 151 is( scalar @$other_cbs, 1, 'right number of callbacks' ); 152 my $other_cb = $other_cbs->[0]; 153 ok( ref $other_cb eq 'CODE', 'callback for other_event returned' ); 154 $other_cb->(); 155 cmp_ok( $other, '==', -1, 'callback calls the right sub' ); 156 157 # my @got = $base->_make_callback( 'nice_event', 'I am ' ); 158 # is ( scalar @got, 1, 'right number of results' ); 159 # is( $got[0], 'I am OK', 'callback via _make_callback works' ); 160 161 my $status = undef; 162 163 # Stack another callback 164 $base->callback( other_event => sub { $status = 'OK'; return 'Aye' } ); 165 166 my $new_cbs = $base->_callback_for('other_event'); 167 is( ref $new_cbs, 'ARRAY', 'callbacks type ok' ); 168 is( scalar @$new_cbs, 2, 'right number of callbacks' ); 169 my $new_cb = $new_cbs->[1]; 170 ok( ref $new_cb eq 'CODE', 'callback for new_event returned' ); 171 my @got = $new_cb->(); 172 is( $status, 'OK', 'new callback called OK' ); 173} 174