/************************************************************************
 *
 * 22.locale.messages.stdcxx-508_542.cpp
 *
 * the regression test for STDCXX-508, STDCXX-542 issues
 *
 * $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 <cstdio>
#include <cassert>
#include <locale>

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

#ifdef _MSC_VER
#include <crtdbg.h>
#endif

#ifdef _WIN32
#  define CATALOG "test"
#  define MSG_EXT ".rc"
#  define CAT_EXT ".dll"
#else
#  define CATALOG "./test"
#  define MSG_EXT ".msg"
#  define CAT_EXT ".cat"
#endif


static int run_test (int, char**)
{
    const char * catalog =
        "First set, first message\0\0"
        "Second set, first message\0\0";

    rw_create_catalog (CATALOG MSG_EXT, catalog);
    
    typedef std::messages<char> messagesT;

    const std::locale loc;

    const messagesT& msgs =
        std::use_facet<messagesT>(loc);

    messagesT::catalog cats [4];

    std::size_t i;

    // test STDCXX-508
    for (i = 0; i < sizeof (cats) / sizeof (*cats); ++i) {
        cats [i] = msgs.open (CATALOG CAT_EXT, loc);
        assert (-1 != cats [i]);
    }
    
    // test STDCXX-542
    while (i-- > 0)
        msgs.close (cats [i]);

    std::remove (CATALOG CAT_EXT);
    
    return 0;
}


int main (int argc, char* argv[])
{
#ifdef _MSC_VER
    // disable GUI window from abort()
    _CrtSetReportMode (_CRT_ERROR, _CRTDBG_MODE_DEBUG);
#endif

    return rw_test (argc, argv, __FILE__,
                    "lib.locale.messages",
                    "STDCXX-508;STDCXX-542",
                    run_test,
                    "",
                    (void*)0);
}
