#!/usr/bin/perl use strict; use lib qw {blib/lib}; use Regexp::Common; use t::Common; $^W = 1; sub create_parts; my $wais = $RE {URI} {WAIS}; # No point in crosschecking, URI creation is tag independent. my @tests = ( [wais => $wais => {wais => NORMAL_PASS | FAIL}], ); my ($good, $bad) = create_parts; run_tests version => "Regexp::Common::URI::wais", tests => \@tests, good => $good, bad => $bad, query => \&wais, wanted => \&wanted, filter => \&filter, filter_passes => \&filter_passes, ; sub wais { my ($tag, $host, $port, $database, $search, $wtype, $wpath) = ($_ [0], @{$_ [1]}); my $wais = "wais://"; $wais .= $host if defined $host; $wais .= ":$port" if defined $port; $wais .= "/$database" if defined $database; $wais .= "?$search" if defined $search; $wais .= "/$wtype" if defined $wtype; $wais .= "/$wpath" if defined $wpath; $wais; } sub wanted { my ($tag, $parts) = @_; my @wanted; $wanted [0] = $_; $wanted [1] = "wais"; $wanted [2] = $$parts [0]; # host. $wanted [3] = $$parts [1]; # port. $wanted [4] = $$parts [2]; # database. $wanted [4] .= "?" . $$parts [3] if defined $$parts [3]; $wanted [4] .= "/" . $$parts [4] if defined $$parts [4]; $wanted [4] .= "/" . $$parts [5] if defined $$parts [5]; $wanted [5] = $$parts [2]; # database. $wanted [6] = undef; $wanted [6] .= "?" . $$parts [3] if defined $$parts [3]; $wanted [6] .= "/" . $$parts [4] if defined $$parts [4]; $wanted [6] .= "/" . $$parts [5] if defined $$parts [5]; $wanted [7] = $$parts [3]; # search. $wanted [8] = $$parts [4]; # wtype. $wanted [9] = $$parts [5]; # wpath. \@wanted; } sub create_parts { my (@good, @bad); # Hosts. # Host/ports are tested with other URIs as well, we're not using # all the combinations here. $good [0] = [qw /www.abigail.be 127.0.0.1 w--w--w3.ABIGAIL.nl/]; $bad [0] = [qw /www.example..com w+w.example.com 127.0.0.0.1/]; # Ports. $good [1] = [undef, 210]; $bad [1] = ["", qw /: port/]; # Database $good [2] = ["", qw /database 0/, '%00%FF-!*,']; $bad [2] = [undef, qw /~/]; # Search $good [3] = [undef, "", qw /database 0/, '%00%FF-!*,']; $bad [3] = [qw {~ []}]; # Wtype $good [4] = [undef, "", qw /wtype 0/, '%00%FF-!*,']; $bad [4] = [qw {~ []}]; # Wpath $good [5] = [undef, "", qw /wpath 0/, '%00%FF-!*,']; $bad [5] = [qw {~ []}]; return (\@good, \@bad); } sub filter_passes { # Good URIs have either both a wtype and a wpath, or none at all. return 0 if defined $_ [0] -> [4] xor defined $_ [0] -> [5]; return 1; } sub filter { # At most one of 'search' and 'wtype/wpath' should be defined. return 0 if defined $_ [0] -> [3] && (defined $_ [0] -> [4] || defined $_ [0] -> [5]); return 0 if !defined $_ [0] -> [2] && grep {defined} @{$_ [0]} [3 .. 5]; return 1; } __END__