107163879Schristos /* Self tests for string_view for GDB, the GNU debugger.
207163879Schristos
3*1424dfb3Schristos Copyright (C) 2018-2020 Free Software Foundation, Inc.
407163879Schristos
507163879Schristos This file is part of GDB.
607163879Schristos
707163879Schristos This program is free software; you can redistribute it and/or modify
807163879Schristos it under the terms of the GNU General Public License as published by
907163879Schristos the Free Software Foundation; either version 3 of the License, or
1007163879Schristos (at your option) any later version.
1107163879Schristos
1207163879Schristos This program is distributed in the hope that it will be useful,
1307163879Schristos but WITHOUT ANY WARRANTY; without even the implied warranty of
1407163879Schristos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1507163879Schristos GNU General Public License for more details.
1607163879Schristos
1707163879Schristos You should have received a copy of the GNU General Public License
1807163879Schristos along with this program. If not, see <http://www.gnu.org/licenses/>. */
1907163879Schristos
2007163879Schristos /* No need to test string_view if we're using C++17, since we're going to use
2107163879Schristos the "real" version. */
2207163879Schristos #if __cplusplus < 201703L
2307163879Schristos
2407163879Schristos #define GNULIB_NAMESPACE gnulib
2507163879Schristos
2607163879Schristos #include "defs.h"
27*1424dfb3Schristos #include "gdbsupport/selftest.h"
28*1424dfb3Schristos #include "gdbsupport/gdb_string_view.h"
2907163879Schristos
3007163879Schristos /* Used by the included .cc files below. Included here because the
3107163879Schristos included test files are wrapped in a namespace. */
3207163879Schristos #include <string>
3307163879Schristos #include <sstream>
3407163879Schristos #include <fstream>
3507163879Schristos #include <iostream>
3607163879Schristos
3707163879Schristos /* libstdc++'s testsuite uses VERIFY. */
3807163879Schristos #define VERIFY SELF_CHECK
3907163879Schristos
4007163879Schristos /* Used to disable testing features not supported by
4107163879Schristos gdb::string_view. */
4207163879Schristos #define GDB_STRING_VIEW
4307163879Schristos
4407163879Schristos namespace selftests {
4507163879Schristos namespace string_view {
4607163879Schristos
4707163879Schristos /* The actual tests live in separate files, which were originally
4807163879Schristos copied over from libstdc++'s testsuite. To preserve the structure
4907163879Schristos and help with comparison with the original tests, the file names
5007163879Schristos have been preserved, and only minimal modification was done to have
5107163879Schristos them compile against gdb::string_view instead of std::string_view:
5207163879Schristos
5307163879Schristos - std::string_view->gdb::string_view, etc.
5407163879Schristos - ATTRIBUTE_UNUSED in a few places
5507163879Schristos - wrap each file in a namespace so they can all be compiled as a
5607163879Schristos single unit.
5707163879Schristos - libstdc++'s license and formatting style was preserved.
5807163879Schristos */
5907163879Schristos
6007163879Schristos #include "basic_string_view/capacity/1.cc"
6107163879Schristos #include "basic_string_view/cons/char/1.cc"
6207163879Schristos #include "basic_string_view/cons/char/2.cc"
6307163879Schristos #include "basic_string_view/cons/char/3.cc"
6407163879Schristos #include "basic_string_view/element_access/char/1.cc"
6507163879Schristos #include "basic_string_view/element_access/char/empty.cc"
6607163879Schristos #include "basic_string_view/element_access/char/front_back.cc"
6707163879Schristos #include "basic_string_view/inserters/char/2.cc"
6807163879Schristos #include "basic_string_view/modifiers/remove_prefix/char/1.cc"
6907163879Schristos #include "basic_string_view/modifiers/remove_suffix/char/1.cc"
7007163879Schristos #include "basic_string_view/modifiers/swap/char/1.cc"
7107163879Schristos #include "basic_string_view/operations/compare/char/1.cc"
7207163879Schristos #include "basic_string_view/operations/compare/char/13650.cc"
7307163879Schristos #include "basic_string_view/operations/copy/char/1.cc"
7407163879Schristos #include "basic_string_view/operations/data/char/1.cc"
7507163879Schristos #include "basic_string_view/operations/find/char/1.cc"
7607163879Schristos #include "basic_string_view/operations/find/char/2.cc"
7707163879Schristos #include "basic_string_view/operations/find/char/3.cc"
7807163879Schristos #include "basic_string_view/operations/find/char/4.cc"
7907163879Schristos #include "basic_string_view/operations/rfind/char/1.cc"
8007163879Schristos #include "basic_string_view/operations/rfind/char/2.cc"
8107163879Schristos #include "basic_string_view/operations/rfind/char/3.cc"
8207163879Schristos #include "basic_string_view/operations/substr/char/1.cc"
8307163879Schristos #include "basic_string_view/operators/char/2.cc"
8407163879Schristos
8507163879Schristos static void
run_tests()8607163879Schristos run_tests ()
8707163879Schristos {
8807163879Schristos capacity_1::main ();
8907163879Schristos cons_1::main ();
9007163879Schristos cons_2::main ();
9107163879Schristos cons_3::main ();
9207163879Schristos element_access_1::main ();
9307163879Schristos element_access_empty::main ();
9407163879Schristos element_access_front_back::main ();
9507163879Schristos inserters_2::main ();
9607163879Schristos modifiers_remove_prefix::main ();
9707163879Schristos modifiers_remove_suffix::main ();
9807163879Schristos modifiers_swap::test01 ();
9907163879Schristos operations_compare_1::main ();
10007163879Schristos operations_compare_13650::main ();
10107163879Schristos operations_copy_1::main ();
10207163879Schristos operations_data_1::main ();
10307163879Schristos operations_find_1::main ();
10407163879Schristos operations_find_2::main ();
10507163879Schristos operations_find_3::main ();
10607163879Schristos operations_find_4::main ();
10707163879Schristos operations_rfind_1::main ();
10807163879Schristos operations_rfind_2::main ();
10907163879Schristos operations_rfind_3::main ();
11007163879Schristos operations_substr_1::main ();
11107163879Schristos operators_2::main ();
11207163879Schristos
11307163879Schristos constexpr gdb::string_view sv_empty;
11407163879Schristos SELF_CHECK (sv_empty.empty ());
11507163879Schristos
11607163879Schristos std::string std_string = "fika";
11707163879Schristos gdb::string_view sv1 (std_string);
11807163879Schristos SELF_CHECK (sv1 == "fika");
11907163879Schristos
12007163879Schristos constexpr const char *fika = "fika";
12107163879Schristos gdb::string_view sv2 (fika);
12207163879Schristos SELF_CHECK (sv2 == "fika");
12307163879Schristos
12407163879Schristos constexpr gdb::string_view sv3 (fika, 3);
12507163879Schristos SELF_CHECK (sv3 == "fik");
12607163879Schristos
12707163879Schristos constexpr gdb::string_view sv4 (sv3);
12807163879Schristos SELF_CHECK (sv4 == "fik");
12907163879Schristos
13007163879Schristos constexpr gdb::string_view::iterator it_begin = sv4.begin ();
13107163879Schristos static_assert (*it_begin == 'f', "");
13207163879Schristos
13307163879Schristos constexpr gdb::string_view::iterator it_end = sv4.end ();
13407163879Schristos static_assert (*it_end == 'a', "");
13507163879Schristos
13607163879Schristos const gdb::string_view::reverse_iterator it_rbegin = sv4.rbegin ();
13707163879Schristos SELF_CHECK (*it_rbegin == 'k');
13807163879Schristos
13907163879Schristos const gdb::string_view::reverse_iterator it_rend = sv4.rend ();
14007163879Schristos SELF_CHECK (*(it_rend - 1) == 'f');
14107163879Schristos
14207163879Schristos constexpr gdb::string_view::size_type size = sv4.size ();
14307163879Schristos static_assert (size == 3, "");
14407163879Schristos
14507163879Schristos constexpr gdb::string_view::size_type length = sv4.length ();
14607163879Schristos static_assert (length == 3, "");
14707163879Schristos
14807163879Schristos constexpr gdb::string_view::size_type max_size = sv4.max_size ();
14907163879Schristos static_assert (max_size > 0, "");
15007163879Schristos
15107163879Schristos constexpr bool empty = sv4.empty ();
15207163879Schristos static_assert (!empty, "");
15307163879Schristos
15407163879Schristos constexpr char c1 = sv4[1];
15507163879Schristos static_assert (c1 == 'i', "");
15607163879Schristos
15707163879Schristos constexpr char c2 = sv4.at (2);
15807163879Schristos static_assert (c2 == 'k', "");
15907163879Schristos
16007163879Schristos constexpr char front = sv4.front ();
16107163879Schristos static_assert (front == 'f', "");
16207163879Schristos
16307163879Schristos constexpr char back = sv4.back ();
16407163879Schristos static_assert (back == 'k', "");
16507163879Schristos
16607163879Schristos constexpr const char *data = sv4.data ();
16707163879Schristos static_assert (data == fika, "");
16807163879Schristos }
16907163879Schristos
17007163879Schristos } /* namespace string_view */
17107163879Schristos } /* namespace selftests */
17207163879Schristos
173*1424dfb3Schristos #endif /* __cplusplus < 201703L */
174*1424dfb3Schristos
175*1424dfb3Schristos void _initialize_string_view_selftests ();
17607163879Schristos void
_initialize_string_view_selftests()17707163879Schristos _initialize_string_view_selftests ()
17807163879Schristos {
179*1424dfb3Schristos #if defined(GDB_STRING_VIEW)
18007163879Schristos selftests::register_test ("string_view", selftests::string_view::run_tests);
181*1424dfb3Schristos #endif
18207163879Schristos }
183