Algorithm-TSort

 view release on metacpan or  search on metacpan

t/01-tsort.t  view on Meta::CPAN

#!/usr/bin/perl 
# vim: ft=perl ts=8 sw=4 sts=4 et ff=unix
#===============================================================================
#
#         FILE:  run.pl
#
#        USAGE:  ./run.pl  
#
#  DESCRIPTION:  
#
#      OPTIONS:  ---
# REQUIREMENTS:  ---
#         BUGS:  ---
#        NOTES:  ---
#       AUTHOR:  YOUR NAME (), 
#      CREATED:  21.09.2010 14:51:26
#     REVISION:  ---
#===============================================================================

use strict;
use warnings;
use lib 'lib';
use Algorithm::TSort qw(Graph tsort);
use autouse 'Data::Dumper'=> 'Dumper';
use Test::More qw(no_plan);

my $buf = "1 2 3\n2 4\n3 4\n5 5\n6 7\n7 6";
my $fh;
open $fh, "<", \$buf;
my ( $g01, $g02, $g03, $g04, $g05 );

( $g01 = Graph( SCALAR => $buf ) );
( $g02 = Graph( IO     => $fh ) );
my $adj;
my @adj_true = ( [ 2, 3 ], [4], [4], [], [5], [7], [6] );
for ( 1, 2, 3, 4, 5, 6, 7 ) {
    $adj->{$_} = [ $g01->adj_nodes($_) ];
    is_deeply( $adj->{$_}, $adj_true[ $_ - 1 ], "adj_nodes $_" );
}
( $g03 = Graph( ADJSUB => sub { my $x = $adj->{ $_[0] }; $x ? @$x : () } ) );
( $g04 = Graph( ADJ => $adj ) );
( $g05 = Graph( ADJSUB_ARRAYREF => sub { $adj->{ $_[0] } } ) );

my @true_result = ( [ '1 2 3 4', '1 3 2 4' ], '2 4', '3 4', '4', 'circle', 'circle', );

sub result_str($) {
    my @sorted = eval { $_[0]->(); };
    return 'circle' if $@;
    return join " ", @sorted;
}

sub test_str {
    my $graph  = shift;
    my $node   = shift;
    my $true   = $true_result[ $node - 1 ];
    my @true   = ref $true ? @$true : $true;
    my $result = result_str sub { tsort( $graph, $node ) };
    ok( 1 == grep $_ eq $result, @true ) or print STDERR Dumper();
}

for my $gr ( $g01, $g02, $g03, $g04, $g05 ) {
    for ( 1 .. 6 ) {
        test_str( $gr, $_ );
    }
}



( run in 0.537 second using v1.01-cache-2.11-cpan-39bf76dae61 )