The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use strict;
use utf8;
use Test::More tests => 12;
use File::Spec;
use Scalar::Util qw(blessed);
use t::Data::Localize::Test qw(write_po);

use_ok "Data::Localize";
use_ok "Data::Localize::Gettext";

{
    my $loc = Data::Localize::Gettext->new(
        path => 't/04_gettext/*.po',
    );

    is_deeply(
        $loc->paths,
        [ 't/04_gettext/*.po' ],
        'paths contains single glob value in t/04_gettext/ - BUILDARGS handles path argument correctly'
    );

    my $out = $loc->localize_for(
        lang => 'ja',
        id   => 'Hello, stranger!',
        args => [ '牧大輔' ],
    );
    is($out, '牧大輔さん、こんにちは!', q{translation for "Hello, stranger!"});
}

{
    my $loc = Data::Localize->new(auto => 0, languages => [ 'ja' ]);
    $loc->add_localizer(
        class => 'Gettext',
        path => 't/04_gettext/*.po'
    );
    my $out = $loc->localize('Hello, stranger!', '牧大輔');
    is($out, '牧大輔さん、こんにちは!', q{translation for "Hello, stranger!"});

    my $file = write_po( <<'EOM' );
msgid "Hello, stranger!"
msgstr "%1さん、おじゃまんぼう!"
EOM

    $loc->localizers->[0]->add_path($file);

    is_deeply(
        $loc->localizers->[0]->paths,
        [ 't/04_gettext/*.po', $file ],
        'paths contains newly added path'
    );

    $out = $loc->localize('Hello, stranger!', '牧大輔');
    is($out, '牧大輔さん、おじゃまんぼう!', q{translation for "Hello, stranger!" from new file});

}

{
    require Data::Localize::Format::Gettext;
    @Data::Localize::Format::Gettext::TestWithCustomMethod::ISA =
        qw( Data::Localize::Format::Gettext )
    ;
    sub Data::Localize::Format::Gettext::TestWithCustomMethod::test {
        my ($self, $lang, $args) = @_;
        return join(':', $lang, map { blessed $_ ? ref $_ : $_ } @$args);
    }

    my $loc = Data::Localize::Gettext->new(
        path => 't/04_gettext/*.po',
        formatter => Data::Localize::Format::Gettext::TestWithCustomMethod->new(
            functions => {
                foo => sub {
                    my ($lang, $args) = @_;
                    return join(':', $lang, map { blessed $_ ? ref $_ : $_ } @$args);
                }
            }
        )
    );

    my $out = $loc->localize_for(
        lang => 'ja',
        id   => 'Dynamically Create Me!',
    );
    is($out, 'ja:a:b:cを動的に作成したぜ!', 'dynamic translation');

    $out = $loc->localize_for(
        lang => 'ja',
        id   => 'Embedded Dynamic',
        args => [ 42, 84 ],
    );
    is($out, 'ja:42:84を動的に作成したぜ!', 'dynamic translation');

    my $object = bless {}, 'Foo';
    $out = $loc->localize_for(
        lang => 'ja',
        id   => 'Embedded Dynamic',
        args => [ 42, $object ],
    );
    is($out, 'ja:42:Fooを動的に作成したぜ!', 'dynamic translation with object as argument, object is not stringified');
    
    $out = $loc->localize_for(
        lang => 'ja',
        id   => "Embedded Dynamic (function)",
        args => [ 42, $object ],
    );
    ok $out, "got something";
    is $out, "ja:42:Fooを動的に作成したぜ!";
}