#!perl
use strict;
use warnings;
use Test::More;
BEGIN {
use_ok('URL::Encode::XS', qw[ url_encode
url_encode_utf8
url_decode
url_decode_utf8 ]);
}
sub UNRESERVED () { "0123456789"
. "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
. "abcdefghijklmnopqrstuvwxyz"
. "_.~-" }
my @tests = (
[ "", "", "empty string" ],
[ "\x{00E5}", "%E5", "U+00E5 in native encoding" ],
[ UNRESERVED, UNRESERVED, "unreserved characters" ],
[ " ", "+", "U+0020 SPACE" ]
);
for my $ord (0x00..0x1F, 0x21..0xFF) {
my $chr = pack 'C', $ord;
next unless index(UNRESERVED, $chr) < 0;
my $enc = sprintf('%%%.2X', $ord);
push @tests, [ $chr, $enc, sprintf("ordinal %d", $ord) ];
}
foreach my $test (@tests) {
my ($expected, $encoded, $name) = @$test;
is(url_decode($encoded), $expected, "url_decode(): $name");
}
foreach my $test (@tests) {
my ($octets, $expected, $name) = @$test;
is(url_encode($octets), $expected, "url_encode(): $name");
}
{
use utf8;
my $dec = 'blåbär är gött!';
my $enc = 'bl%E5b%E4r+%E4r+g%F6tt%21';
is(url_encode($dec), $enc, 'url_encode: native string');
is(url_decode($enc), $dec, 'url_decode: native string');
}
{
use utf8;
my $dec = 'blåbär är gött!';
my $enc = 'bl%C3%A5b%C3%A4r+%C3%A4r+g%C3%B6tt%21';
is(url_encode_utf8($dec), $enc, 'url_encode_utf8: UTF-8 string');
is(url_decode_utf8($enc), $dec, 'url_decode_utf8: UTF-8 string');
}
{
my $enc = '%AE%Ae%aE';
my $dec = "\xAE\xAE\xAE";
is(url_decode($enc), $dec, 'mixed hexadecimal case');
}
done_testing();