The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# vim: filetype=perl :
use Test::More tests => 337;
use lib 't/lib';
use Test::MMS::Parser;

BEGIN {
   use_ok('MMS::Parser');
}

my $parser = MMS::Parser->create();

# Parameter types
my @well_known_charset_noany = (
   ["\x02\x07\xea" => 'big5'],
   ["\x02\x03\xe8" => 'iso-10646-ucs-2'],
   ["\x84"         => 'iso-8859-1'],
   ["\x85"         => 'iso-8859-2'],
   ["\x86"         => 'iso-8859-3'],
   ["\x87"         => 'iso-8859-4'],
   ["\x88"         => 'iso-8859-5'],
   ["\x89"         => 'iso-8859-6'],
   ["\x8a"         => 'iso-8859-7'],
   ["\x8b"         => 'iso-8859-8'],
   ["\x8c"         => 'iso-8859-9'],
   ["\x91"         => 'shift_JIS'],
   ["\x83"         => 'us-ascii'],
   ["\xea"         => 'utf-8'],
   ["\x81"         => 1],
);

my $wkc_checker         = make_checker($parser, 'well_known_charset');
my $any_charset_checker = make_checker($parser, 'any_charset');
$_->("\x80", '*') foreach ($wkc_checker, $any_charset_checker);
my $_wkc_wcode_checker =
  make_checker($parser, '_well_known_charset_wcode');
foreach my $spec (@well_known_charset_noany) {
   $_->(@$spec) foreach ($wkc_checker, $_wkc_wcode_checker);
}

my %tests_for = (
   well_known_media => [
      ["\x00"         => undef],
      ["\x1F"         => undef],
      [""             => undef],
      ["\x01"         => undef],
      ["\x01\x00"     => 0],
      ["\x01\x01"     => 1],
      ["\x01\xFF"     => 255],
      ["\x02\x01\x00" => 256],
   ],
   media_type => [
      ["\x1F"      => undef],
      [""          => undef],
      ["\x01"      => undef],
      ["\x01\x00"  => '*/*'],
      ["\x01\x01"  => 'text/*'],
      ["\x01\x3e"  => 'application/vnd.wap.mms-message'],
      ["\x00"      => ''],
      [" \x00"     => ' '],
      ["ciao\x00"  => "ciao"],
      ["uela'\x00" => "uela'"],

      # FIXME add examples with parameters
   ],

   field_name => [
      ["ciao\x00"          => 'ciao'],
      ["bulabula_bula\x00" => 'bulabula_bula'],
      ["bula bula\x00"     => undef],
      ["\x1Aciao\x00"      => undef],
      ["\x80"              => 0],
      ["\xFF"              => 127],
   ],
   constrained_media => [
      ["\x00"         => ''],
      [" \x00"        => ' '],
      ["\x7fciao\x00" => undef],
      ["ciao\x00"     => "ciao"],
      ["uela'\x00"    => "uela'"],
   ],
   content_type_value => [
      ["\x00"         => { text => '', media_type => '', parameters => {}}],
      [" \x00"        => { text => ' ', media_type => ' ', parameters => {}}],
      ["\x7fciao\x00" => undef],
      ["ciao\x00"     => { text => 'ciao', media_type => 'ciao', parameters => {}}],
      ["uela'\x00"    => { text => "uela'", media_type => "uela'", parameters => {}}],
   ],
);
foreach my $test (@{$tests_for{media_type}}) {
   my ($in, $out) = @$test;
   next unless defined $out;
   $in = (pack 'C*', length($in)) . $in;
   $out = { text => $out, media_type => $out, parameters => {} };
   push @{$tests_for{content_general_form}}, [$in, $out];
   push @{$tests_for{content_type_value}}, [$in, $out];
} ## end foreach my $test (@{$tests_for...
check_cases($parser, \%tests_for);

my $wkf_name_checker = make_checker($parser, 'well_known_field_name');
for my $ord (0 .. 127) {
   $wkf_name_checker->(chr($ord), undef);
   $wkf_name_checker->(chr($ord | 0x80), $ord);
}