/************************************************************************
 *
 * 22.locale.messages.mt.cpp
 *
 * test exercising the thread safety of the messages 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 <locale>

#include <driver.h>      // for rw_test()
#include <rw_locale.h>   // for rw_create_catalog()
#include <rw_thread.h>
#include <valcmp.h>      // for rw_strncmp ()

#include <cstring>   // for strlen()
#include <cstdio>    // for remove()

// maximum number of threads allowed by the command line interface
#define MAX_THREADS      32
#define MAX_LOOPS    100000

// default number of threads (will be adjusted to the number
// of processors/cores later)
int rw_opt_nthreads = 1;

// the number of times each thread should iterate (unless specified
// otherwise on the command line)
int rw_opt_nloops = 100000;

// locale for threads to share
static const
std::locale locale;

// message catalog for threads to share
static
std::messages_base::catalog catalog;

static
std::messages_base::catalog wcatalog;

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

#ifndef _WIN32
#  define CAT_NAME "./rwstdmessages.cat"
#  define MSG_NAME "rwstdmessages.msg"
#else
#  define CAT_NAME "rwstdmessages.dll"
#  define MSG_NAME "rwstdmessages.rc"
#endif

#define MAX_SETS 5
#define MAX_MESSAGES  5


int msg_id (int set, int id)
{
#ifdef _WIN32

    return (set - 1) * 5 + id;

#else

    _RWSTD_UNUSED (set);
    return id;

#endif
}

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

static const char* const
messages [MAX_SETS][MAX_MESSAGES] = {
    { "First set, first message",
      "First set, second message",
      "First set, third message",
      "First set, fourth message",
      "First set, fifth message"
    },
    { "Second set, first message",
      "Second set, second message",
      "Second set, third message",
      "Second set, fourth message",
      "Second set, fifth message"
    },
    { "Third set, first message",
      "Third set, second message",
      "Third set, third message",
      "Third set, fourth message",
      "Third set, fifth message"
    },
    { "Fourth set, first message",
      "Fourth set, second message",
      "Fourth set, third message",
      "Fourth set, fourth message",
      "Fourth set, fifth message"
    },
    { "Fifth set, first message",
      "Fifth set, second message",
      "Fifth set, third message",
      "Fifth set, fourth message",
      "Fifth set, fifth message"
    }
};

static std::string str_messages;

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

template <class T>
void test_open_close (const std::locale& loc,
                      const std::messages<T>& msgs,
                      const std::string& name)
{
    std::messages_base::catalog cat =
        (msgs.open) (name, loc);

    RW_ASSERT (! (cat < 0));

    (msgs.close) (cat);
}

template <class T>
void test_get (const std::messages<T>& msgs,
               const std::messages_base::catalog cat,
               int set, int msgid,
               const std::basic_string<T>& dflt)
{
    // the msg_id() thing seems like a bug to me. if anything, the user
    // should never need to write or call msg_id().

    const typename std::messages<T>::string_type res =
        msgs.get (cat, set, msg_id (set, msgid), dflt);

    RW_ASSERT (!rw_strncmp (messages [set-1][msgid-1], res.c_str ()));
}

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

extern "C" {

bool test_char;    // exercise messages<char>
bool test_wchar;   // exercise messages<wchar_t>

static void*
thread_func (void*)
{
    const std::string name (CAT_NAME);

    const std::messages<char>& nmsgs =
        std::use_facet<std::messages<char> >(locale);

    const std::string ndflt ("\1\2\3\4");

#ifndef _RWSTD_NO_WCHAR_T
    const std::messages<wchar_t>& wmsgs =
        std::use_facet<std::messages<wchar_t> >(locale);

    const std::wstring wdflt (L"\1\2\3\4");
#endif // _RWSTD_NO_WCHAR_T

    for (int i = 0; i != rw_opt_nloops; ++i) {

        int set   = 1 + i % MAX_SETS;
        int msgid = 1 + i % MAX_MESSAGES;

        if (test_char) {
            if (i & 1) {
                test_get<char>(nmsgs, catalog, set, msgid, ndflt);
            }
            else {
                test_open_close<char>(locale, nmsgs, name);
            }
        }

        if (test_wchar) {

#ifndef _RWSTD_NO_WCHAR_T

            if (i & 1) {
                test_get<wchar_t>(wmsgs, wcatalog, set, msgid, wdflt);
            }
            else {
                test_open_close<wchar_t>(locale, wmsgs, name);
            }

#endif // _RWSTD_NO_WCHAR_T

        }
    }

    return 0;
}

}   // extern "C"

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

static int
run_test (int, char**)
{
    for (int i = 0; i < MAX_SETS; ++i) {
        for (int j = 0; j < MAX_MESSAGES; ++j)
            str_messages.append (messages [i][j], std::strlen (messages [i][j]) + 1);

        str_messages.append (1, '\0');
    }

    // generate a message catalog
    rw_create_catalog (MSG_NAME, str_messages.c_str ());
    const std::string name (CAT_NAME);

    const std::messages<char>& nmsgs =
        std::use_facet<std::messages<char> >(locale);

    catalog = (nmsgs.open) (name, locale);

#ifndef _RWSTD_NO_WCHAR_T

    const std::messages<wchar_t>& wmsgs =
        std::use_facet<std::messages<wchar_t> >(locale);

    wcatalog = (wmsgs.open) (name, locale);

#endif

    rw_info (0, 0, 0,
             "testing std::messages<charT> with %d thread%{?}s%{;}, "
             "%d iteration%{?}s%{;} each",
             rw_opt_nthreads, 1 != rw_opt_nthreads,
             rw_opt_nloops, 1 != rw_opt_nloops);

    ///////////////////////////////////////////////////////////////////////

    test_char   = true;
    test_wchar  = false;

    rw_info (0, 0, 0, "exercising std::messages<char>");

    int result = 
        rw_thread_pool (0, std::size_t (rw_opt_nthreads), 0,
                        thread_func, 0);

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              rw_opt_nthreads, thread_func);

    ///////////////////////////////////////////////////////////////////////

#ifndef _RWSTD_NO_WCHAR_T

    test_char   = false;
    test_wchar  = true;

    rw_info (0, 0, 0, "exercising std::messages<wchar_t>");

    result = 
        rw_thread_pool (0, std::size_t (rw_opt_nthreads), 0,
                        thread_func, 0);

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              rw_opt_nthreads, thread_func);

    ///////////////////////////////////////////////////////////////////////

    test_char   = true;
    test_wchar  = true;

    rw_info (0, 0, 0, "exercising std::messages<char> and "
                      "std::messages<wchar_t>");

    result = 
        rw_thread_pool (0, std::size_t (rw_opt_nthreads), 0,
                        thread_func, 0);

    rw_error (result == 0, 0, __LINE__,
              "rw_thread_pool(0, %d, 0, %{#f}, 0) failed",
              rw_opt_nthreads, thread_func);

#endif // _RWSTD_NO_WCHAR_T

    ///////////////////////////////////////////////////////////////////////

    (nmsgs.close) (catalog);

#ifndef _RWSTD_NO_WCHAR_T

    (wmsgs.close) (wcatalog);
    
#endif // _RWSTD_NO_WCHAR_T

    std::remove (CAT_NAME);

    return result;
}

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

int main (int argc, char *argv[])
{
#ifdef _RWSTD_REENTRANT

    // set nthreads to the greater of the number of processors
    // and 2 (for uniprocessor systems) by default
    rw_opt_nthreads = rw_get_cpus ();
    if (rw_opt_nthreads < 2)
        rw_opt_nthreads = 2;

#endif   // _RWSTD_REENTRANT

    return rw_test (argc, argv, __FILE__,
                    "lib.locale.messages",
                    "thread safety", run_test,
                    "|-nloops#0 "        // must be non-negative
                    "|-nthreads#0-* ",    // must be in [0, MAX_THREADS]
                    &rw_opt_nloops,
                    int (MAX_THREADS),
                    &rw_opt_nthreads);
}
