1*5759b3d2Safresh1use strict; 2*5759b3d2Safresh1use warnings; 3*5759b3d2Safresh1 4*5759b3d2Safresh1use Test2::IPC; 5*5759b3d2Safresh1use Test2::Tools::Tiny; 6*5759b3d2Safresh1use Test2::API qw/context test2_ipc_drivers/; 7*5759b3d2Safresh1use Test2::Util qw/CAN_FORK CAN_THREAD CAN_REALLY_FORK/; 8*5759b3d2Safresh1 9*5759b3d2Safresh1{ 10*5759b3d2Safresh1 package My::Formatter; 11*5759b3d2Safresh1 12*5759b3d2Safresh1 sub new { bless [], shift }; 13*5759b3d2Safresh1 14*5759b3d2Safresh1 my $check = 1; 15*5759b3d2Safresh1 sub write { 16*5759b3d2Safresh1 my $self = shift; 17*5759b3d2Safresh1 my ($e, $count) = @_; 18*5759b3d2Safresh1 push @$self => $e; 19*5759b3d2Safresh1 } 20*5759b3d2Safresh1} 21*5759b3d2Safresh1 22*5759b3d2Safresh1{ 23*5759b3d2Safresh1 package My::Event; 24*5759b3d2Safresh1 25*5759b3d2Safresh1 use base 'Test2::Event'; 26*5759b3d2Safresh1 use Test2::Util::HashBase qw{msg}; 27*5759b3d2Safresh1} 28*5759b3d2Safresh1 29*5759b3d2Safresh1tests basic => sub { 30*5759b3d2Safresh1 my $hub = Test2::Hub->new( 31*5759b3d2Safresh1 formatter => My::Formatter->new, 32*5759b3d2Safresh1 ); 33*5759b3d2Safresh1 34*5759b3d2Safresh1 my $send_event = sub { 35*5759b3d2Safresh1 my ($msg) = @_; 36*5759b3d2Safresh1 my $e = My::Event->new(msg => $msg, trace => Test2::EventFacet::Trace->new(frame => ['fake', 'fake.t', 1])); 37*5759b3d2Safresh1 $hub->send($e); 38*5759b3d2Safresh1 }; 39*5759b3d2Safresh1 40*5759b3d2Safresh1 ok(my $e1 = $send_event->('foo'), "Created event"); 41*5759b3d2Safresh1 ok(my $e2 = $send_event->('bar'), "Created event"); 42*5759b3d2Safresh1 ok(my $e3 = $send_event->('baz'), "Created event"); 43*5759b3d2Safresh1 44*5759b3d2Safresh1 my $old = $hub->format(My::Formatter->new); 45*5759b3d2Safresh1 46*5759b3d2Safresh1 ok($old->isa('My::Formatter'), "old formatter"); 47*5759b3d2Safresh1 is_deeply( 48*5759b3d2Safresh1 $old, 49*5759b3d2Safresh1 [$e1, $e2, $e3], 50*5759b3d2Safresh1 "Formatter got all events" 51*5759b3d2Safresh1 ); 52*5759b3d2Safresh1}; 53*5759b3d2Safresh1 54*5759b3d2Safresh1tests follow_ups => sub { 55*5759b3d2Safresh1 my $hub = Test2::Hub->new; 56*5759b3d2Safresh1 $hub->set_count(1); 57*5759b3d2Safresh1 58*5759b3d2Safresh1 my $trace = Test2::EventFacet::Trace->new( 59*5759b3d2Safresh1 frame => [__PACKAGE__, __FILE__, __LINE__], 60*5759b3d2Safresh1 ); 61*5759b3d2Safresh1 62*5759b3d2Safresh1 my $ran = 0; 63*5759b3d2Safresh1 $hub->follow_up(sub { 64*5759b3d2Safresh1 my ($d, $h) = @_; 65*5759b3d2Safresh1 is_deeply($d, $trace, "Got trace"); 66*5759b3d2Safresh1 is_deeply($h, $hub, "Got hub"); 67*5759b3d2Safresh1 ok(!$hub->ended, "Hub state has not ended yet"); 68*5759b3d2Safresh1 $ran++; 69*5759b3d2Safresh1 }); 70*5759b3d2Safresh1 71*5759b3d2Safresh1 like( 72*5759b3d2Safresh1 exception { $hub->follow_up('xxx') }, 73*5759b3d2Safresh1 qr/follow_up only takes coderefs for arguments, got 'xxx'/, 74*5759b3d2Safresh1 "follow_up takes a coderef" 75*5759b3d2Safresh1 ); 76*5759b3d2Safresh1 77*5759b3d2Safresh1 $hub->finalize($trace); 78*5759b3d2Safresh1 79*5759b3d2Safresh1 is($ran, 1, "ran once"); 80*5759b3d2Safresh1 81*5759b3d2Safresh1 is_deeply( 82*5759b3d2Safresh1 $hub->ended, 83*5759b3d2Safresh1 $trace->frame, 84*5759b3d2Safresh1 "Ended at the expected place." 85*5759b3d2Safresh1 ); 86*5759b3d2Safresh1 87*5759b3d2Safresh1 eval { $hub->finalize($trace) }; 88*5759b3d2Safresh1 89*5759b3d2Safresh1 is($ran, 1, "ran once"); 90*5759b3d2Safresh1 91*5759b3d2Safresh1 $hub = undef; 92*5759b3d2Safresh1}; 93*5759b3d2Safresh1 94*5759b3d2Safresh1tests IPC => sub { 95*5759b3d2Safresh1 my ($driver) = test2_ipc_drivers(); 96*5759b3d2Safresh1 is($driver, 'Test2::IPC::Driver::Files', "Default Driver"); 97*5759b3d2Safresh1 my $ipc = $driver->new; 98*5759b3d2Safresh1 my $hub = Test2::Hub->new( 99*5759b3d2Safresh1 formatter => My::Formatter->new, 100*5759b3d2Safresh1 ipc => $ipc, 101*5759b3d2Safresh1 ); 102*5759b3d2Safresh1 103*5759b3d2Safresh1 my $build_event = sub { 104*5759b3d2Safresh1 my ($msg) = @_; 105*5759b3d2Safresh1 return My::Event->new(msg => $msg, trace => Test2::EventFacet::Trace->new(frame => ['fake', 'fake.t', 1])); 106*5759b3d2Safresh1 }; 107*5759b3d2Safresh1 108*5759b3d2Safresh1 my $e1 = $build_event->('foo'); 109*5759b3d2Safresh1 my $e2 = $build_event->('bar'); 110*5759b3d2Safresh1 my $e3 = $build_event->('baz'); 111*5759b3d2Safresh1 112*5759b3d2Safresh1 my $do_send = sub { 113*5759b3d2Safresh1 $hub->send($e1); 114*5759b3d2Safresh1 $hub->send($e2); 115*5759b3d2Safresh1 $hub->send($e3); 116*5759b3d2Safresh1 }; 117*5759b3d2Safresh1 118*5759b3d2Safresh1 my $do_check = sub { 119*5759b3d2Safresh1 my $name = shift; 120*5759b3d2Safresh1 121*5759b3d2Safresh1 my $old = $hub->format(My::Formatter->new); 122*5759b3d2Safresh1 123*5759b3d2Safresh1 ok($old->isa('My::Formatter'), "old formatter"); 124*5759b3d2Safresh1 is(@$old, 3, "Formatter got all events ($name)"); 125*5759b3d2Safresh1 ok($_->{hubs}, "Set the hubs") for @$old; 126*5759b3d2Safresh1 }; 127*5759b3d2Safresh1 128*5759b3d2Safresh1 if (CAN_REALLY_FORK) { 129*5759b3d2Safresh1 my $pid = fork(); 130*5759b3d2Safresh1 die "Could not fork!" unless defined $pid; 131*5759b3d2Safresh1 132*5759b3d2Safresh1 if ($pid) { 133*5759b3d2Safresh1 is(waitpid($pid, 0), $pid, "waited properly"); 134*5759b3d2Safresh1 ok(!$?, "child exited with success"); 135*5759b3d2Safresh1 $hub->cull(); 136*5759b3d2Safresh1 $do_check->('Fork'); 137*5759b3d2Safresh1 } 138*5759b3d2Safresh1 else { 139*5759b3d2Safresh1 $do_send->(); 140*5759b3d2Safresh1 exit 0; 141*5759b3d2Safresh1 } 142*5759b3d2Safresh1 } 143*5759b3d2Safresh1 144*5759b3d2Safresh1 if (CAN_THREAD && $] ge '5.010') { 145*5759b3d2Safresh1 require threads; 146*5759b3d2Safresh1 my $thr = threads->new(sub { $do_send->() }); 147*5759b3d2Safresh1 $thr->join; 148*5759b3d2Safresh1 $hub->cull(); 149*5759b3d2Safresh1 $do_check->('Threads'); 150*5759b3d2Safresh1 } 151*5759b3d2Safresh1 152*5759b3d2Safresh1 $do_send->(); 153*5759b3d2Safresh1 $hub->cull(); 154*5759b3d2Safresh1 $do_check->('no IPC'); 155*5759b3d2Safresh1}; 156*5759b3d2Safresh1 157*5759b3d2Safresh1tests listen => sub { 158*5759b3d2Safresh1 my $hub = Test2::Hub->new(); 159*5759b3d2Safresh1 160*5759b3d2Safresh1 my @events; 161*5759b3d2Safresh1 my @counts; 162*5759b3d2Safresh1 my $it = $hub->listen(sub { 163*5759b3d2Safresh1 my ($h, $e, $count) = @_; 164*5759b3d2Safresh1 is_deeply($h, $hub, "got hub"); 165*5759b3d2Safresh1 push @events => $e; 166*5759b3d2Safresh1 push @counts => $count; 167*5759b3d2Safresh1 }); 168*5759b3d2Safresh1 169*5759b3d2Safresh1 my $second; 170*5759b3d2Safresh1 my $it2 = $hub->listen(sub { $second++ }); 171*5759b3d2Safresh1 172*5759b3d2Safresh1 my $ok1 = Test2::Event::Ok->new( 173*5759b3d2Safresh1 pass => 1, 174*5759b3d2Safresh1 name => 'foo', 175*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 176*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 177*5759b3d2Safresh1 ), 178*5759b3d2Safresh1 ); 179*5759b3d2Safresh1 180*5759b3d2Safresh1 my $ok2 = Test2::Event::Ok->new( 181*5759b3d2Safresh1 pass => 0, 182*5759b3d2Safresh1 name => 'bar', 183*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 184*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 185*5759b3d2Safresh1 ), 186*5759b3d2Safresh1 ); 187*5759b3d2Safresh1 188*5759b3d2Safresh1 my $ok3 = Test2::Event::Ok->new( 189*5759b3d2Safresh1 pass => 1, 190*5759b3d2Safresh1 name => 'baz', 191*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 192*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 193*5759b3d2Safresh1 ), 194*5759b3d2Safresh1 ); 195*5759b3d2Safresh1 196*5759b3d2Safresh1 $hub->send($ok1); 197*5759b3d2Safresh1 $hub->send($ok2); 198*5759b3d2Safresh1 199*5759b3d2Safresh1 $hub->unlisten($it); 200*5759b3d2Safresh1 201*5759b3d2Safresh1 $hub->send($ok3); 202*5759b3d2Safresh1 203*5759b3d2Safresh1 is_deeply(\@counts, [1, 2], "Got counts"); 204*5759b3d2Safresh1 is_deeply(\@events, [$ok1, $ok2], "got events"); 205*5759b3d2Safresh1 is($second, 3, "got all events in listener that was not removed"); 206*5759b3d2Safresh1 207*5759b3d2Safresh1 like( 208*5759b3d2Safresh1 exception { $hub->listen('xxx') }, 209*5759b3d2Safresh1 qr/listen only takes coderefs for arguments, got 'xxx'/, 210*5759b3d2Safresh1 "listen takes a coderef" 211*5759b3d2Safresh1 ); 212*5759b3d2Safresh1}; 213*5759b3d2Safresh1 214*5759b3d2Safresh1tests metadata => sub { 215*5759b3d2Safresh1 my $hub = Test2::Hub->new(); 216*5759b3d2Safresh1 217*5759b3d2Safresh1 my $default = { foo => 1 }; 218*5759b3d2Safresh1 my $meta = $hub->meta('Foo', $default); 219*5759b3d2Safresh1 is_deeply($meta, $default, "Set Meta"); 220*5759b3d2Safresh1 221*5759b3d2Safresh1 $meta = $hub->meta('Foo', {}); 222*5759b3d2Safresh1 is_deeply($meta, $default, "Same Meta"); 223*5759b3d2Safresh1 224*5759b3d2Safresh1 $hub->delete_meta('Foo'); 225*5759b3d2Safresh1 is($hub->meta('Foo'), undef, "No Meta"); 226*5759b3d2Safresh1 227*5759b3d2Safresh1 $hub->meta('Foo', {})->{xxx} = 1; 228*5759b3d2Safresh1 is($hub->meta('Foo')->{xxx}, 1, "Vivified meta and set it"); 229*5759b3d2Safresh1 230*5759b3d2Safresh1 like( 231*5759b3d2Safresh1 exception { $hub->meta(undef) }, 232*5759b3d2Safresh1 qr/Invalid META key: undef, keys must be true, and may not be references/, 233*5759b3d2Safresh1 "Cannot use undef as a meta key" 234*5759b3d2Safresh1 ); 235*5759b3d2Safresh1 236*5759b3d2Safresh1 like( 237*5759b3d2Safresh1 exception { $hub->meta(0) }, 238*5759b3d2Safresh1 qr/Invalid META key: '0', keys must be true, and may not be references/, 239*5759b3d2Safresh1 "Cannot use 0 as a meta key" 240*5759b3d2Safresh1 ); 241*5759b3d2Safresh1 242*5759b3d2Safresh1 like( 243*5759b3d2Safresh1 exception { $hub->delete_meta(undef) }, 244*5759b3d2Safresh1 qr/Invalid META key: undef, keys must be true, and may not be references/, 245*5759b3d2Safresh1 "Cannot use undef as a meta key" 246*5759b3d2Safresh1 ); 247*5759b3d2Safresh1 248*5759b3d2Safresh1 like( 249*5759b3d2Safresh1 exception { $hub->delete_meta(0) }, 250*5759b3d2Safresh1 qr/Invalid META key: '0', keys must be true, and may not be references/, 251*5759b3d2Safresh1 "Cannot use 0 as a meta key" 252*5759b3d2Safresh1 ); 253*5759b3d2Safresh1}; 254*5759b3d2Safresh1 255*5759b3d2Safresh1tests filter => sub { 256*5759b3d2Safresh1 my $hub = Test2::Hub->new(); 257*5759b3d2Safresh1 258*5759b3d2Safresh1 my @events; 259*5759b3d2Safresh1 my $it = $hub->filter(sub { 260*5759b3d2Safresh1 my ($h, $e) = @_; 261*5759b3d2Safresh1 is($h, $hub, "got hub"); 262*5759b3d2Safresh1 push @events => $e; 263*5759b3d2Safresh1 return $e; 264*5759b3d2Safresh1 }); 265*5759b3d2Safresh1 266*5759b3d2Safresh1 my $count; 267*5759b3d2Safresh1 my $it2 = $hub->filter(sub { $count++; $_[1] }); 268*5759b3d2Safresh1 269*5759b3d2Safresh1 my $ok1 = Test2::Event::Ok->new( 270*5759b3d2Safresh1 pass => 1, 271*5759b3d2Safresh1 name => 'foo', 272*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 273*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 274*5759b3d2Safresh1 ), 275*5759b3d2Safresh1 ); 276*5759b3d2Safresh1 277*5759b3d2Safresh1 my $ok2 = Test2::Event::Ok->new( 278*5759b3d2Safresh1 pass => 0, 279*5759b3d2Safresh1 name => 'bar', 280*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 281*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 282*5759b3d2Safresh1 ), 283*5759b3d2Safresh1 ); 284*5759b3d2Safresh1 285*5759b3d2Safresh1 my $ok3 = Test2::Event::Ok->new( 286*5759b3d2Safresh1 pass => 1, 287*5759b3d2Safresh1 name => 'baz', 288*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 289*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 290*5759b3d2Safresh1 ), 291*5759b3d2Safresh1 ); 292*5759b3d2Safresh1 293*5759b3d2Safresh1 $hub->send($ok1); 294*5759b3d2Safresh1 $hub->send($ok2); 295*5759b3d2Safresh1 296*5759b3d2Safresh1 $hub->unfilter($it); 297*5759b3d2Safresh1 298*5759b3d2Safresh1 $hub->send($ok3); 299*5759b3d2Safresh1 300*5759b3d2Safresh1 is_deeply(\@events, [$ok1, $ok2], "got events"); 301*5759b3d2Safresh1 is($count, 3, "got all events, even after other filter was removed"); 302*5759b3d2Safresh1 303*5759b3d2Safresh1 $hub = Test2::Hub->new(); 304*5759b3d2Safresh1 @events = (); 305*5759b3d2Safresh1 306*5759b3d2Safresh1 $hub->filter(sub { undef }); 307*5759b3d2Safresh1 $hub->listen(sub { 308*5759b3d2Safresh1 my ($hub, $e) = @_; 309*5759b3d2Safresh1 push @events => $e; 310*5759b3d2Safresh1 }); 311*5759b3d2Safresh1 312*5759b3d2Safresh1 $hub->send($ok1); 313*5759b3d2Safresh1 $hub->send($ok2); 314*5759b3d2Safresh1 $hub->send($ok3); 315*5759b3d2Safresh1 316*5759b3d2Safresh1 ok(!@events, "Blocked events"); 317*5759b3d2Safresh1 318*5759b3d2Safresh1 like( 319*5759b3d2Safresh1 exception { $hub->filter('xxx') }, 320*5759b3d2Safresh1 qr/filter only takes coderefs for arguments, got 'xxx'/, 321*5759b3d2Safresh1 "filter takes a coderef" 322*5759b3d2Safresh1 ); 323*5759b3d2Safresh1}; 324*5759b3d2Safresh1 325*5759b3d2Safresh1tests pre_filter => sub { 326*5759b3d2Safresh1 my $hub = Test2::Hub->new(); 327*5759b3d2Safresh1 328*5759b3d2Safresh1 my @events; 329*5759b3d2Safresh1 my $it = $hub->pre_filter(sub { 330*5759b3d2Safresh1 my ($h, $e) = @_; 331*5759b3d2Safresh1 is($h, $hub, "got hub"); 332*5759b3d2Safresh1 push @events => $e; 333*5759b3d2Safresh1 return $e; 334*5759b3d2Safresh1 }); 335*5759b3d2Safresh1 336*5759b3d2Safresh1 my $count; 337*5759b3d2Safresh1 my $it2 = $hub->pre_filter(sub { $count++; $_[1] }); 338*5759b3d2Safresh1 339*5759b3d2Safresh1 my $ok1 = Test2::Event::Ok->new( 340*5759b3d2Safresh1 pass => 1, 341*5759b3d2Safresh1 name => 'foo', 342*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 343*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 344*5759b3d2Safresh1 ), 345*5759b3d2Safresh1 ); 346*5759b3d2Safresh1 347*5759b3d2Safresh1 my $ok2 = Test2::Event::Ok->new( 348*5759b3d2Safresh1 pass => 0, 349*5759b3d2Safresh1 name => 'bar', 350*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 351*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 352*5759b3d2Safresh1 ), 353*5759b3d2Safresh1 ); 354*5759b3d2Safresh1 355*5759b3d2Safresh1 my $ok3 = Test2::Event::Ok->new( 356*5759b3d2Safresh1 pass => 1, 357*5759b3d2Safresh1 name => 'baz', 358*5759b3d2Safresh1 trace => Test2::EventFacet::Trace->new( 359*5759b3d2Safresh1 frame => [ __PACKAGE__, __FILE__, __LINE__ ], 360*5759b3d2Safresh1 ), 361*5759b3d2Safresh1 ); 362*5759b3d2Safresh1 363*5759b3d2Safresh1 $hub->send($ok1); 364*5759b3d2Safresh1 $hub->send($ok2); 365*5759b3d2Safresh1 366*5759b3d2Safresh1 $hub->pre_unfilter($it); 367*5759b3d2Safresh1 368*5759b3d2Safresh1 $hub->send($ok3); 369*5759b3d2Safresh1 370*5759b3d2Safresh1 is_deeply(\@events, [$ok1, $ok2], "got events"); 371*5759b3d2Safresh1 is($count, 3, "got all events, even after other pre_filter was removed"); 372*5759b3d2Safresh1 373*5759b3d2Safresh1 $hub = Test2::Hub->new(); 374*5759b3d2Safresh1 @events = (); 375*5759b3d2Safresh1 376*5759b3d2Safresh1 $hub->pre_filter(sub { undef }); 377*5759b3d2Safresh1 $hub->listen(sub { 378*5759b3d2Safresh1 my ($hub, $e) = @_; 379*5759b3d2Safresh1 push @events => $e; 380*5759b3d2Safresh1 }); 381*5759b3d2Safresh1 382*5759b3d2Safresh1 $hub->send($ok1); 383*5759b3d2Safresh1 $hub->send($ok2); 384*5759b3d2Safresh1 $hub->send($ok3); 385*5759b3d2Safresh1 386*5759b3d2Safresh1 ok(!@events, "Blocked events"); 387*5759b3d2Safresh1 388*5759b3d2Safresh1 like( 389*5759b3d2Safresh1 exception { $hub->pre_filter('xxx') }, 390*5759b3d2Safresh1 qr/pre_filter only takes coderefs for arguments, got 'xxx'/, 391*5759b3d2Safresh1 "pre_filter takes a coderef" 392*5759b3d2Safresh1 ); 393*5759b3d2Safresh1}; 394*5759b3d2Safresh1 395*5759b3d2Safresh1tests state => sub { 396*5759b3d2Safresh1 my $hub = Test2::Hub->new; 397*5759b3d2Safresh1 398*5759b3d2Safresh1 is($hub->count, 0, "count starts at 0"); 399*5759b3d2Safresh1 is($hub->failed, 0, "failed starts at 0"); 400*5759b3d2Safresh1 is($hub->is_passing, 1, "start off passing"); 401*5759b3d2Safresh1 is($hub->plan, undef, "no plan yet"); 402*5759b3d2Safresh1 403*5759b3d2Safresh1 $hub->is_passing(0); 404*5759b3d2Safresh1 is($hub->is_passing, 0, "Can Fail"); 405*5759b3d2Safresh1 406*5759b3d2Safresh1 $hub->is_passing(1); 407*5759b3d2Safresh1 is($hub->is_passing, 1, "Passes again"); 408*5759b3d2Safresh1 409*5759b3d2Safresh1 $hub->set_count(1); 410*5759b3d2Safresh1 is($hub->count, 1, "Added a passing result"); 411*5759b3d2Safresh1 is($hub->failed, 0, "still no fails"); 412*5759b3d2Safresh1 is($hub->is_passing, 1, "Still passing"); 413*5759b3d2Safresh1 414*5759b3d2Safresh1 $hub->set_count(2); 415*5759b3d2Safresh1 $hub->set_failed(1); 416*5759b3d2Safresh1 is($hub->count, 2, "Added a result"); 417*5759b3d2Safresh1 is($hub->failed, 1, "new failure"); 418*5759b3d2Safresh1 is($hub->is_passing, 0, "Not passing"); 419*5759b3d2Safresh1 420*5759b3d2Safresh1 $hub->is_passing(1); 421*5759b3d2Safresh1 is($hub->is_passing, 0, "is_passing always false after a failure"); 422*5759b3d2Safresh1 423*5759b3d2Safresh1 $hub->set_failed(0); 424*5759b3d2Safresh1 $hub->is_passing(1); 425*5759b3d2Safresh1 is($hub->is_passing, 1, "Passes again"); 426*5759b3d2Safresh1 427*5759b3d2Safresh1 $hub->set_failed(1); 428*5759b3d2Safresh1 is($hub->count, 2, "No new result"); 429*5759b3d2Safresh1 is($hub->failed, 1, "new failure"); 430*5759b3d2Safresh1 is($hub->is_passing, 0, "Not passing"); 431*5759b3d2Safresh1 432*5759b3d2Safresh1 ok(!eval { $hub->plan('foo'); 1 }, "Could not set plan to 'foo'"); 433*5759b3d2Safresh1 like($@, qr/'foo' is not a valid plan! Plan must be an integer greater than 0, 'NO PLAN', or 'SKIP'/, "Got expected error"); 434*5759b3d2Safresh1 435*5759b3d2Safresh1 ok($hub->plan(5), "Can set plan to integer"); 436*5759b3d2Safresh1 is($hub->plan, 5, "Set the plan to an integer"); 437*5759b3d2Safresh1 438*5759b3d2Safresh1 $hub->set__plan(undef); 439*5759b3d2Safresh1 ok($hub->plan('NO PLAN'), "Can set plan to 'NO PLAN'"); 440*5759b3d2Safresh1 is($hub->plan, 'NO PLAN', "Set the plan to 'NO PLAN'"); 441*5759b3d2Safresh1 442*5759b3d2Safresh1 $hub->set__plan(undef); 443*5759b3d2Safresh1 ok($hub->plan('SKIP'), "Can set plan to 'SKIP'"); 444*5759b3d2Safresh1 is($hub->plan, 'SKIP', "Set the plan to 'SKIP'"); 445*5759b3d2Safresh1 446*5759b3d2Safresh1 ok(!eval { $hub->plan(5); 1 }, "Cannot change plan"); 447*5759b3d2Safresh1 like($@, qr/You cannot change the plan/, "Got error"); 448*5759b3d2Safresh1 449*5759b3d2Safresh1 my $trace = Test2::EventFacet::Trace->new(frame => ['Foo::Bar', 'foo.t', 42, 'blah']); 450*5759b3d2Safresh1 $hub->finalize($trace); 451*5759b3d2Safresh1 my $ok = eval { $hub->finalize($trace) }; 452*5759b3d2Safresh1 my $err = $@; 453*5759b3d2Safresh1 ok(!$ok, "died"); 454*5759b3d2Safresh1 455*5759b3d2Safresh1 is($err, <<" EOT", "Got expected error"); 456*5759b3d2Safresh1Test already ended! 457*5759b3d2Safresh1First End: foo.t line 42 458*5759b3d2Safresh1Second End: foo.t line 42 459*5759b3d2Safresh1 EOT 460*5759b3d2Safresh1 461*5759b3d2Safresh1 $hub = Test2::Hub->new; 462*5759b3d2Safresh1 463*5759b3d2Safresh1 $hub->plan(5); 464*5759b3d2Safresh1 $hub->set_count(5); 465*5759b3d2Safresh1 $hub->set_failed(1); 466*5759b3d2Safresh1 $hub->set_ended($trace); 467*5759b3d2Safresh1 $hub->set_bailed_out("foo"); 468*5759b3d2Safresh1 $hub->set_skip_reason('xxx'); 469*5759b3d2Safresh1 ok(!$hub->is_passing, "not passing"); 470*5759b3d2Safresh1 471*5759b3d2Safresh1 $hub->reset_state; 472*5759b3d2Safresh1 473*5759b3d2Safresh1 ok(!$hub->plan, "no plan"); 474*5759b3d2Safresh1 is($hub->count, 0, "count reset to 0"); 475*5759b3d2Safresh1 is($hub->failed, 0, "reset failures"); 476*5759b3d2Safresh1 ok(!$hub->ended, "not ended"); 477*5759b3d2Safresh1 ok(!$hub->bailed_out, "did not bail out"); 478*5759b3d2Safresh1 ok(!$hub->skip_reason, "no skip reason"); 479*5759b3d2Safresh1}; 480*5759b3d2Safresh1 481*5759b3d2Safresh1done_testing; 482