/************************************************************************
 *
 * 22.locale.numpunct.cpp
 *
 * test exercising the std::numpunct facet
 *
 * $Id$
 *
 ***************************************************************************
 *
 * Licensed to the Apache Software  Foundation (ASF) under one or more
 * contributor  license agreements.  See  the NOTICE  file distributed
 * with  this  work  for  additional information  regarding  copyright
 * ownership.   The ASF  licenses this  file to  you under  the Apache
 * License, Version  2.0 (the  "License"); you may  not use  this file
 * except in  compliance with the License.   You may obtain  a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the  License is distributed on an  "AS IS" BASIS,
 * WITHOUT  WARRANTIES OR CONDITIONS  OF ANY  KIND, either  express or
 * implied.   See  the License  for  the  specific language  governing
 * permissions and limitations under the License.
 *
 **************************************************************************/

#include <rw/_defs.h>

#if defined (__IBMCPP__) && !defined (_RWSTD_NO_IMPLICIT_INCLUSION)
// Disable implicit inclusion to work around
// a limitation in IBM's VisualAge 5.0.2.0 (see PR#26959)

#  define _RWSTD_NO_IMPLICIT_INCLUSION
#endif


#include <clocale>   // for struct lconv, setlocale()
#include <cstdio>    // for sprintf()
#include <cstdlib>   // for getenv()
#include <cstring>   // for strcmp()
#include <locale>

#include <rw_driver.h>
#include <rw_environ.h>
#include <rw_locale.h>

/**************************************************************************/

template <class charT>
void run_test (charT*);

template <class charT>
void check_decimal_point (charT, const char*, const std::locale*);

template <class charT>
void check_thousands_sep (charT, const char*, const std::locale*);

template <class charT>
void check_grouping (charT, const char*, const std::string&, const std::locale*);

template <class charT>
void check_falsename (const std::basic_string<charT>&,
                      const char*, const std::locale*);

template <class charT>
void check_truename (const std::basic_string<charT>&,
                     const char*, const std::locale*);

template <class charT>
bool check_numpunct (charT, const char*, const char*, const std::locale*);


/**************************************************************************/

template <class charT>
void run_test (charT, const char *tname)
{
    rw_info (0, 0, __LINE__, "classic \"C\" locale");

    // create a copy of the classic ("C") locale
    std::locale *loc = new std::locale (std::locale::classic ());

    // verify (at compile time) that _byname facets can be used
    // to specialize use_facet() and has_facet()
    typedef std::numpunct_byname<charT> NumpunctByname;

    if (_STD_HAS_FACET (NumpunctByname, *loc))
        _STD_USE_FACET (NumpunctByname, *loc);

    // verify values as per 7.4 of C89, and 7.11, p2 of C99
    check_decimal_point (charT ('.'), tname, loc);

    // verify 22.2.3.1.2, p2
    check_thousands_sep (charT (','), tname, loc);
    check_grouping (charT (), tname, "", loc);

    const charT fn[] = { 'f', 'a', 'l', 's', 'e', '\0' };
    const charT tn[]  = { 't', 'r', 'u', 'e', '\0' };

    check_falsename (std::basic_string<charT>(fn), tname, loc);
    check_truename (std::basic_string<charT>(tn), tname, loc);

    delete loc;
    loc = 0;

    //////////////////////////////////////////////////////////////////
    // verify that the facet can be safely used on its own, without
    // first having to be installed in a locale and retrieved using
    // use_facet

    check_decimal_point (charT ('.'), tname, loc);
    check_thousands_sep (charT (','), tname, loc);
    check_grouping (charT (), tname, "", loc);

    check_falsename (std::basic_string<charT>(fn), tname, loc);
    check_truename (std::basic_string<charT>(tn), tname, loc);

    //////////////////////////////////////////////////////////////////
    // exercise the native locale (affected by the environment
    // variables LANG, LC_ALL, LC_NUMERIC, etc.)
    check_numpunct (charT (), tname, "", loc);   // native locale

    // the name of the first non-C (and non-POSIX) locale
    const char *first_non_c = 0;

    // exercise named locales (including "C" and "POSIX")
    for (const char* s = rw_locales (); *s; s += std::strlen (s) + 1) {
        if (check_numpunct (charT (), tname, s, loc))
            if (   !first_non_c
                && std::strcmp ("C", s)
                && std::strcmp ("POSIX", s))
            first_non_c = s;
    }

    // verify that numpunct behaves correctly when LC_ALL is set
    // to the name of the (non-C, non-POSIX) locale
    char envvar [80];
    std::sprintf (envvar, "LC_ALL=%s", first_non_c);
    rw_putenv (envvar);
    check_numpunct (charT (), tname, "", loc);
}

