use strict;
use warnings;
use Test::More;
use HTTP::AcceptLanguage;
subtest 'empty' => sub {
subtest 'undef' => sub {
my $parser = HTTP::AcceptLanguage->new;
is($parser->match(), undef);
$parser = HTTP::AcceptLanguage->new;
is($parser->match(''), undef);
};
subtest 'string' => sub {
my $parser = HTTP::AcceptLanguage->new('');
is($parser->match(), undef);
$parser = HTTP::AcceptLanguage->new('');
is($parser->match(''), undef);
};
subtest 'has header' => sub {
my $parser = HTTP::AcceptLanguage->new('ja');
is($parser->match(), undef);
$parser = HTTP::AcceptLanguage->new('en');
is($parser->match(''), undef);
};
};
subtest 'empty header' => sub {
my $parser = HTTP::AcceptLanguage->new;
is($parser->match(qw/ en ja /), 'en');
$parser = HTTP::AcceptLanguage->new('');
is($parser->match(qw/ ja en /), 'ja');
};
# This behavior was changed.
# https://github.com/yappo/p5-HTTP-AcceptLanguage/issues/1
subtest 'flat quality' => sub {
my $parser = HTTP::AcceptLanguage->new('en, ja');
is($parser->match(qw/ en ja /), 'en');
$parser = HTTP::AcceptLanguage->new('en, ja');
is($parser->match(qw/ ja en /), 'en');
$parser = HTTP::AcceptLanguage->new('ja, en');
is($parser->match(qw/ en ja /), 'ja');
$parser = HTTP::AcceptLanguage->new('ja, en');
is($parser->match(qw/ ja en /), 'ja');
};
subtest 'prefix tag' => sub {
my $parser = HTTP::AcceptLanguage->new('en-us');
is($parser->match(qw/ en /), 'en');
$parser = HTTP::AcceptLanguage->new('en-us, ja');
is($parser->match(qw/ en ja /), 'en');
$parser = HTTP::AcceptLanguage->new('en-us, ja');
is($parser->match(qw/ ja en /), 'en');
subtest 'priority of full match' => sub {
$parser = HTTP::AcceptLanguage->new('en-us');
is($parser->match(qw/ en en-us /), 'en-us');
$parser = HTTP::AcceptLanguage->new('en-us');
is($parser->match(qw/ en-us en /), 'en-us');
$parser = HTTP::AcceptLanguage->new('en');
is($parser->match(qw/ en en-us /), 'en');
$parser = HTTP::AcceptLanguage->new('en');
is($parser->match(qw/ en-us en /), 'en');
};
subtest 'order by input list' => sub {
$parser = HTTP::AcceptLanguage->new('en-us, en');
is($parser->match(qw/ en en-us /), 'en-us');
$parser = HTTP::AcceptLanguage->new('en-us, en');
is($parser->match(qw/ en-us en /), 'en-us');
$parser = HTTP::AcceptLanguage->new('en-gb, en-us, en');
is($parser->match(qw/ en-us en /), 'en'); # same as en-gb;q=0.9, en-us;q=0.8, en;q=0.7
};
subtest 'unsupported of server side prefix tag' => sub {
$parser = HTTP::AcceptLanguage->new('en-us');
is($parser->match(qw/ en-gb /), undef);
$parser = HTTP::AcceptLanguage->new('en');
is($parser->match(qw/ en-gb /), undef);
};
};
subtest 'quality' => sub {
my $parser = HTTP::AcceptLanguage->new('en;q=0.1, ja');
is($parser->match(qw/ en ja /), 'ja');
$parser = HTTP::AcceptLanguage->new('en;q=0.1, ja;q=0.2');
is($parser->match(qw/ en ja /), 'ja');
$parser = HTTP::AcceptLanguage->new('en;q=0.1, en-us;q=0.1');
is($parser->match(qw/ en ja en-us /), 'en');
$parser = HTTP::AcceptLanguage->new('en;q=0.1, en-us;q=0.1');
is($parser->match(qw/ en-us ja en /), 'en');
$parser = HTTP::AcceptLanguage->new('en;q=0.1, en-us;q=0.2');
is($parser->match(qw/ en ja en-us /), 'en-us');
$parser = HTTP::AcceptLanguage->new('en;q=0.2, en-us;q=0.1');
is($parser->match(qw/ en-us ja en /), 'en');
$parser = HTTP::AcceptLanguage->new('th;q=0.1, ja;q=0.1, en-gb;q=0.2, en-us;q=0.2, en;q=0.1');
is($parser->match(qw/ en-us ja en /), 'en'); # same as en-gb;q=0.29, en-us;q=0.28, th;q=0.19, ja;q=0.18, en;q=0.17
subtest 'duplicated tag is order by quality' => sub {
$parser = HTTP::AcceptLanguage->new('ja;q=0.1, en;q=0.5, ja;q=0.6');
is($parser->match(qw/ en-us ja en /), 'ja');
};
};
subtest 'case sensitive' => sub {
my $parser = HTTP::AcceptLanguage->new('En');
is($parser->match(qw/ en /), 'en');
$parser = HTTP::AcceptLanguage->new('eN');
is($parser->match(qw/ En /), 'En');
$parser = HTTP::AcceptLanguage->new('En, zh-Tw');
is($parser->match(qw/ zH /), 'zH');
$parser = HTTP::AcceptLanguage->new('En, Zh-Tw');
is($parser->match(qw/ zH-tw /), 'zH-tw');
};
subtest 'wildcard' => sub {
my $parser = HTTP::AcceptLanguage->new('*');
is($parser->match(qw/ en ja /), 'en');
$parser = HTTP::AcceptLanguage->new('ja, *');
is($parser->match(qw/ en ja /), 'ja');
$parser = HTTP::AcceptLanguage->new('ja, *;q=0.3');
is($parser->match(qw/ en ja /), 'ja');
$parser = HTTP::AcceptLanguage->new('*, da');
is($parser->match(qw/ ja da /), 'ja');
$parser = HTTP::AcceptLanguage->new('*, zh-tw');
is($parser->match(qw/ en-US ja da /), 'en-US');
};
done_testing;