#!/usr/bin/perl

use strict;
use warnings;

use Test::More tests => 16;
use Test::LongString;

BEGIN {
    use_ok('Tree::Simple::View::ASCII');
}

use Tree::Simple;
my $tree = Tree::Simple->new(Tree::Simple->ROOT)
                       ->addChildren(
                            Tree::Simple->new("1")
                                        ->addChildren(
                                            Tree::Simple->new("1.1"),
                                            Tree::Simple->new("1.2")
                                                        ->addChildren(
                                                            Tree::Simple->new("1.2.1"),
                                                            Tree::Simple->new("1.2.2")
                                                        ),
                                            Tree::Simple->new("1.3")
                                        ),
                            Tree::Simple->new("2")
                                        ->addChildren(
                                            Tree::Simple->new("2.1"),
                                            Tree::Simple->new("2.2")
                                        ),
                            Tree::Simple->new("3")
                                        ->addChildren(
                                            Tree::Simple->new("3.1")
                                                ->addChildren(
                                                    Tree::Simple->new("3.1.1"),
                                                    Tree::Simple->new("3.1.2")
                                                ),
                                        ),
                            Tree::Simple->new("4")
                                        ->addChildren(
                                            Tree::Simple->new("4.1")
                                        )
                       );
isa_ok($tree, 'Tree::Simple');

can_ok("Tree::Simple::View::ASCII", 'new');
can_ok("Tree::Simple::View::ASCII", 'expandAll');

{
    my $tree_view = Tree::Simple::View::ASCII->new(
        $tree,
        node_formatter => sub {
            my $t = shift;
            "Node Level: " . $t->getNodeValue;
        }
    );
    isa_ok($tree_view, 'Tree::Simple::View::ASCII');

    my $output = $tree_view->expandAll();
    ok($output, '... make sure we got some output');

    my $expected = <<EXPECTED;
Node Level: 1
    |---Node Level: 1.1
    |---Node Level: 1.2
    |       |---Node Level: 1.2.1
    |       |---Node Level: 1.2.2
    |---Node Level: 1.3
Node Level: 2
    |---Node Level: 2.1
    |---Node Level: 2.2
Node Level: 3
    |---Node Level: 3.1
            |---Node Level: 3.1.1
            |---Node Level: 3.1.2
Node Level: 4
    |---Node Level: 4.1
EXPECTED

    is_string($output, $expected, '... got what we expected');
}


{
    my $tree_view = Tree::Simple::View::ASCII->new(
        $tree,
        node_formatter => sub {
            my $t = shift;
            "Node Level: " . $t->getNodeValue;
        }
    );
    isa_ok($tree_view, 'Tree::Simple::View::ASCII');

    $tree_view->includeTrunk(1);

    my $output = $tree_view->expandAll();
    ok($output, '... make sure we got some output');

    my $expected = <<EXPECTED;
Node Level: root
    |---Node Level: 1
    |       |---Node Level: 1.1
    |       |---Node Level: 1.2
    |       |       |---Node Level: 1.2.1
    |       |       |---Node Level: 1.2.2
    |       |---Node Level: 1.3
    |---Node Level: 2
    |       |---Node Level: 2.1
    |       |---Node Level: 2.2
    |---Node Level: 3
    |       |---Node Level: 3.1
    |               |---Node Level: 3.1.1
    |               |---Node Level: 3.1.2
    |---Node Level: 4
            |---Node Level: 4.1
EXPECTED

    is_string($output, $expected, '... got what we expected');
}

{
    my $tree_view = Tree::Simple::View::ASCII->new(
        $tree,
        node_formatter => sub {
            my $t = shift;
            "Node Level: " . $t->getNodeValue;
        }
    );
    isa_ok($tree_view, 'Tree::Simple::View::ASCII');

    my $output = $tree_view->expandPath("1", "1.2");
    ok($output, '... make sure we got some output');

    my $expected = <<EXPECTED;
Node Level: 1
    |---Node Level: 1.1
    |---Node Level: 1.2
    |       |---Node Level: 1.2.1
    |       |---Node Level: 1.2.2
    |---Node Level: 1.3
Node Level: 2
Node Level: 3
Node Level: 4
EXPECTED

    is($output, $expected, '... got what we expected');
}

{
    my $tree_view = Tree::Simple::View::ASCII->new(
        $tree,
        node_formatter => sub {
            my $t = shift;
            "Node Level: " . $t->getNodeValue;
        }
    );
    isa_ok($tree_view, 'Tree::Simple::View::ASCII');

    $tree_view->includeTrunk(1);

    my $output = $tree_view->expandPath("root", "1", "1.2");
    ok($output, '... make sure we got some output');

    my $expected = <<EXPECTED;
Node Level: root
    |---Node Level: 1
    |       |---Node Level: 1.1
    |       |---Node Level: 1.2
    |       |       |---Node Level: 1.2.1
    |       |       |---Node Level: 1.2.2
    |       |---Node Level: 1.3
    |---Node Level: 2
    |---Node Level: 3
    |---Node Level: 4
EXPECTED

    is($output, $expected, '... got what we expected');
}
