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