Algorithm-DependencySolver

 view release on metacpan or  search on metacpan

t/03-traversal.t  view on Meta::CPAN

                'prerequisites' => [ ],
            },
        ],
        'output' => [ qw(a b c) ],
        'extra_tests' => sub {
            my ($solver, $traversal) = @_;

            my $graph = $solver->get_Graph();
            ok(
                !$graph->has_edge('a', 'c'),
                "did not get a redundant edge from a -> c"
            );
        },
    },

    #
    # example of an invalid graph
    #
    {
        'message' => 'invalid graph - cycle',
        'input'   => [
            {
                'id'            => 'a',
                'depends'       => [ 'x' ],
                'affects'       => [ 'y' ],
                'prerequisites' => [ ],
            },
            {
                'id'            => 'b',
                'depends'       => [ 'y' ],
                'affects'       => [ 'x' ],
                'prerequisites' => [     ],
            },
        ],
        'output' => 'EXCEPTION',
    },
);

###########################################################

TEST:
for my $test (@tests) {

    my @operations;
    for my $opp (@{ $test->{'input'} }) {
        push @operations, Algorithm::DependencySolver::Operation->new(
            %$opp
        );
    }

    my $solver = Algorithm::DependencySolver::Solver->new(
        'nodes' => \@operations
    );

    my $traversal = Algorithm::DependencySolver::Traversal->new(
        'Solver' => $solver,
    );

    my $expected = $test->{'output'};
    if ($expected eq 'EXCEPTION') {
        throws_ok {
            $traversal->dryrun();
        } qr/Not a valid graph!/, $test->{'message'};
        note($solver->to_s);
        next TEST;
    }
    elsif (ref($expected) eq ref({})) {
        $expected = any(@{ $expected->{'one_of'} });
    }

    my $got = [ map { $_->[0]{'id'} } @{ $traversal->dryrun() } ];

    my $msg = $test->{'message'};

    my $ok = cmp_deeply($got, $expected, $msg);
    if (!$ok) {
        diag("Got:\n", $solver->to_s);
    }
    else {
        note($solver->to_s);
    }

    if ($test->{extra_tests}) {
        $test->{extra_tests}->($solver, $traversal);
    }
}

done_testing();



( run in 0.730 second using v1.01-cache-2.11-cpan-cdf2f3d4e48 )