The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use warnings;

use Test::More 'no_plan';

BEGIN {
    use_ok('URL::Encode', qw[ url_params_each
                              url_params_flat
                              url_params_mixed
                              url_params_multi ]);
}


my $enc = 'foo=1&bar=2&bar=3';

{
    my $exp = [ foo => 1, bar => 2, bar => 3 ];
    my $got = url_params_flat($enc);
    is_deeply($got, $exp, 'url_params_flat()');
}

{
    my $exp = { foo => 1, bar => [ 2, 3 ] };
    my $got = url_params_mixed($enc);
    is_deeply($got, $exp, 'url_params_mixed()');
}

{
    my $exp = { foo => [ 1 ], bar => [ 2, 3 ] };
    my $got = url_params_multi($enc);
    is_deeply($got, $exp, 'url_params_multi()');
}

{
    my @exp = qw(foo bar bar);
    my $cnt = 0;
    my $callback = sub {
        my ($key, $val) = @_;
        my $exp_key = shift @exp;
        my $exp_val = ++$cnt;
        is($key, $exp_key, 'url_params_each(): expected key');
        is($val, $exp_val, 'url_params_each(): expected value');
    };
    url_params_each($enc, $callback);
    is($cnt, 3, 'url_params_each(): callback invoked three times');
}