# -*- CPerl -*-

use Test::More qw(no_plan);
use strict;
use warnings;

use POSIX;
setlocale(&LC_ALL, 'en_US');

BEGIN { use_ok('Number::Format') }

my $usd = Number::Format->new(
                              -int_curr_symbol   => 'USD',
                              -currency_symbol   => '$',
                              -decimal_point     => '.',
                              -frac_digits       => 2,
                              -int_frac_digits   => 2,
                              -n_cs_precedes     => 1,
                              -n_sep_by_space    => 1,
                              -n_sign_posn       => 1,
                              -negative_sign     => '-',
                              -p_cs_precedes     => 1,
                              -p_sep_by_space    => 1,
                              -p_sign_posn       => 1,
                              -positive_sign     => '',
                              -thousands_sep     => ',',
                              -mon_thousands_sep => ',',
                              -decimal_fill      => 1,
                              -decimal_digits    => 2,
                              -mon_decimal_point => '.',
                             );

is($usd->format_price(123456.51),   'USD 123,456.51',     'thou');
is($usd->format_price(1234567.509), 'USD 1,234,567.51',   'mill');
is($usd->format_price(1234.51, 3),  'USD 1,234.510',      'three dec');
is($usd->format_price(123456789.1), 'USD 123,456,789.10', 'zero in dec');
is($usd->format_price(100, '0'),    'USD 100',            'no dec');

$usd->{p_cs_precedes}  = 1;
$usd->{p_sep_by_space} = 0;
$usd->{n_cs_precedes}  = 1;
$usd->{n_sep_by_space} = 0;
$usd->{p_sign_posn}    = 1;
$usd->{n_sign_posn}    = 1;

is($usd->format_price(19.95, undef, 'currency_symbol'),
   '$19.95', 'domestic');

$usd->{int_frac_digits} = 4;
$usd->{frac_digits} = 3;

is($usd->format_price(19.95, undef, 'currency_symbol'),
   '$19.950', 'frac_digits');
is($usd->format_price(19.95), 'USD19.9500', 'int frac digits');

$usd->{n_sign_posn} = 0;
is($usd->format_price(-9.95), '(USD9.9500)', 'n_sign_posn=0');

$usd->{n_sign_posn} = 1;
is($usd->format_price(-9.95), '-USD9.9500', 'n_sign_posn=1');

$usd->{n_sign_posn} = 2;
is($usd->format_price(-9.95), 'USD9.9500-', 'n_sign_posn=2');

$usd->{n_sign_posn} = 3;
is($usd->format_price(-9.95), '-USD9.9500', 'n_sign_posn=3');

$usd->{n_sign_posn} = 4;
is($usd->format_price(-9.95), 'USD-9.9500', 'n_sign_posn=4');

$usd->{n_cs_precedes} = 1;
$usd->{n_sign_posn} = 3;
$usd->{n_sep_by_space} = 0;
is($usd->format_price(-9.95), '-USD9.9500', 'cs_precedes=1,sep_by_space=0');

$usd->{n_sep_by_space} = 1;
is($usd->format_price(-9.95), '-USD 9.9500', 'cs_precedes=1,sep_by_space=1');

$usd->{n_sep_by_space} = 2;
is($usd->format_price(-9.95), '- USD9.9500', 'cs_precedes=1,sep_by_space=2');

$usd->{n_cs_precedes} = 0;
$usd->{n_sign_posn} = 3;
$usd->{n_sep_by_space} = 0;
is($usd->format_price(-9.95), '9.9500-USD', 'cs_precedes=0,sep_by_space=0');

$usd->{n_sep_by_space} = 1;
is($usd->format_price(-9.95), '9.9500 -USD', 'cs_precedes=0,sep_by_space=1');

$usd->{n_sep_by_space} = 2;
is($usd->format_price(-9.95), '9.9500- USD', 'cs_precedes=0,sep_by_space=2');
my %results = ('sep=0 posn=0 prec=0'    => '(9.9500USD)',
               'sep=0 posn=0 prec=1'    => '(USD9.9500)',
               'sep=0 posn=1 prec=0'    => '-9.9500USD',
               'sep=0 posn=1 prec=1'    => '-USD9.9500',
               'sep=0 posn=2 prec=0'    => '9.9500USD-',
               'sep=0 posn=2 prec=1'    => 'USD9.9500-',
               'sep=0 posn=3 prec=0'    => '9.9500-USD',
               'sep=0 posn=3 prec=1'    => '-USD9.9500',
               'sep=0 posn=4 prec=0'    => '9.9500USD-',
               'sep=0 posn=4 prec=1'    => 'USD-9.9500',
               'sep=1 posn=0 prec=0'    => '(9.9500 USD)',
               'sep=1 posn=0 prec=1'    => '(USD 9.9500)',
               'sep=1 posn=1 prec=0'    => '-9.9500 USD',
               'sep=1 posn=1 prec=1'    => '-USD 9.9500',
               'sep=1 posn=2 prec=0'    => '9.9500 USD-',
               'sep=1 posn=2 prec=1'    => 'USD 9.9500-',
               'sep=1 posn=3 prec=0'    => '9.9500 -USD',
               'sep=1 posn=3 prec=1'    => '-USD 9.9500',
               'sep=1 posn=4 prec=0'    => '9.9500 USD-',
               'sep=1 posn=4 prec=1'    => 'USD- 9.9500',
               'sep=2 posn=0 prec=0'    => '(9.9500USD)',
               'sep=2 posn=0 prec=1'    => '(USD9.9500)',
               'sep=2 posn=1 prec=0'    => '- 9.9500USD',
               'sep=2 posn=1 prec=1'    => '- USD9.9500',
               'sep=2 posn=2 prec=0'    => '9.9500USD -',
               'sep=2 posn=2 prec=1'    => 'USD9.9500 -',
               'sep=2 posn=3 prec=0'    => '9.9500- USD',
               'sep=2 posn=3 prec=1'    => '- USD9.9500',
               'sep=2 posn=4 prec=0'    => '9.9500USD -',
               'sep=2 posn=4 prec=1'    => 'USD -9.9500'
              );

foreach my $sep (0..2)
{
    foreach my $posn (0..4)
    {
        foreach my $prec (0..1)
        {
            my $key = "sep=$sep posn=$posn prec=$prec";
            my $want = $results{$key};
            $usd->{n_cs_precedes} = $prec;
            $usd->{n_sign_posn} = $posn;
            $usd->{n_sep_by_space} = $sep;
            is($usd->format_price(-9.95), $want, "$key -> $want");
        }
    }
}


my %prices = ( 1234    => "EUR 1.234,00",
               56      => "EUR 56,00",
               75.2345 => "EUR 75,23",
               12578.5 => "EUR 12.578,50" );

my $nf = Number::Format->new(
                             -int_curr_symbol   => 'EUR',
                             -currency_symbol   => '$',
                             -decimal_point     => ',',
                             -frac_digits       => 2,
                             -int_frac_digits   => 2,
                             -n_cs_precedes     => 1,
                             -n_sep_by_space    => 1,
                             -n_sign_posn       => 1,
                             -negative_sign     => '-',
                             -p_cs_precedes     => 1,
                             -p_sep_by_space    => 1,
                             -p_sign_posn       => 1,
                             -positive_sign     => '',
                             -thousands_sep     => '.',
                             -mon_thousands_sep => '.',
                             -decimal_fill      => 1,
                             -decimal_digits    => 2,
                             -mon_decimal_point => ',',
                            );

for my $price ( sort keys %prices )
{
    my $want = $prices{$price};
    is($nf->format_price($price, 2), $want, "$price -> $want");
}
