| /************************************************************************ |
| * |
| * valcmp.cpp - test exercising the rw_valcmp() family |
| * of 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 2005-2006 Rogue Wave Software. |
| * |
| **************************************************************************/ |
| |
| #include <valcmp.h> |
| |
| #include <stdio.h> // for fprintf, size_t |
| |
| |
| // the exit status of the whole test |
| static int exit_status; |
| |
| |
| template <class T, class U> |
| void |
| test_case (const T* /* dummy */, const U* /* dummy */, |
| const char *tname, const char *uname, |
| int line, int expect, |
| const char *str1, const char *str2, size_t nelems, int flags) |
| { |
| T buf1 [256] = { T () }; |
| U buf2 [256] = { U () }; |
| |
| typedef unsigned char UChar; |
| |
| for (size_t i = 0; i != nelems; ++i) { |
| buf1 [i] = T (_RWSTD_STATIC_CAST (UChar, str1 [i])); |
| buf2 [i] = U (_RWSTD_STATIC_CAST (UChar, str2 [i])); |
| } |
| |
| const int result = rw_valcmp (buf1, buf2, nelems, flags); |
| |
| if (result != expect) { |
| fprintf (stderr, |
| "line %d: %d == rw_valcmp(const %s* = %p, const %s* = %p, " |
| "%u, %d), got %d\n", |
| line, expect, tname, (void*)buf1, uname, (void*)buf2, |
| unsigned (nelems), flags, result); |
| exit_status = 1; |
| } |
| } |
| |
| |
| struct Case { |
| int line; |
| int expect; |
| const char *str1; |
| const char *str2; |
| size_t nelems; |
| int flags; |
| }; |
| |
| extern const Case cases [] = { |
| |
| #define CASE(expect, str1, str2, nelems, flags) \ |
| { __LINE__, expect, str1, str2, nelems, flags } |
| |
| CASE ( 0, 0, 0, 0, 0), |
| |
| CASE ( 0, "", "", 0, 0), |
| CASE ( 0, "", "", 1, 0), |
| |
| |
| CASE ( 0, "a", "\0", 0, 0), |
| CASE (+1, "a", "\0", 1, 0), |
| CASE (+1, "a", "\0", 2, 0), |
| |
| CASE ( 0, "\0", "a", 0, 0), |
| CASE (-1, "\0", "a", 1, 0), |
| CASE (-1, "\0", "a", 2, 0), |
| |
| |
| CASE ( 0, "ab", "\0\0", 0, 0), |
| CASE (+1, "ab", "\0\0", 1, 0), |
| CASE (+1, "ab", "\0\0", 2, 0), |
| CASE (+1, "ab", "\0\0", 3, 0), |
| |
| CASE ( 0, "\0\0", "ab", 0, 0), |
| CASE (-1, "\0\0", "ab", 1, 0), |
| CASE (-1, "\0\0", "ab", 2, 0), |
| CASE (-1, "\0\0", "ab", 3, 0), |
| |
| |
| CASE ( 0, "ab", "a\0", 0, 0), |
| CASE ( 0, "ab", "a\0", 1, 0), |
| CASE (+1, "ab", "a\0", 2, 0), |
| CASE (+1, "ab", "a\0", 3, 0), |
| |
| CASE ( 0, "a\0", "ab", 0, 0), |
| CASE ( 0, "a\0", "ab", 1, 0), |
| CASE (-1, "a\0", "ab", 2, 0), |
| CASE (-1, "a\0", "ab", 3, 0), |
| |
| |
| CASE ( 0, "\0ab", "\0a\0", 0, 0), |
| CASE ( 0, "\0ab", "\0a\0", 1, 0), |
| CASE ( 0, "\0ab", "\0a\0", 2, 0), |
| CASE (+1, "\0ab", "\0a\0", 3, 0), |
| CASE (+1, "\0ab", "\0a\0", 4, 0), |
| |
| CASE ( 0, "\0a\0", "\0ab", 0, 0), |
| CASE ( 0, "\0a\0", "\0ab", 1, 0), |
| CASE ( 0, "\0a\0", "\0ab", 2, 0), |
| CASE (-1, "\0a\0", "\0ab", 3, 0), |
| CASE (-1, "\0a\0", "\0ab", 4, 0), |
| |
| |
| CASE ( 0, "abc", "aB\0", 0, 0), |
| CASE ( 0, "abc", "aB\0", 1, 0), |
| CASE (+1, "abc", "aB\0", 2, 0), |
| CASE (+1, "abc", "aB\0", 3, 0), |
| CASE (+1, "abc", "aB\0", 4, 0), |
| |
| CASE ( 0, "aB\0", "abc", 0, 0), |
| CASE ( 0, "aB\0", "abc", 1, 0), |
| CASE (-1, "aB\0", "abc", 2, 0), |
| CASE (-1, "aB\0", "abc", 3, 0), |
| CASE (-1, "aB\0", "abc", 4, 0), |
| |
| |
| CASE ( 0, "a\0b\0c\0d", "a\0b\0c\0R", 0, 0), |
| CASE ( 0, "a\0b\0c\0e", "a\0b\0c\0S", 1, 0), |
| CASE ( 0, "a\0b\0c\0f", "a\0b\0c\0T", 2, 0), |
| CASE ( 0, "a\0b\0c\0g", "a\0b\0c\0U", 3, 0), |
| CASE ( 0, "a\0b\0c\0h", "a\0b\0c\0V", 4, 0), |
| CASE ( 0, "a\0b\0c\0i", "a\0b\0c\0W", 5, 0), |
| CASE ( 0, "a\0b\0c\0j", "a\0b\0c\0X", 6, 0), |
| CASE (+1, "a\0b\0c\0k", "a\0b\0c\0Y", 7, 0), |
| CASE (+1, "a\0b\0c\0l", "a\0b\0c\0Z", 8, 0), |
| |
| CASE ( 0, "a\0b\0c\0R", "a\0b\0c\0d", 0, 0), |
| CASE ( 0, "a\0b\0c\0S", "a\0b\0c\0d", 1, 0), |
| CASE ( 0, "a\0b\0c\0T", "a\0b\0c\0d", 2, 0), |
| CASE ( 0, "a\0b\0c\0U", "a\0b\0c\0d", 3, 0), |
| CASE ( 0, "a\0b\0c\0V", "a\0b\0c\0d", 4, 0), |
| CASE ( 0, "a\0b\0c\0W", "a\0b\0c\0d", 5, 0), |
| CASE ( 0, "a\0b\0c\0X", "a\0b\0c\0d", 6, 0), |
| CASE (-1, "a\0b\0c\0Y", "a\0b\0c\0d", 7, 0), |
| CASE (-1, "a\0b\0c\0Z", "a\0b\0c\0d", 8, 0), |
| |
| |
| CASE ( 0, "a\0b\0c\0R", "a\0b\0c\0d", 0, CMP_NOCASE), |
| CASE ( 0, "a\0b\0c\0S", "a\0b\0c\0e", 1, CMP_NOCASE), |
| CASE ( 0, "a\0b\0c\0T", "a\0b\0c\0f", 2, CMP_NOCASE), |
| CASE ( 0, "a\0b\0c\0U", "a\0b\0c\0g", 3, CMP_NOCASE), |
| CASE ( 0, "a\0b\0c\0V", "a\0b\0c\0h", 4, CMP_NOCASE), |
| CASE ( 0, "a\0b\0c\0W", "a\0b\0c\0i", 5, CMP_NOCASE), |
| CASE ( 0, "a\0b\0c\0X", "a\0b\0c\0j", 6, CMP_NOCASE), |
| CASE (+1, "a\0b\0c\0Y", "a\0b\0c\0k", 7, CMP_NOCASE), |
| CASE (+1, "a\0b\0c\0Z", "a\0b\0c\0l", 8, CMP_NOCASE), |
| |
| CASE ( 0, "A\0b\0c\0d", "a\0B\0c\0R", 0, CMP_NOCASE), |
| CASE ( 0, "A\0b\0c\0e", "a\0B\0c\0S", 1, CMP_NOCASE), |
| CASE ( 0, "A\0b\0c\0f", "a\0B\0c\0T", 2, CMP_NOCASE), |
| CASE ( 0, "A\0b\0c\0g", "a\0B\0c\0U", 3, CMP_NOCASE), |
| CASE ( 0, "A\0b\0c\0h", "a\0B\0c\0V", 4, CMP_NOCASE), |
| CASE ( 0, "A\0b\0c\0i", "a\0B\0c\0W", 5, CMP_NOCASE), |
| CASE ( 0, "A\0b\0c\0j", "a\0B\0c\0X", 6, CMP_NOCASE), |
| CASE (-1, "A\0b\0c\0k", "a\0B\0c\0Y", 7, CMP_NOCASE), |
| CASE (-1, "A\0b\0c\0l", "a\0B\0c\0Z", 8, CMP_NOCASE), |
| |
| |
| CASE ( 0, "Abc", "aB\0", 0, CMP_NOCASE), |
| CASE ( 0, "Abc", "aB\0", 1, CMP_NOCASE), |
| CASE ( 0, "Abc", "aB\0", 2, CMP_NOCASE), |
| CASE (+1, "Abc", "aB\0", 3, CMP_NOCASE), |
| CASE (+1, "Abc", "aB\0", 4, CMP_NOCASE), |
| |
| CASE ( 0, "aB\0", "Abc", 0, CMP_NOCASE), |
| CASE ( 0, "aB\0", "Abc", 1, CMP_NOCASE), |
| CASE ( 0, "aB\0", "Abc", 2, CMP_NOCASE), |
| CASE (-1, "aB\0", "Abc", 3, CMP_NOCASE), |
| CASE (-1, "aB\0", "Abc", 4, CMP_NOCASE), |
| |
| |
| CASE ( 0, "abcd", "abc\0", 0, CMP_NULTERM), |
| CASE ( 0, "abcd", "abc\0", 1, CMP_NULTERM), |
| CASE ( 0, "abcd", "abc\0", 2, CMP_NULTERM), |
| CASE ( 0, "abcd", "abc\0", 3, CMP_NULTERM), |
| CASE (+1, "abcd", "abc\0", 4, CMP_NULTERM), |
| CASE (+1, "abcd", "abc\0", 5, CMP_NULTERM), |
| |
| CASE ( 0, "abc\0", "abcd", 0, CMP_NULTERM), |
| CASE ( 0, "abc\0", "abcd", 1, CMP_NULTERM), |
| CASE ( 0, "abc\0", "abcd", 2, CMP_NULTERM), |
| CASE ( 0, "abc\0", "abcd", 3, CMP_NULTERM), |
| CASE (-1, "abc\0", "abcd", 4, CMP_NULTERM), |
| CASE (-1, "abc\0", "abcd", 5, CMP_NULTERM) |
| }; |
| |
| |
| template <class T, class U> |
| void |
| test_all_cases (const T* /* dummy */, const U* /* dummy */, |
| const char *tname, const char *uname) |
| { |
| // print out the name of the specialization being tested |
| static const int one_time_per_specialization = |
| printf ("rw_valcmp(const %s*, const %s*, size_t, int)\n", |
| tname, uname); |
| |
| _RWSTD_UNUSED (one_time_per_specialization); |
| |
| for (size_t i = 0; i != sizeof cases / sizeof cases; ++i) { |
| test_case ((T*)0, (U*)0, |
| tname, uname, |
| cases [i].line, |
| cases [i].expect, |
| cases [i].str1, |
| cases [i].str2, |
| cases [i].nelems, |
| cases [i].flags); |
| } |
| } |
| |
| |
| #define STR(x) #x |
| |
| |
| template <class T> |
| void |
| run_test (const T* /* dummy */, const char *tname) |
| { |
| #define TEST_ALL_CASES(U) test_all_cases ((T*)0, (U*)0, tname, STR (U)) |
| |
| // run all test cases for all integral types except bool |
| TEST_ALL_CASES (char); |
| |
| TEST_ALL_CASES (signed char); |
| TEST_ALL_CASES (unsigned char); |
| TEST_ALL_CASES (short); |
| TEST_ALL_CASES (unsigned short); |
| TEST_ALL_CASES (int); |
| TEST_ALL_CASES (unsigned int); |
| TEST_ALL_CASES (long); |
| TEST_ALL_CASES (unsigned long); |
| |
| #ifdef _RWSTD_LONG_LONG |
| |
| TEST_ALL_CASES (_RWSTD_LONG_LONG); |
| TEST_ALL_CASES (unsigned _RWSTD_LONG_LONG); |
| |
| #endif // _RWSTD_LONG_LONG |
| |
| #ifndef _RWSTD_NO_WCHAR_T |
| |
| TEST_ALL_CASES (wchar_t); |
| |
| #endif // _RWSTD_NO_WCHAR_T |
| } |
| |
| |
| int main () |
| { |
| #define RUN_TEST(T) run_test ((T*)0, STR (T)) |
| |
| // run the for all integral types except bool |
| RUN_TEST (char); |
| RUN_TEST (signed char); |
| RUN_TEST (unsigned char); |
| RUN_TEST (short); |
| RUN_TEST (unsigned short); |
| RUN_TEST (int); |
| RUN_TEST (unsigned int); |
| RUN_TEST (long); |
| RUN_TEST (unsigned long); |
| |
| #ifdef _RWSTD_LONG_LONG |
| |
| RUN_TEST (_RWSTD_LONG_LONG); |
| RUN_TEST (unsigned _RWSTD_LONG_LONG); |
| |
| #endif // _RWSTD_LONG_LONG |
| |
| #ifndef _RWSTD_NO_WCHAR_T |
| |
| RUN_TEST (wchar_t); |
| |
| #endif // _RWSTD_NO_WCHAR_T |
| |
| return exit_status; |
| } |