The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use Test::More tests => 23;

use strict;

BEGIN {
use_ok ('HTML::Widgets::NavMenu::Tree::Iterator::Stack'); # TEST
}

{
    my $stack = HTML::Widgets::NavMenu::Tree::Iterator::Stack->new();
    ok ( $stack, "Checking for Object Allocation"); # TEST
    is ( $stack->len(), 0, "len() == 0 on allocation"); # TEST
    ok ( $stack->is_empty(), "is_empty() on allocation"); # TEST
    $stack->push("Hello");
    $stack->push("World");
    # TEST
    ok ( (!$stack->is_empty()), "is_empty() is not true after filling");
    $stack->push("TamTam");
    is ( $stack->len(), 3, "Checking stack len"); # TEST
    is ( $stack->top(), "TamTam", "Checking top of stack"); # TEST
    is ( $stack->item(2), "TamTam", "Checking Item 2"); # TEST
    is ( $stack->item(1), "World", "Checking Item 1"); # TEST
    is ( $stack->item(0), "Hello", "Checking Item 0"); # TEST
    my $popped_item = $stack->pop();
    is ( $popped_item, "TamTam", "Popped Item"); # TEST
    is ( $stack->len(), 2, "Checking stack len"); # TEST
    # TEST
    is ( $stack->top(), "World", "Checking stack top after pop");
    $stack->push("Quatts");
    is ( $stack->len(), 3, "Stack Len"); # TEST
    is ( $stack->top(), "Quatts", "Top Item is Quatts"); # TEST
    $stack->pop();
    $stack->pop();
    $stack->pop();
    # TEST
    ok ( (! defined($stack->top())),
        "Checking for top() returning undef on empty stack");
    is ( $stack->len(), 0, "len() == 0 after popping all elements"); # TEST
    ok ( $stack->is_empty(), "is_empty() after popping all elements"); # TEST
}

{
    my $stack = HTML::Widgets::NavMenu::Tree::Iterator::Stack->new();
    $stack->push("Hello");
    $stack->push("Superb");
    $stack->push("Quality");
    $stack->push("Pardon");
    $stack->reset();
    is ( $stack->len(), 0, "len() == 0 after reset"); # TEST
    ok ( $stack->is_empty(), "is_empty() after reset"); # TEST
    # TEST
    ok ( (! defined($stack->top())),
        "Checking for top() returning undef on reset stack");
    $stack->push("Condor");
    # TEST
    is ( $stack->len(), 1, "len() after push() after reset");
    # TEST
    is ( $stack->item(0), "Condor", "Stack is correct after push after reset");
}