blob: fd3a0f79e2058b67d1c36e234bee5dd287b8d239 [file] [log] [blame]
/************************************************************************
*
* 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 <rw_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);
}