You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by an...@apache.org on 2006/05/05 11:22:35 UTC
svn commit: r400025 -
/incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp
Author: antonp
Date: Fri May 5 02:22:32 2006
New Revision: 400025
URL: http://svn.apache.org/viewcvs?rev=400025&view=rev
Log:
2006-05-05 Anton Pevtsov <an...@moscow.vdiweb.com>
STDCXX-4
* 21.string.substr.cpp: New test exercising lib.string.substr.
Added:
incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp (with props)
Added: incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp
URL: http://svn.apache.org/viewcvs/incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp?rev=400025&view=auto
==============================================================================
--- incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp (added)
+++ incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp Fri May 5 02:22:32 2006
@@ -0,0 +1,343 @@
+/***************************************************************************
+ *
+ * 21.string.substr.cpp - string test exercising [lib.string::substr]
+ *
+ * $Id$
+ *
+ ***************************************************************************
+ *
+ * Copyright 2006 The Apache Software Foundation or its licensors,
+ * as applicable.
+ *
+ * Copyright 2006 Rogue Wave Software.
+ *
+ * Licensed 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 <string> // for string
+#include <cstddef> // for size_t
+#include <stdexcept> // for out_of_range
+
+#include <21.strings.h> // for StringMembers
+#include <driver.h> // for rw_test()
+#include <rw_char.h> // for rw_widen()
+
+/**************************************************************************/
+
+// for convenience and brevity
+#define LSTR StringMembers::long_string
+#define LLEN StringMembers::long_string_len
+#define Substr(which) StringMembers::substr_ ## which
+
+typedef StringMembers::OverloadId OverloadId;
+typedef StringMembers::TestCase TestCase;
+typedef StringMembers::Test Test;
+typedef StringMembers::Function MemFun;
+
+static const char* const exceptions[] = {
+ "unknown exception", "out_of_range", "length_error",
+ "bad_alloc", "exception"
+};
+
+/**************************************************************************/
+
+// used to exercise
+// substr ()
+static const TestCase
+void_test_cases [] = {
+
+#undef TEST
+#define TEST(str, res) \
+ { __LINE__, -1, -1, -1, -1, -1, str, sizeof str - 1, 0, 0, \
+ res, sizeof res - 1, 0 }
+
+ // +------------------------------------- controlled sequence
+ // | +----------------- expected result sequence
+ // | |
+ // V V
+ TEST ("abc", "abc"),
+
+ TEST ("", ""),
+ TEST ("\0", "\0"),
+ TEST ("a\0", "a\0"),
+ TEST ("\0a", "\0a"),
+
+ TEST ("a\0\0bcd\0", "a\0\0bcd\0"),
+ TEST ("\0\0abcd\0", "\0\0abcd\0"),
+ TEST ("\0\0ab\0\0", "\0\0ab\0\0"),
+
+ TEST (LSTR, LSTR),
+
+ TEST ("last", "last")
+};
+
+
+/**************************************************************************/
+
+// used to exercise
+// substr (size_type)
+static const TestCase
+size_test_cases [] = {
+
+#undef TEST
+#define TEST(str, off, res, bthrow) \
+ { __LINE__, off, -1, -1, -1, -1, str, sizeof str - 1, 0, 0, \
+ res, sizeof res - 1, bthrow }
+
+ // +--------------------------------------- controlled sequence
+ // | +--------------------- substr() off argument
+ // | | +----------------- expected result sequence
+ // | | | +--- exception info:
+ // | | | | 0 - no exception
+ // | | | | 1 - out_of_range
+ // V V V V
+ TEST ("abc", 0, "abc", 0),
+
+ TEST ("", 0, "", 0),
+ TEST ("\0", 0, "\0", 0),
+ TEST ("\0", 1, "", 0),
+ TEST ("a\0", 0, "a\0", 0),
+ TEST ("a\0", 1, "\0", 0),
+ TEST ("\0a", 0, "\0a", 0),
+ TEST ("\0a", 1, "a", 0),
+
+ TEST ("a\0\0bcd\0", 0, "a\0\0bcd\0", 0),
+ TEST ("a\0\0bcd\0", 1, "\0\0bcd\0", 0),
+ TEST ("a\0\0bcd\0", 6, "\0", 0),
+ TEST ("a\0\0bcd\0", 7, "", 0),
+ TEST ("\0\0abcd\0", 0, "\0\0abcd\0", 0),
+ TEST ("\0\0abcd\0", 1, "\0abcd\0", 0),
+ TEST ("\0\0abcd\0", 2, "abcd\0", 0),
+ TEST ("\0\0ab\0\0", 0, "\0\0ab\0\0", 0),
+ TEST ("\0\0ab\0\0", 1, "\0ab\0\0", 0),
+ TEST ("\0\0ab\0\0", 4, "\0\0", 0),
+ TEST ("\0\0ab\0\0", 6, "", 0),
+
+ TEST (LSTR, 0, LSTR, 0),
+ TEST (LSTR, LLEN - 3, "xx", 0),
+ TEST (LSTR, LLEN - 9, "xxxxxxxx", 0),
+ TEST (LSTR, LLEN - 1, "", 0),
+
+ TEST ("\0", 2, "", 1),
+ TEST ("a", 10, "", 1),
+ TEST (LSTR, LLEN + 10, "", 1),
+
+ TEST ("last", 0, "last", 0)
+};
+
+/**************************************************************************/
+
+// used to exercise
+// substr (size_type, size_type)
+static const TestCase
+size_size_test_cases [] = {
+
+#undef TEST
+#define TEST(str, off, size, res, bthrow) \
+ { __LINE__, off, size, -1, -1, -1, str, sizeof str - 1, 0, 0, \
+ res, sizeof res - 1, bthrow }
+
+ // +------------------------------------------ controlled sequence
+ // | +------------------------ substr() off argument
+ // | | +-------------------- substr() n argument
+ // | | | +----------------- expected result sequence
+ // | | | | +--- exception info:
+ // | | | | | 0 - no exception
+ // | | | | | 1 - out_of_range
+ // V V V V V
+ TEST ("abc", 0, 3, "abc", 0),
+
+ TEST ("", 0, 0, "", 0),
+ TEST ("\0", 0, 1, "\0", 0),
+ TEST ("\0", 0, 0, "", 0),
+ TEST ("\0", 1, 1, "", 0),
+ TEST ("a\0", 0, 2, "a\0", 0),
+ TEST ("a\0", 1, 2, "\0", 0),
+ TEST ("a\0", 0, 1, "a", 0),
+ TEST ("a\0", 1, 1, "\0", 0),
+ TEST ("a\0", 1, 0, "", 0),
+ TEST ("\0a", 0, 2, "\0a", 0),
+ TEST ("\0a", 0, 1, "\0", 0),
+ TEST ("\0a", 1, 2, "a", 0),
+
+ TEST ("a\0\0bcd\0", 0, 7, "a\0\0bcd\0", 0),
+ TEST ("a\0\0bcd\0", 1, 7, "\0\0bcd\0", 0),
+ TEST ("a\0\0bcd\0", 0, 3, "a\0\0", 0),
+ TEST ("a\0\0bcd\0", 1, 2, "\0\0", 0),
+ TEST ("a\0\0bcd\0", 6, 7, "\0", 0),
+ TEST ("a\0\0bcd\0", 7, 7, "", 0),
+ TEST ("\0\0abcd\0", 0, 7, "\0\0abcd\0", 0),
+ TEST ("\0\0abcd\0", 1, 7, "\0abcd\0", 0),
+ TEST ("\0\0abcd\0", 0, 3, "\0\0a", 0),
+ TEST ("\0\0abcd\0", 1, 1, "\0", 0),
+ TEST ("\0\0abcd\0", 6, 3, "\0", 0),
+ TEST ("\0\0abcd\0", 1, 6, "\0abcd\0", 0),
+ TEST ("\0\0abcd\0", 0, 0, "", 0),
+ TEST ("\0\0abcd\0", 2, 7, "abcd\0", 0),
+ TEST ("\0\0ab\0\0", 0, 6, "\0\0ab\0\0", 0),
+ TEST ("\0\0ab\0\0", 1, 6, "\0ab\0\0", 0),
+ TEST ("\0\0ab\0\0", 0, 2, "\0\0", 0),
+ TEST ("\0\0ab\0\0", 4, 6, "\0\0", 0),
+ TEST ("\0\0ab\0\0", 2, 3, "ab\0", 0),
+ TEST ("\0\0ab\0\0", 6, 6, "", 0),
+
+ TEST (LSTR, 0, LLEN - 1, LSTR, 0),
+ TEST (LSTR, LLEN - 2, LLEN - 1, "x", 0),
+ TEST (LSTR, LLEN - 9, 2, "xx", 0),
+ TEST (LSTR, LLEN - 4, 5, "xxx", 0),
+ TEST (LSTR, LLEN - 9, 8, "xxxxxxxx", 0),
+ TEST (LSTR, LLEN - 1, 1, "", 0),
+
+ TEST ("\0", 2, 0, "", 1),
+ TEST ("a", 10, 0, "", 1),
+ TEST (LSTR, LLEN + 10, 0, "", 1),
+
+ TEST ("last", 0, 4, "last", 0)
+};
+
+/**************************************************************************/
+
+template <class charT, class Traits>
+void test_substr (charT, Traits*,
+ OverloadId which,
+ const TestCase &cs)
+{
+ typedef std::allocator<charT> Allocator;
+ typedef std::basic_string <charT, Traits, Allocator> TestString;
+ typedef typename TestString::const_iterator ConstStringIter;
+
+ static charT wstr [LLEN];
+
+ // construct string
+ rw_widen (wstr, cs.str, cs.str_len);
+ const TestString str (wstr, cs.str_len);
+
+ TestString s_res;
+
+ // save the state of the string object before the call
+ // to detect wxception safety violations (changes to
+ // the state of the object after an exception)
+ const StringState str_state (rw_get_string_state (str));
+
+#ifndef _RWSTD_NO_EXCEPTIONS
+
+ // is some exception expected?
+ const char* const expected = cs.bthrow ? exceptions [1] : 0;
+ const char* caught = 0;
+
+#endif // _RWSTD_NO_EXCEPTIONS
+
+ try {
+ switch (which) {
+ case Substr (void):
+ s_res = str.substr ();
+ break;
+
+ case Substr (size):
+ s_res = str.substr (cs.off);
+ break;
+
+ case Substr (size_size):
+ s_res = str.substr (cs.off, cs.size);
+ break;
+
+ default:
+ RW_ASSERT ("test logic error: unknown substr overload");
+ return;
+ }
+
+ // verfiy that strings length are equal
+ rw_assert (cs.nres == s_res.size (), 0, cs.line,
+ "line %d. %{$FUNCALL} expected %{#*s} with length "
+ "%zu, got %{/*.*Gs} with length %zu",
+ __LINE__, int (cs.nres), cs.res,
+ cs.nres, int (sizeof (charT)),
+ int (s_res.size ()), s_res.c_str (), s_res.size ());
+
+ if (cs.nres == s_res.size ()) {
+ // if the result length matches the expected length
+ // (and only then), also verify that the resulted
+ // string matches the expected result
+ const std::size_t match =
+ rw_match (cs.res, s_res.c_str(), cs.nres);
+
+ rw_assert (match == cs.nres, 0, cs.line,
+ "line %d. %{$FUNCALL} expected %{#*s}, "
+ "got %{/*.*Gs}, difference at offset %zu",
+ __LINE__, int (cs.nres), cs.res,
+ int (sizeof (charT)), int (s_res.size ()),
+ s_res.c_str (), match);
+ }
+ }
+
+#ifndef _RWSTD_NO_EXCEPTIONS
+
+ catch (const std::out_of_range &ex) {
+ caught = exceptions [1];
+ rw_assert (caught == expected, 0, cs.line,
+ "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
+ "unexpectedly%{;} caught std::%s(%#s)",
+ __LINE__, 0 != expected, expected, caught, ex.what ());
+ }
+ catch (const std::exception &ex) {
+ caught = exceptions [4];
+ rw_assert (0, 0, cs.line,
+ "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
+ "unexpectedly%{;} caught std::%s(%#s)",
+ __LINE__, 0 != expected, expected, caught, ex.what ());
+ }
+ catch (...) {
+ caught = exceptions [0];
+ rw_assert (0, 0, cs.line,
+ "line %d. %{$FUNCALL} %{?}expected %s,%{:}"
+ "unexpectedly%{;} caught %s",
+ __LINE__, 0 != expected, expected, caught);
+ }
+
+ if (caught) {
+ // verify that an exception thrown during allocation
+ // didn't cause a change in the state of the object
+ str_state.assert_equal (rw_get_string_state (str),
+ __LINE__, cs.line, caught);
+ }
+
+#endif // _RWSTD_NO_EXCEPTIONS
+}
+
+/**************************************************************************/
+
+DEFINE_TEST_DISPATCH (test_substr);
+
+int main (int argc, char** argv)
+{
+ static const StringMembers::Test
+ tests [] = {
+
+#undef TEST
+#define TEST(tag) { \
+ StringMembers::substr_ ## tag, tag ## _test_cases, \
+ sizeof tag ## _test_cases / sizeof *tag ## _test_cases \
+ }
+
+ TEST (void),
+ TEST (size),
+ TEST (size_size)
+ };
+
+ const std::size_t test_count = sizeof tests / sizeof *tests;
+
+ return StringMembers::run_test (argc, argv, __FILE__,
+ "lib.string.substr",
+ test_substr, tests, test_count);
+}
Propchange: incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: incubator/stdcxx/trunk/tests/strings/21.string.substr.cpp
------------------------------------------------------------------------------
svn:keywords = Id