#!perl -T

use strict;
use warnings;

use Test::More tests => 27;
use Test::NoWarnings;
use Test::Exception;
use Test::Differences;

BEGIN {
    require_ok('Locale::TextDomain::OO');
    require_ok('Locale::TextDomain::OO::Lexicon::File::MO');
    require_ok('Locale::TextDomain::OO::TiedInterface');
    Locale::TextDomain::OO::TiedInterface->import;
}

throws_ok
    sub {
        Locale::TextDomain::OO::TiedInterface->import(undef);
    },
    qr{\A \QAn undefined value is not a variable name}xms,
    'tie object method with an undefined method name';
throws_ok
    sub {
        Locale::TextDomain::OO::TiedInterface->import('__');
    },
    qr{\A \Q"__" is not a hash or a hash reference}xms,
    'tie __ failed';
throws_ok
    sub {
        Locale::TextDomain::OO::TiedInterface->import('$__y');
    },
    qr{\A "\$__y"\Q is not exported}xms,
    'tie $__y failed';

${$loc_ref} = Locale::TextDomain::OO->new(
    language => 'de',
    domain   => 'test',
    category => 'LC_MESSAGES',
    logger   => sub { note shift },
    plugins  => [ qw(
        Expand::Gettext::DomainAndCategory
        Expand::Maketext
    ) ],
);

Locale::TextDomain::OO::Lexicon::File::MO
    ->new(
        logger => sub { note shift },
    )
    ->lexicon_ref({
        search_dirs => [ './t/LocaleData' ],
        decode      => 1,
        data        => [
            '*:LC_MESSAGES:test'          => '*/LC_MESSAGES/test.mo',
            '*:LC_MESSAGES:test_maketext' => '*/LC_MESSAGES/test_maketext.mo',
        ],
    });

# gettext
is
    $__{'This is a text.'},
    'Das ist ein Text.',
    '%__';
is
    $__->{'This is a text.'},
    'Das ist ein Text.',
    '$__';
is
    $__{['This is a text.']},
    'Das ist ein Text.',
    '%__ []';
is
    $__->{['This is a text.']},
    'Das ist ein Text.',
    '$__ []';
is
    $__npx{[
        'appointment',
        'This is {dates :num} date.',
        'This are {dates :num} dates.',
        1,
        dates => 1,
    ]},
    'Das ist 1 Date.',
    '%__npx 1';
is
    $__npx->{[
        'appointment',
        'This is {dates :num} date.',
        'This are {dates :num} dates.',
        2,
       dates => 2,
    ]},
    'Das sind 2 Dates.',
    '$__npx 2';
eq_or_diff
    $N__{'text'},
    'text',
    '%N__ scalar';
eq_or_diff
    $N__{['text']},
    'text',
    '%N__ arrayref';
eq_or_diff
    $N__->{'text'},
    'text',
    '$N__';
eq_or_diff
    $N__n{['singular', 'plural', 1]},
    [ qw( singular plural 1 ) ],
    '%N__n';
eq_or_diff
    $N__n{['singular', 'plural', 2]},
    [ qw( singular plural 2 ) ],
    '$N__';
() = $__begin_dc{[ qw( my_domain my_category ) ]};
is
    ${$loc_ref}->domain,
    'my_domain',
    '%__begin_dc domain';
is
    ${$loc_ref}->category,
    'my_category',
    '%__begin_dc category';
is
    $__dcnpx{[
        'test',
        'appointment',
        'This is {dates :num} date.',
        'This are {dates :num} dates.',
        3,
        'LC_MESSAGES',
        dates => 3,
    ]},
    'Das sind 3 Dates.',
    '%__dcnpx 3';
is
    ${$loc_ref}->domain,
    'my_domain',
    '%__begin_dc domain unchanged';
is
    ${$loc_ref}->category,
    'my_category',
    '%__begin_dc category unchanged';
() = $__end_dc{[]};
is
    ${$loc_ref}->domain,
    'test',
    '%__end_dc domain';
is
    ${$loc_ref}->category,
    'LC_MESSAGES',
    '%__end_dc category';

# maketext
() = $__begin_d->{test_maketext};
is
    $maketext_p{[
        'appointment',
        'This is/are [*,_1,date,dates].',
        1,
    ]},
    'Das ist/sind 1 Date.',
    '%maketext_p';
eq_or_diff
    $Nmaketext_p->{[
        'appointment',
        'This is/are [*,_1,date,dates].',
        2,
    ]},
    [
        'appointment',
        'This is/are [*,_1,date,dates].',
        2,
    ],
    '$Nmaketext_p';
() = $__end_d->{[]};
