/************************************************************************
 *
 * 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];

    int 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
    for (--i; i >= 0; --i)
        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);
}
