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

eval "use Encode";
my $enc = ! $@;

use Spoon::CGI;
use URI::Escape;

plan tests => 10;

{
    package Test1;
    use Spoon::CGI -base;

    cgi 'param1';
    cgi 'param2' => '-utf8';
    cgi 'trimmed' => '-trim';
    cgi 'nl' => '-newlines';
}

$ENV{REQUEST_METHOD} = 'GET';

{
    $ENV{QUERY_STRING} = "param1=2;foo=bar";

    my $test1 = Test1->new;
    SKIP: {
        skip "Encode not installed", 1  unless($enc);
        ok( Encode::is_utf8($test1->param1), 'param1 is marked as utf8' );
    }

    is( $test1->param1, 2, 'param1 value is 2' );
}

{
    CGI->_reset_globals;

    $ENV{QUERY_STRING} = 'param1=%E1%9A%A0%E1%9B%87%E1%9A%BB;foo=bar';

    my $test1 = Test1->new;
    SKIP: {
        skip "Encode not installed", 1  unless($enc);
        ok( Encode::is_utf8($test1->param1), 'param1 is marked as utf8' );
    }

    is( $test1->param1, "\x{16A0}\x{16C7}\x{16BB}",
        'param1 value is \x{16A0}\x{16C7}\x{16BB}' );
}

{
    CGI->_reset_globals;

    $ENV{QUERY_STRING} = 'param2=%E1%9A%A0%E1%9B%87%E1%9A%BB;foo=bar';

    my $test1 = Test1->new;
    SKIP: {
        skip "Encode not installed", 1  unless($enc);
        ok( Encode::is_utf8($test1->param2), 'param2 is marked as utf8' );
    }

    is( $test1->param2, "\x{16A0}\x{16C7}\x{16BB}",
        'param2 value is \x{16A0}\x{16C7}\x{16BB}' );
}

{
    CGI->_reset_globals;

    $ENV{QUERY_STRING} = 'trimmed=%20%20trim%20me%20%20;foo=bar';

    my $test1 = Test1->new;
    SKIP: {
        skip "Encode not installed", 1  unless($enc);
        ok( Encode::is_utf8($test1->trimmed), 'trimmed is marked as utf8' );
    }

    is( $test1->trimmed, "trim me",
        'trimmed value is "trim me"' );
}

{
    CGI->_reset_globals;

    $ENV{QUERY_STRING} = 'nl=line1%0d%0aline2%0dline3;foo=bar';

    my $test1 = Test1->new;
    SKIP: {
        skip "Encode not installed", 1  unless($enc);
        ok( Encode::is_utf8($test1->nl), 'nl is marked as utf8' );
    }

    is( $test1->nl, "line1\nline2\nline3\n",
        'nl only contains unix newlines' );
}