xref: /openbsd-src/gnu/usr.bin/perl/cpan/Test-Simple/t/Test2/modules/Hub.t (revision 5759b3d249badf144a6240f7eec4dcf9df003e6b)
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