/************************************************************************
 *
 * 0.strcmp.cpp - test exercising the rw_strcmp() utility functions
 *
 * $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.
 *
 * Copyright 2004-2006 Rogue Wave Software.
 * 
 **************************************************************************/

#include <valcmp.h>   // for rw_strncmp()

#include <stdio.h>    // for fprintf()

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

static int
run_test (int, char*[])
{
    int exit_status = 0;

    // rw_strncmp():
    //
    // compares up to a maximum number of characters from the two strings
    // posisbly including any embedded NULs (when the CMP_NULTERM bit is
    // clear) and returns -1, 0, or +1 if the first string compares less,
    // equal, or greater, respectively, than the second string, or the
    // offset of the first mismatched character (when the CMP_RETOFF bit
    // is set) or an out of bounds value such as -1 when no such character
    // exists
    //
    // rw_strncmp(s1, s2) is equivalent to a call to strcmp(s1, s2) when
    // the type of s1 and s2 is char*, wcscmp(s1, s2) when the type is
    // wchar_t*
    //
    // when (N != SIZE_MAX) is true,
    // rw_strncmp(s1, s2, N, CMP_NULTERM) is equivalent to a call to
    // strncmp(s1, s2, N) or wcsncmp(s1, s2, N), respectively
    //
    // rw_strncmp(s1, s2, N) is equivalent to a call to memcmp(s1, s2, N)
    // or wmemcmp(s1, s2, n), respectively

#undef TEST
#define TEST(expect, s1, s2, nc, fl)                                      \
    do {                                                                  \
        const int result = (fl) < 0 ?                                     \
            rw_strncmp (s1, s2, nc) : rw_strncmp (s1, s2, nc, fl);        \
        if (expect != result) {                                           \
           exit_status = 2;                                               \
           fprintf (stderr, "line %d: rw_strncmp(%p, %p, %u, %d) == %d, " \
                            "got %d\n", __LINE__, (const void*)s1,        \
                            (const void*)s2, unsigned (nc), fl, expect,   \
                            result);                                      \
        }                                                                 \
    } while (0)

    //////////////////////////////////////////////////////////////////
    printf ("rw_strncmp(const char*, const char*, size_t, int)\n");

    //     +------------------ expected result
    //     |  +--------------- first string
    //     |  |   +----------- second string
    //     |  |   |    +------ value of N
    //     |  |   |    |   +-- value of flags, or none when -1
    //     |  |   |    |   |
    //     v  v   v    v   v
    TEST ( 0, "", "",  _RWSTD_SIZE_MAX, -1);
    TEST (+1, "a", "", _RWSTD_SIZE_MAX, -1);
    TEST (-1, "", "a", _RWSTD_SIZE_MAX, -1);

    TEST ( 0, "a",    "b",    0, -1);
    TEST ( 0, "a\0b", "a\0b", 3, -1);
    TEST ( 0, "a\0c", "a\0b", 3, -1);
    TEST ( 0, "a\0b", "a\0c", 3, -1);

    TEST ( 0, "a\0b", "a\0b", 3, CMP_NULTERM);
    TEST (+1, "a\0c", "a\0b", 3, 0);
    TEST (-1, "a\0b", "a\0c", 3, 0);

    TEST (-1, "a\0b", "a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, "a\0c", "a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, "a\0b", "a\0c", 3, CMP_NULTERM | CMP_RETOFF);

    TEST (-1, "a\0b", "a\0b", 3, CMP_RETOFF);
    TEST ( 2, "a\0c", "a\0b", 3, CMP_RETOFF);
    TEST ( 2, "a\0b", "a\0c", 3, CMP_RETOFF);

#ifndef _RWSTD_NO_WCHAR_T

    //////////////////////////////////////////////////////////////////
    printf ("rw_strncmp(const wchar_t*, const wchar_t*, size_t, int)\n");

    TEST ( 0, L"",  L"",  ~0, -1);
    TEST (+1, L"a", L"",  ~0, -1);
    TEST (-1, L"",  L"a", ~0, -1);

    TEST ( 0, L"a",    L"b",    0, -1);
    TEST ( 0, L"a\0b", L"a\0b", 3, -1);
    TEST ( 0, L"a\0c", L"a\0b", 3, -1);
    TEST ( 0, L"a\0b", L"a\0c", 3, -1);

    TEST ( 0, L"a\0b", L"a\0b", 3, 0);
    TEST (+1, L"a\0c", L"a\0b", 3, 0);
    TEST (-1, L"a\0b", L"a\0c", 3, 0);

    TEST (-1, L"a\0b", L"a\0b", 3, CMP_RETOFF);
    TEST (+2, L"a\0c", L"a\0b", 3, CMP_RETOFF);
    TEST (+2, L"a\0b", L"a\0c", 3, CMP_RETOFF);

    TEST (-1, L"a\0b", L"a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, L"a\0c", L"a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, L"a\0b", L"a\0c", 3, CMP_NULTERM | CMP_RETOFF);

    //////////////////////////////////////////////////////////////////
    printf ("rw_strncmp(const wchar_t*, const char*, size_t, int)\n");

    TEST ( 0, L"", "",  ~0, -1);
    TEST (+1, L"a", "", ~0, -1);
    TEST (-1, L"", "a", ~0, -1);

    TEST ( 0, L"a",    "b",    0, -1);
    TEST ( 0, L"a\0b", "a\0b", 3, -1);
    TEST ( 0, L"a\0c", "a\0b", 3, -1);
    TEST ( 0, L"a\0b", "a\0c", 3, -1);

    TEST ( 0, L"a\0b", "a\0b", 3, CMP_NULTERM);
    TEST ( 0, L"a\0c", "a\0b", 3, CMP_NULTERM);
    TEST ( 0, L"a\0b", "a\0c", 3, CMP_NULTERM);

    TEST (-1, L"a\0b", "a\0b", 3, CMP_RETOFF);
    TEST ( 2, L"a\0c", "a\0b", 3, CMP_RETOFF);
    TEST ( 2, L"a\0b", "a\0c", 3, CMP_RETOFF);

    TEST (-1, L"a\0b", "a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, L"a\0c", "a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, L"a\0b", "a\0c", 3, CMP_NULTERM | CMP_RETOFF);

    //////////////////////////////////////////////////////////////////
    printf ("rw_strncmp(const char*, const wchar_t*, size_t, int)\n");

    TEST ( 0, "", L"",  ~0, -1);
    TEST (+1, "a", L"", ~0, -1);
    TEST (-1, "", L"a", ~0, -1);

    TEST ( 0, "a",    L"b",    0, -1);
    TEST ( 0, "a\0b", L"a\0b", 3, -1);
    TEST ( 0, "a\0c", L"a\0b", 3, -1);
    TEST ( 0, "a\0b", L"a\0c", 3, -1);

    TEST ( 0, "a\0b", L"a\0b", 3, CMP_NULTERM);
    TEST ( 0, "a\0c", L"a\0b", 3, CMP_NULTERM);
    TEST ( 0, "a\0b", L"a\0c", 3, CMP_NULTERM);

    TEST (-1, "a\0b", L"a\0b", 3, CMP_RETOFF);
    TEST ( 2, "a\0c", L"a\0b", 3, CMP_RETOFF);
    TEST ( 2, "a\0b", L"a\0c", 3, CMP_RETOFF);

    TEST (-1, "a\0b", L"a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, "a\0c", L"a\0b", 3, CMP_NULTERM | CMP_RETOFF);
    TEST (-1, "a\0b", L"a\0c", 3, CMP_NULTERM | CMP_RETOFF);

#endif   // _RWSTD_NO_WCHAR_T

    return exit_status;
}

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

int main (int argc, char *argv[])
{
    return run_test (argc, argv);
}
