#!/usr/bin/perl use strict; use warnings; use Test::More; use Algorithm::C3; # we already did use_ok 10 times by now.. plan skip_all => "Your system has no SIGALRM" if !exists $SIG{ALRM}; plan tests => 8; =pod These are like the 010_complex_merge_classless test, but an infinite loop has been made in the heirarchy, to test that we can fail cleanly instead of going into an infinite loop =cut my @loopies = ( { #1 k => [qw(j i)], j => [qw(f)], i => [qw(h f)], h => [qw(g)], g => [qw(d)], f => [qw(e)], e => [qw(f)], d => [qw(a b c)], c => [], b => [], a => [], }, { #2 k => [qw(j i)], j => [qw(f)], i => [qw(h f)], h => [qw(g)], g => [qw(d)], f => [qw(e)], e => [qw(d)], d => [qw(a b c)], c => [qw(f)], b => [], a => [], }, { #3 k => [qw(j i)], j => [qw(f)], i => [qw(h f)], h => [qw(g)], g => [qw(d)], f => [qw(e)], e => [qw(d)], d => [qw(a b c)], c => [], b => [], a => [qw(k)], }, { #4 k => [qw(j i)], j => [qw(f k)], i => [qw(h f)], h => [qw(g)], g => [qw(d)], f => [qw(e)], e => [qw(d)], d => [qw(a b c)], c => [], b => [], a => [], }, { #5 k => [qw(j i)], j => [qw(f)], i => [qw(h f)], h => [qw(k g)], g => [qw(d)], f => [qw(e)], e => [qw(d)], d => [qw(a b c)], c => [], b => [], a => [], }, { #6 k => [qw(j i)], j => [qw(f)], i => [qw(h f)], h => [qw(g)], g => [qw(d)], f => [qw(e)], e => [qw(d)], d => [qw(a b c)], c => [], b => [qw(b)], a => [], }, { #7 k => [qw(k j i)], j => [qw(f)], i => [qw(h f)], h => [qw(g)], g => [qw(d)], f => [qw(e)], e => [qw(d)], d => [qw(a b c)], c => [], b => [], a => [], }, { #7 k => [qw(j i)], j => [qw(f)], i => [qw(h f)], h => [qw(g)], g => [qw(d)], f => [qw(e)], e => [qw(d)], d => [qw(a h b c)], c => [], b => [], a => [], }, ); foreach my $loopy (@loopies) { eval { local $SIG{ALRM} = sub { die "ALRMTimeout" }; alarm(3); Algorithm::C3::merge('k', sub { return @{ $loopy->{ $_[0] } }; }); }; if(my $err = $@) { if($err =~ /ALRMTimeout/) { ok(0, "Loop terminated by SIGALRM"); } elsif($err =~ /Infinite loop detected/) { ok(1, "Graceful exception thrown"); } else { ok(0, "Unrecognized exception: $err"); } } else { ok(0, "Infinite loop apparently succeeded???"); } }