u_bo.t   [plain text]


use Test::More tests => 75;

use strict;
use Graph;

sub Foo::new {
    bless { foo => $_[1] }, $_[0];
}

sub Foo::xyz {
    1;
}

sub Bar::new {
    bless { bar => $_[1] }, $_[0];
}

sub Bar::xyz {
    1;
}

{
    package Bar;
    use overload '""' => \&str, eq => \&eq, ne => \≠
    sub str { "" }
    sub eq  {
              my $d0 = defined $_[0]->{bar};
	      my $d1 = defined $_[1]->{bar};
	      $d0 && $d1 ? $_[0]->{bar} eq $_[1]->{bar} :
              $d0 || $d0 ? 0 : 1;
            }
    sub ne  {
              my $d0 = defined $_[0]->{bar};
              my $d1 = defined $_[1]->{bar};
	      $d0 && $d1 ? $_[0]->{bar} ne $_[1]->{bar} :
              $d0 || $d0 ? 1 : 0;
            }
}

sub rt_17159 {
    my $g = Graph::Undirected->new;
    my ($v1, $v2, $v3, $v4) = @_;
    $g->add_vertices($v1, $v2, $v3, $v4);
    $g->add_edges([$v1,$v2],[$v3,$v4],[$v3,$v2]);
    for my $v ($v1, $v2, $v3, $v4) {
	rt_17159_check($v);
    }
    my @ap = $g->articulation_points;
    for my $ap (@ap) {
	rt_17159_check($ap);
    }
    sub rt_17159_check {
	my $z = shift;
	ok($z->xyz());
    }
}

rt_17159(Foo->new(),
	 Foo->new(),
	 Foo->new(),
	 Foo->new());

rt_17159(Bar->new(1),
	 Bar->new(2),
	 Bar->new(3),
	 Bar->new(4));

rt_17159(Bar->new(),
	 Bar->new(),
	 Bar->new(),
	 Bar->new());

sub rt_17160 {
    my $g = Graph::Undirected->new;
    my ($v1, $v2, $v3, $v4) = @_;
    $g->add_vertices($v1, $v2, $v3, $v4);
    $g->add_edges([$v1,$v2],[$v3,$v4],[$v3,$v2]);
    for my $v ($v1, $v2, $v3, $v4) {
	rt_17160_check($v);
    }
    my @cc = $g->connected_components;
    for my $ref (@cc) {
	for (@$ref) {
	    rt_17160_check($_);
	}
    }
    sub rt_17160_check {
	my $z = shift;
	ok($z->xyz());
    }
}

rt_17160(Foo->new(),
	 Foo->new(),
	 Foo->new(),
	 Foo->new());

rt_17160(Bar->new(1),
	 Bar->new(2),
	 Bar->new(3),
	 Bar->new(4));

rt_17160(Bar->new(),
	 Bar->new(),
	 Bar->new(),
	 Bar->new());

sub rt_17161 {
    my $g = Graph::Undirected->new;
    my ($v1, $v2, $v3, $v4) = @_;
    $g->add_vertices($v1, $v2, $v3, $v4);
    $g->add_edges([$v1,$v2],[$v3,$v4],[$v3,$v2]);
    for my $v ($v1, $v2, $v3, $v4) {
	rt_17161_check($v);
    }
    my @b = $g->bridges;
    for my $ref (@b) {
	for (@$ref) {
	    rt_17161_check($_);
	}
    }
    sub rt_17161_check {
	my $z = shift;
	ok($z->xyz());
    }
}

rt_17160(Foo->new(),
	 Foo->new(),
	 Foo->new(),
	 Foo->new());

rt_17160(Bar->new(1),
	 Bar->new(2),
	 Bar->new(3),
	 Bar->new(4));

rt_17160(Bar->new(),
	 Bar->new(),
	 Bar->new(),
	 Bar->new());

sub rt_17162 {
    my $g = Graph::Undirected->new;
    my ($v1, $v2, $v3, $v4) = @_;
    $g->add_vertices($v1, $v2, $v3, $v4);
    $g->add_edges([$v1,$v2],[$v3,$v4],[$v3,$v2]);
    for my $v ($v1, $v2, $v3, $v4) {
	rt_17162_check($v);
    }
    my $cl = ref $v1;
    my $cg = $g->connected_graph(super_component => sub {
				     $cl->new();
				 });
    my @cv = $cg->vertices;
    for my $ref (@cv) {
	rt_17162_check($ref);
    }
    sub rt_17162_check {
	my $z = shift;
	ok($z->xyz());
    }
}

rt_17162(Foo->new(),
	 Foo->new(),
	 Foo->new(),
	 Foo->new());

rt_17162(Bar->new(1),
	 Bar->new(2),
	 Bar->new(3),
	 Bar->new(4));

rt_17162(Bar->new(),
	 Bar->new(),
	 Bar->new(),
	 Bar->new());

sub rt_17163 {
    my $g = Graph::Undirected->new;
    my ($v1, $v2, $v3, $v4) = @_;
    $g->add_vertices($v1,$v2,$v3,$v4);
    $g->add_edges([$v1,$v2],[$v3,$v4],[$v3,$v2]);
    my @spd = $g->SP_Dijkstra($v1,$v4);
    ok(@spd >= 2);
}

rt_17163(Foo->new(),
	 Foo->new(),
	 Foo->new(),
	 Foo->new());

rt_17163(Bar->new(1),
	 Bar->new(2),
	 Bar->new(3),
	 Bar->new(4));

rt_17163(Bar->new(),
	 Bar->new(),
	 Bar->new(),
	 Bar->new());

sub rt_17164 {
    my $g = Graph::Undirected->new;
    my ($v1, $v2, $v3, $v4) = @_;
    $g->add_vertices($v1,$v2,$v3,$v4);
    $g->add_edges([$v1,$v2],[$v3,$v4],[$v3,$v2]);
    my @spbf = $g->SP_Bellman_Ford($v1,$v4);
    ok(@spbf >= 2);
}

rt_17164(Foo->new(),
	 Foo->new(),
	 Foo->new(),
	 Foo->new());

rt_17164(Bar->new(1),
	 Bar->new(2),
	 Bar->new(3),
	 Bar->new(4));

rt_17164(Bar->new(),
	 Bar->new(),
	 Bar->new(),
	 Bar->new());

{
    # rt.cpan.org: 17592: articulation_points doesn't find all vertices

    my $g = Graph::Undirected->new;

    my $v1 = Foo->new();
    my $v2 = Foo->new();
    my $v3 = Foo->new();
    my $v4 = Foo->new();
    my $v5 = Foo->new();
    my $v6 = Foo->new();
    my $v7 = Foo->new();

    $g->add_vertices($v1,$v2,$v3,$v4,$v5,$v6,$v7);

    $g->add_edges([$v1,$v2],[$v2,$v3],[$v3,$v4],
		  [$v5,$v6],[$v6,$v7]);

    my @rts = $g->articulation_points;
    my %rts; @rts{@rts} = @rts;

    is(@rts, 3);
    ok($rts{$v2});
    ok($rts{$v3});
    ok($rts{$v6});
}