1*5759b3d2Safresh1use strict;
2*5759b3d2Safresh1use warnings;
3*5759b3d2Safresh1use Test2::IPC;
4*5759b3d2Safresh1use Test2::Tools::Tiny;
5*5759b3d2Safresh1use Test2::API::Stack;
6*5759b3d2Safresh1use Test2::API qw/test2_ipc/;
7*5759b3d2Safresh1
8*5759b3d2Safresh1ok(my $stack = Test2::API::Stack->new, "Create a stack");
9*5759b3d2Safresh1
10*5759b3d2Safresh1ok(!@$stack, "Empty stack");
11*5759b3d2Safresh1ok(!$stack->peek, "Nothing to peek at");
12*5759b3d2Safresh1
13*5759b3d2Safresh1ok(!exception { $stack->cull },  "cull lives when stack is empty");
14*5759b3d2Safresh1ok(!exception { $stack->all },   "all lives when stack is empty");
15*5759b3d2Safresh1ok(!exception { $stack->clear }, "clear lives when stack is empty");
16*5759b3d2Safresh1
17*5759b3d2Safresh1like(
18*5759b3d2Safresh1    exception { $stack->pop(Test2::Hub->new) },
19*5759b3d2Safresh1    qr/No hubs on the stack/,
20*5759b3d2Safresh1    "No hub to pop"
21*5759b3d2Safresh1);
22*5759b3d2Safresh1
23*5759b3d2Safresh1my $hub = Test2::Hub->new;
24*5759b3d2Safresh1ok($stack->push($hub), "pushed a hub");
25*5759b3d2Safresh1
26*5759b3d2Safresh1like(
27*5759b3d2Safresh1    exception { $stack->pop($hub) },
28*5759b3d2Safresh1    qr/You cannot pop the root hub/,
29*5759b3d2Safresh1    "Root hub cannot be popped"
30*5759b3d2Safresh1);
31*5759b3d2Safresh1
32*5759b3d2Safresh1$stack->push($hub);
33*5759b3d2Safresh1like(
34*5759b3d2Safresh1    exception { $stack->pop(Test2::Hub->new) },
35*5759b3d2Safresh1    qr/Hub stack mismatch, attempted to pop incorrect hub/,
36*5759b3d2Safresh1    "Must specify correct hub to pop"
37*5759b3d2Safresh1);
38*5759b3d2Safresh1
39*5759b3d2Safresh1is_deeply(
40*5759b3d2Safresh1    [ $stack->all ],
41*5759b3d2Safresh1    [ $hub, $hub ],
42*5759b3d2Safresh1    "Got all hubs"
43*5759b3d2Safresh1);
44*5759b3d2Safresh1
45*5759b3d2Safresh1ok(!exception { $stack->pop($hub) }, "Popped the correct hub");
46*5759b3d2Safresh1
47*5759b3d2Safresh1is_deeply(
48*5759b3d2Safresh1    [ $stack->all ],
49*5759b3d2Safresh1    [ $hub ],
50*5759b3d2Safresh1    "Got all hubs"
51*5759b3d2Safresh1);
52*5759b3d2Safresh1
53*5759b3d2Safresh1is($stack->peek, $hub, "got the hub");
54*5759b3d2Safresh1is($stack->top, $hub, "got the hub");
55*5759b3d2Safresh1
56*5759b3d2Safresh1$stack->clear;
57*5759b3d2Safresh1
58*5759b3d2Safresh1is_deeply(
59*5759b3d2Safresh1    [ $stack->all ],
60*5759b3d2Safresh1    [ ],
61*5759b3d2Safresh1    "no hubs"
62*5759b3d2Safresh1);
63*5759b3d2Safresh1
64*5759b3d2Safresh1ok(my $top = $stack->top, "Generated a top hub");
65*5759b3d2Safresh1is($top->ipc, test2_ipc, "Used sync's ipc");
66*5759b3d2Safresh1ok($top->format, 'Got formatter');
67*5759b3d2Safresh1
68*5759b3d2Safresh1is($stack->top, $stack->top, "do not generate a new top if there is already a top");
69*5759b3d2Safresh1
70*5759b3d2Safresh1ok(my $new = $stack->new_hub(), "Add a new hub");
71*5759b3d2Safresh1is($stack->top, $new, "new one is on top");
72*5759b3d2Safresh1is($new->ipc, $top->ipc, "inherited ipc");
73*5759b3d2Safresh1is($new->format, $top->format, "inherited formatter");
74*5759b3d2Safresh1
75*5759b3d2Safresh1my $new2 = $stack->new_hub(formatter => undef, ipc => undef);
76*5759b3d2Safresh1ok(!$new2->ipc, "built with no ipc");
77*5759b3d2Safresh1ok(!$new2->format, "built with no formatter");
78*5759b3d2Safresh1
79*5759b3d2Safresh1done_testing;
80