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 0.88;

use Courriel::HeaderAttribute;

{
    my $attr = Courriel::HeaderAttribute->new(
        name  => 'foo',
        value => 'simple',
    );

    is(
        $attr->as_string,
        'foo=simple',
        'simple attribute as string'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name  => 'foo',
        value => 'a' x 150,
    );

    my $expect = 'foo*0=' . ( 'a' x 78 );
    $expect .= q{ } . 'foo*1=' . ( 'a' x ( 150 - 78 ) );

    is(
        $attr->as_string,
        $expect,
        'simple attribute with continuation as string'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name  => 'foo',
        value => 'has space',
    );

    is(
        $attr->as_string,
        q{foo="has space"},
        'quoted attribute as string'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name  => 'foo',
        value => q{has space and double quote (")},
    );

    is(
        $attr->as_string,
        q{foo="has space and double quote (\\")"},
        'quoted attribute as string with escaped quote'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name  => 'foo',
        value => 'a ' x 70,
    );

    my $expect = q{foo*0="} . ( 'a ' x 39 ) . q{"};
    $expect .= q{ } . q{foo*1="} . ( 'a ' x 31 ) . q{"};

    is(
        $attr->as_string,
        $expect,
        'simple attribute with continuation as string'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name     => 'foo',
        value    => 'not really chinese',
        language => 'zh',
    );

    is(
        $attr->as_string,
        q{foo*=UTF-8'zh'not%20really%20chinese},
        'attribute with a language is always encoded'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name     => 'foo',
        value    => "\x{4E00}\x{4E00}\x{4E00}",
        language => 'zh',
    );

    is(
        $attr->as_string,
        q{foo*=UTF-8'zh'%E4%B8%80%E4%B8%80%E4%B8%80},
        'attribute with utf-8 data'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name  => 'foo',
        value => "\x{4E00}\x{4E00}\x{4E00}",
    );

    is(
        $attr->charset, 'UTF-8',
        'any non ASCII data automatically sets the charset to UTF-8'
    );

    is(
        $attr->as_string,
        q{foo*=UTF-8''%E4%B8%80%E4%B8%80%E4%B8%80},
        'attribute with utf-8 data and no language'
    );
}

{
    my $attr = Courriel::HeaderAttribute->new(
        name  => 'foo',
        value => "\x{4E00}" x 30,
    );

    my $expect = join q{ },
        q{foo*0*=UTF-8''%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8},
        'foo*1*=%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4',
        'foo*2*=%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80',
        'foo*3*=%E4%B8%80%E4%B8%80%E4%B8%80%E4%B8%80';

    is(
        $attr->as_string,
        $expect,
        'attribute with utf-8 data and continuations'
    );
}

done_testing();