#!/usr/bin/perl

use strict;
use lib qw {blib/lib}, ".";

use Regex::Common;
use t::Common;

$^W    = 1;
$DEBUG = 1;

sub create_parts;

my $scheme = 'pop';
my $pop    = $RE{URI}{ uc $scheme };

# No point in crosschecking, URI creation is tag independent.
my @tests = ( [ pop => $pop => { pop => NORMAL_PASS | FAIL } ], );

my ( $good, $bad ) = create_parts;

run_tests
  version => "Regex::Common::URI::$scheme",
  tests   => \@tests,
  good    => $good,
  bad     => $bad,
  query   => \&query,
  wanted  => \&wanted,
  filter  => \&filter,
  ;

sub query {
    my ( $tag, $user, $auth_type, $host, $port ) = ( $_[0], @{ $_[1] } );

    my $url = "$scheme://";
    if ( defined $user ) {
        $url .= $user;
        $url .= ";AUTH=$auth_type" if defined $auth_type;
        $url .= '@';
    }
    $url .= $host    if defined $host;
    $url .= ":$port" if defined $port;

    $url;
}

sub wanted {
    my ( $tag, $parts ) = @_;

    my @wanted;
    $wanted[0] = $_;
    $wanted[1] = "$scheme";
    $wanted[2] = $$parts[0];    # user.
    $wanted[3] = $$parts[1];    # auth.
    $wanted[4] = $$parts[2];    # host.
    $wanted[5] = $$parts[3];    # port.

    \@wanted;
}

sub create_parts {
    my ( @good, @bad );

    # Users
    $good[0] = [ undef, qw /abigail/ ];
    $bad[0]  = [ "",    qw /abigail%GG [abigail]/ ];

    # Auth_type
    $good[1] = [ undef, qw /* password &~=~& +APOP +password +/ ];
    $bad[1]  = [ "",    qw /"password" camel-][/ ];

    # Hosts.
    $good[2] = [qw /pop3.abigail.be pop3.PERL.com 127.0.0.1/];
    $bad[2]  = [
        qw /www.example..com w+w.example.com 127.0.0.0.1
          w--.example.com -w.example.com www.example.1com/
    ];

    # Ports.
    $good[3] = [ undef, 110 ];
    $bad[3]  = [ "",    qw /: port/ ];

    return ( \@good, \@bad );
}

sub filter {
    return 0 if defined ${ $_[0] }[1] && !defined ${ $_[0] }[0];

    return 1;
}

__END__
