The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# -*- CPerl -*-

use Test::More;
use strict;
use warnings;

BEGIN {
    # Do not test when under OpenBSD; see
    # http://www.in-ulm.de/~mascheck/locale/ and
    # http://undeadly.org/cgi?action=article&sid=20030206041352
    plan skip_all => 'OpenBSD C library lacks locale support'
        if $^O =~ /^(openbsd|dragonfly)$/;
    plan 'no_plan';
}

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

SKIP:
{
    setlocale(&LC_ALL, 'de_DE')
        or setlocale(&LC_ALL, 'de_DE.utf8')
            or setlocale(&LC_ALL, 'de_DE.ISO8859-1')
                or skip("Unable to set de_DE locale", 1);
    my $german = Number::Format->new();

    # On some sysetms (notably Mac OS X) the locale data is wrong for de_DE.
    # Force it to match what we would see on Linux so the test passes.
    $german->{n_cs_precedes}  = $german->{p_cs_precedes}  = '0';
    $german->{n_sep_by_space} = $german->{p_sep_by_space} = '1';
    $german->{thousands_sep}  = '.';
    $german->{decimal_point}  = ',';

    my $curr = $german->{int_curr_symbol}; # may be EUR or DEM
    my $num  = "123.456,79";

    is($german->format_price(123456.789), "$num $curr", "euros");
    is($german->unformat_number($num), 123456.79, "unformat German");
}

SKIP:
{
    setlocale(&LC_ALL, 'ru_RU')
        or setlocale(&LC_ALL, 'ru_RU.utf8')
            or setlocale(&LC_ALL, 'ru_RU.ISO8859-5')
                or skip("Unable to set ru_RU locale", 1);
    my $russian = Number::Format->new();

    # On some sysetms (notably Cygwin) the locale data is wrong for ru_RU.
    # Force it to match what we would see on Linux so the test passes.
    $russian->{n_sep_by_space} = $russian->{p_sep_by_space} = '1';
    my $sep = $russian->{mon_thousands_sep};
    my $dec = $russian->{mon_decimal_point};
    my $num = "123${sep}456${dec}79";

    like($russian->format_price(123456.789), qr/^$num RU[RB] $/, "rubles");
    is($russian->unformat_number("$num RUB "), 123456.79, "unformat rubles");
    is($russian->unformat_number($num), 123456.79, "unformat Russian 1");
    $num = "123${sep}456$russian->{decimal_point}79";
    is($russian->unformat_number($num), 123456.79, "unformat Russian 2");
}

my $num = "123,456.79";

SKIP:
{
    setlocale(&LC_ALL, 'en_US')
        or setlocale(&LC_ALL, 'en_US.utf8')
            or setlocale(&LC_ALL, 'en_US.ISO8859-1')
                or skip("Unable to set en_US locale", 1);
    my $english = Number::Format->new();

    is($english->format_price(123456.789), "USD $num", "USD");
    is($english->unformat_number($num), 123456.79, "unformat English");
}

setlocale(&LC_ALL, "C")
    or skip("Unable to set en_US locale", 1);
my $c = Number::Format->new();
is($c->format_price(123456.789, 2, "currency_symbol"),
   "\$ $num", "Dollar sign");
is($c->unformat_number($num), 123456.79, "unformat C");