/**************************************************************************/

char widen (char, const char *s)
{
    return *s;
}

#ifndef _RWSTD_NO_WCHAR_T

wchar_t widen (wchar_t, const char *s)
{
    wchar_t wc = 0;

#  ifndef _RWSTD_NO_MBTOWC

    const int n = s && *s ? std::mbtowc (&wc, s, std::strlen (s)) : 0;

#  else   // if defined (_RWSTD_NO_MBTOWC)

    const int n = 1;

    wc = s ? wchar_t (_RWSTD_STATIC_CAST (unsigned char, *s)) : 0;

#  endif   // _RWSTD_NO_MBTOWC

    return n > 0 ? wc : n ? -1 : 0;
}

#endif   // _RWSTD_NO_WCHAR_T


template <class charT>
bool check_numpunct (charT,
                     const char        *tname,
                     const char        *locname,
                     const std::locale *loc)
{
    // (try to) set the global C locale
    const char *tmploc = std::setlocale (LC_ALL, locname);
    if (!tmploc)
        return false;

    // future setlocale() calls may change tmploc's value, so make a copy
    // (fixed-size char buf is clunky but avoids memory-leak potential)
    char locnamebuf [1024];
    RW_ASSERT ((std::strlen (tmploc) + 1) < sizeof locnamebuf);
    std::strcpy (locnamebuf, tmploc);

    _TRY {

        rw_info (0, 0, __LINE__,
                 "locale (%s) -> \"%s\"; LANG=%s, "
                 "LC_ALL=%s, LC_NUMERIC=%s",
                 locname, loc,
                 std::getenv ("LANG"),
                 std::getenv ("LC_ALL"),
                 std::getenv ("LC_NUMERIC"));

        // get a pointer to lconv
        const std::lconv *plconv = std::localeconv ();

        if (!plconv)
            return false;

        // copy important data; the contents of *plconv may
        // be overwritten by the call sto setlocale() below
        // note that decimal_point at al may be multbyte character
        // strings that need to be widened according to the rules
        // of the same locale
        const charT decimal_point = widen (charT (), plconv->decimal_point);
        const charT thousands_sep = widen (charT (), plconv->thousands_sep);

        const std::string grouping =
            plconv->grouping ? plconv->grouping : "";

        // reset to default locale given by LC_LANG
        std::setlocale (LC_ALL, "");

        loc = new std::locale (locname);

        // check that newly constructed locale matches

        if (   'C' == locnamebuf [0] && '\0' == locnamebuf [1]
            || 'C' == locname [0] && '\0' == locname [1]
            || *loc == std::locale::classic ()) {
            // follow requirements in 22.2.3.1.2. p1, 2, and 3
            check_decimal_point (charT ('.'), tname, loc);
            check_thousands_sep (charT (','), tname, loc);

            check_grouping (charT (), tname, "", loc);
        }
        else {
            // cast to prevent sign extension between (signed) char and wchar_t
            // tmp guards against possibly passing along a "(nil)" pointer
            check_decimal_point (decimal_point, tname, loc);
            check_thousands_sep (thousands_sep, tname, loc);
            check_grouping (charT (), tname, grouping.c_str (), loc);
        }

        // FIXME: exercise falsename() and truename() in named locales

        delete loc;
        loc = 0;
    }
    _CATCH (...) {
        return false;
    }
    return true;
}

/**************************************************************************/

