Newer
Older
NetAddr-IP / t / v4-subtract.t
@Andreas Jaggi Andreas Jaggi on 18 Oct 2015 2 KB Add Subtract function and tests
use Test::More;
use NetAddr::IP qw(Exclude Subtract);

my @r = (
	['10.0.0.0/8','10.0.0.0/9'],
	['10.0.0.0/8','10.0.0.0/8'],
	['10.0.0.0/8','10.128.0.0/9'],
	['10.0.0.0/8','10.128.0.0/10'],
	['10.0.0.0/8','10.0.0.0/32'],
	['192.168.0.0/24','192.168.0.255/32'],
	['192.168.0.0/23','192.168.0.127/32'],
	['1.2.3.4/32','1.2.3.4/32'],
	['0.0.0.0/0','0.0.0.0/32'],
);

plan tests => 1 + 19 * scalar @r;

SKIP: {
	my $res = Subtract([],[]);
	is("@$res", "", "Subtract([],[]) returns an empty list");

	foreach my $case (@r) {
		my $whole = [NetAddr::IP->new($case->[0])];
		my $part1 = [NetAddr::IP->new($case->[1])];
		my ($low,$up) = Exclude($whole->[0],$part1->[0]);
		my $part2 = [@{$low},@{$up}];
		my $res = [];

		$res = Subtract($whole,$part1);
		is("@$res", "@$part2", "Subtract(@$whole,@$part1) returns @$part2");

		$res = $whole->[0]->Subtract($part1);
		is("@$res", "@$part2", "($whole->[0])->Subtract(@$part1) returns @$part2");

		$res = Subtract($whole,$part2);
		is("@$res", "@$part1", "Subtract(@$whole,@$part2) returns @$part1");

		$res = $whole->[0]->Subtract($part2);
		is("@$res", "@$part1", "($whole->[0])->Subtract(@$part2) returns @$part1");

		$res = Subtract($part1,$part2);
		is("@$res", "@$part1", "Subtract(@$part1,@$part2) returns @$part1");

		$res = $part1->[0]->Subtract($part2);
		is("@$res", "@$part1", "($part1->[0])->Subtract(@$part2) returns @$part1");

		$res = Subtract($part2,$part1);
		is("@$res", "@$part2", "Subtract(@$part2,@$part1) returns @$part2");

		$res = Subtract(Subtract($whole,$part1),$part2);
		is("@$res", "", "Subtract(Subtract(@$whole,@$part1),$part2) returns an empty list");

		$res = Subtract($whole->[0]->Subtract($part1),$part2);
		is("@$res", "", "Subtract(($whole->[0])->Subtract(@$part1),$part2) returns an empty list");

		$res = Subtract(Subtract($whole,$part2),$part1);
		is("@$res", "", "Subtract(Subtract(@$whole,@$part2),$part1) returns an empty list");

		$res = Subtract($whole->[0]->Subtract($part2),$part1);
		is("@$res", "", "Subtract(($whole->[0])->Subtract(@$part2),$part1) returns an empty list");

		$res = Subtract($whole,$whole);
		is("@$res", "", "Subtract(@$whole,@$whole) returns an empty list");

		$res = $whole->[0]->Subtract($whole);
		is("@$res", "", "($whole->[0])->Subtract(@$whole) returns an empty list");

		$res = Subtract($part1,$part1);
		is("@$res", "", "Subtract(@$part1,@$part1) returns an empty list");

		$res = $part1->[0]->Subtract($part1);
		is("@$res", "", "($part1->[0])->Subract(@$part1) returns an empty list");

		$res = Subtract($part2,$part2);
		is("@$res", "", "Subtract(@$part2,@$part2) returns an empty list");

		$res = Subtract($part1,$whole);
		is("@$res", "", "Subtract(@$part1,@$whole) returns an empty list");

		$res = $part1->[0]->Subtract($whole);
		is("@$res", "", "($part1->[0])->Subtract(@$whole) returns an empty list");

		$res = Subtract($part2,$whole);
		is("@$res", "", "Subtract(@$part2,@$whole) returns an empty list");
	}
}