The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

use Test::More 'no_plan';

BEGIN { use_ok 'Gravatar::URL';
        use_ok 'Libravatar::URL'; }

my %interfaces = (
    libravatar => {
        func => \&libravatar_url,
        base => 'http://cdn.libravatar.org/avatar',
        https_base => 'https://seccdn.libravatar.org/avatar',
    },
    gravatar => {
        func => \&gravatar_url,
        base => 'http://www.gravatar.com/avatar',
        https_base => 'https://secure.gravatar.com/avatar',
    },
);

for my $interface_name (keys %interfaces) {
    my $interface = $interfaces{$interface_name};
    my $base = $interface->{base};
    my $https_base = $interface->{https_base};
    my $func = $interface->{func};

    my $id = 'a60fc0828e808b9a6a9d50f1792240c8';
    my $email = 'whatever@wherever.whichever';

    my @tests = (
        [{ email => $email },
         "$base/$id",
        ],
        
        [{ id => $id },
         "$base/$id",
        ],
        
        [{ email => $email,
           https => 1
         },
         "$https_base/$id",
        ],

        [{ email => $email,
           https => 0
         },
         "$base/$id",
        ],

        [{ email => $email,
           base  => 'http://example.com/gravatar'
         },
         "http://example.com/gravatar/$id",
        ],

        [{ email => $email,
           base  => 'http://example.com/gravatar',
           https => 1
         },
         "http://example.com/gravatar/$id",
        ],

        # Make sure we don't get a double slash after the base.
        [{ email => $email,
           base  => 'http://example.com/gravatar/'
         },
         "http://example.com/gravatar/$id",
        ],
        
        [{ default => "/local.png",
           email   => $email
         },
         "$base/$id?d=%2Flocal.png",
        ],
        
        [{ default => "/local.png",
           rating  => 'X',
           email   => $email,
         },
         "$base/$id?r=x&d=%2Flocal.png",
        ],
        
        [{ default  => "/local.png",
           email    => $email,
           rating   => 'R',
           size     => 80
         },
         "$base/$id?r=r&s=80&d=%2Flocal.png"
        ],

        [{ default => "/local.png",
           rating  => 'PG',
           size    => 45,
           email   => $email,
         },
         "$base/$id?r=pg&s=45&d=%2Flocal.png"
        ],

        [{ default => "/local.png",
           rating  => 'PG',
           size    => 45,
           email   => $email,
         },
         "$base/$id?r=pg&s=45&d=%2Flocal.png"
        ],

        [{ default => "/local.png",
           rating  => 'PG',
           size    => 45,
           email   => $email,
           short_keys => 1,
         },
         "$base/$id?r=pg&s=45&d=%2Flocal.png"
        ],
        [{ default => "/local.png",
           rating  => 'PG',
           size    => 45,
           email   => $email,
           short_keys => 0,
         },
         "$base/$id?rating=pg&size=45&default=%2Flocal.png"
        ],
    );

    # Add tests for the special defaults.
    for my $special ("identicon", "mm", "monsterid", "retro", "wavatar") {
        my $test = [{ default => $special,
                      email   => $email,
                    },
                    "$base/$id?d=$special",
                   ];
        push @tests, $test;
    }

    for my $test (@tests) {
        my($args, $url) = @$test;
        is &$func( %$args ), $url, join ", ", keys %$args;
    }
}