template <class charT>
void check_decimal_point (charT              expect,
                          const char        *tname,
                          const std::locale *loc)
{
    typedef std::numpunct<charT>    Punct;
    typedef std::char_traits<charT> Traits;

    const charT c = loc ?
          _STD_USE_FACET (Punct, *loc).decimal_point ()
        : Punct ().decimal_point ();


    rw_assert (Traits::eq (c, expect), 0, __LINE__,
               "numpunct<%s>::decimal_point() == %{#lc}, got %{#lc}",
               tname, expect, c);
}

/**************************************************************************/

template <class charT>
void check_thousands_sep (charT              expect,
                          const char        *tname,
                          const std::locale *loc)
{
    typedef std::numpunct<charT>    Punct;
    typedef std::char_traits<charT> Traits;

    const charT c = loc ?
          _STD_USE_FACET (Punct, *loc).thousands_sep ()
        : Punct ().thousands_sep ();

    rw_assert (Traits::eq (c, expect), 0, __LINE__,
               "numpunct<%s>::thousands_sep() == %{#lc}, got %{#lc}",
               tname, expect, c);
}

/**************************************************************************/

template <class charT>
void check_grouping (charT,
                     const char        *tname,
                     const std::string &expect,
                     const std::locale *loc)
{
    typedef std::numpunct<charT> Punct;

    const std::string s = loc ?
          _STD_USE_FACET (Punct, *loc).grouping ()
        : Punct ().grouping ();

    if (   s != expect
        && s.size () != expect.size () && s.size () && expect.size ()) {

        // if the grouping is not exactly the same as the expected result,
        // verify that the actual grouping is equivalent to the expected
        // one, e.g., that "\003\003" is equivalent to "\003"

        const std::string *lng  = s.size () > expect.size () ? &expect : &s;
        const std::string *shrt = s.size () < expect.size () ? &expect : &s;

        std::size_t i = shrt->size () - 1;

        for ( ; i != lng->size (); ++i)
            if ((*shrt) [shrt->size () - 1] != (*lng)[i])
                break;

        rw_assert (i == lng->size (), 0, __LINE__,
                   "numpunct<%s>::grouping() equivalent to %{#S}, got %{#S}",
                   tname, &expect, &s);
    }
    else
        rw_assert (s == expect, 0, __LINE__,
                   "numpunct<%s>::grouping() == %{#S}, got %{#S}",
                   tname, &expect, &s);
}

/**************************************************************************/

template <class charT>
void check_falsename (const std::basic_string<charT> &expect,
                      const char                     *tname,
                      const std::locale              *loc)
{
    typedef std::numpunct<charT> Punct;

    const std::basic_string<charT> s = loc ?
          _STD_USE_FACET (Punct, *loc).falsename ()
        : Punct ().falsename ();

    const int char_size = int (sizeof (charT));

    rw_assert (s == expect, 0, __LINE__,
               "numpunct<%s>::falsename() == %{#*S}, got %{#*S}",
               tname, char_size, &expect, char_size, &s);
}

/**************************************************************************/

template <class charT>
void check_truename (const std::basic_string<charT> &expect,
                     const char                     *tname,
                     const std::locale              *loc)
{
    typedef std::numpunct<charT> Punct;

    const std::basic_string<charT> s = loc ?
          _STD_USE_FACET (Punct, *loc).truename ()
        : Punct ().truename ();

    const int char_size = int (sizeof (charT));

    rw_assert (s == expect, 0, __LINE__,
               "numpunct<%s>::truename() == %{#*S}, got %{#*S}",
               tname, char_size, &expect, char_size, &s);
}

/**************************************************************************/

static int
run_test (int, char**)
{
    run_test (char (), "char");

#ifndef _RWSTD_WCHAR_T

    run_test (wchar_t (), "wchar_t");

#endif   // _RWSTD_WCHAR_T

    return 0;
}

/**************************************************************************/

int main (int argc, char *argv[])
{
    return rw_test (argc, argv, __FILE__,
                    "lib.locale.numpunct",
                    "", run_test,
                    "",
                    (void*)0);
}
