xref: /netbsd-src/external/gpl3/gdb.old/dist/gdb/unittests/string_view-selftests.c (revision d16b7486a53dcb8072b60ec6fcb4373a2d0c27b7)
1 /* Self tests for string_view for GDB, the GNU debugger.
2 
3    Copyright (C) 2018-2020 Free Software Foundation, Inc.
4 
5    This file is part of GDB.
6 
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11 
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16 
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19 
20 /* No need to test string_view if we're using C++17, since we're going to use
21    the "real" version.  */
22 #if __cplusplus < 201703L
23 
24 #define GNULIB_NAMESPACE gnulib
25 
26 #include "defs.h"
27 #include "gdbsupport/selftest.h"
28 #include "gdbsupport/gdb_string_view.h"
29 
30 /* Used by the included .cc files below.  Included here because the
31    included test files are wrapped in a namespace.  */
32 #include <string>
33 #include <sstream>
34 #include <fstream>
35 #include <iostream>
36 
37 /* libstdc++'s testsuite uses VERIFY.  */
38 #define VERIFY SELF_CHECK
39 
40 /* Used to disable testing features not supported by
41    gdb::string_view.  */
42 #define GDB_STRING_VIEW
43 
44 namespace selftests {
45 namespace string_view {
46 
47 /* The actual tests live in separate files, which were originally
48    copied over from libstdc++'s testsuite.  To preserve the structure
49    and help with comparison with the original tests, the file names
50    have been preserved, and only minimal modification was done to have
51    them compile against gdb::string_view instead of std::string_view:
52 
53      - std::string_view->gdb::string_view, etc.
54      - ATTRIBUTE_UNUSED in a few places
55      - wrap each file in a namespace so they can all be compiled as a
56        single unit.
57      - libstdc++'s license and formatting style was preserved.
58 */
59 
60 #include "basic_string_view/capacity/1.cc"
61 #include "basic_string_view/cons/char/1.cc"
62 #include "basic_string_view/cons/char/2.cc"
63 #include "basic_string_view/cons/char/3.cc"
64 #include "basic_string_view/element_access/char/1.cc"
65 #include "basic_string_view/element_access/char/empty.cc"
66 #include "basic_string_view/element_access/char/front_back.cc"
67 #include "basic_string_view/inserters/char/2.cc"
68 #include "basic_string_view/modifiers/remove_prefix/char/1.cc"
69 #include "basic_string_view/modifiers/remove_suffix/char/1.cc"
70 #include "basic_string_view/modifiers/swap/char/1.cc"
71 #include "basic_string_view/operations/compare/char/1.cc"
72 #include "basic_string_view/operations/compare/char/13650.cc"
73 #include "basic_string_view/operations/copy/char/1.cc"
74 #include "basic_string_view/operations/data/char/1.cc"
75 #include "basic_string_view/operations/find/char/1.cc"
76 #include "basic_string_view/operations/find/char/2.cc"
77 #include "basic_string_view/operations/find/char/3.cc"
78 #include "basic_string_view/operations/find/char/4.cc"
79 #include "basic_string_view/operations/rfind/char/1.cc"
80 #include "basic_string_view/operations/rfind/char/2.cc"
81 #include "basic_string_view/operations/rfind/char/3.cc"
82 #include "basic_string_view/operations/substr/char/1.cc"
83 #include "basic_string_view/operators/char/2.cc"
84 
85 static void
86 run_tests ()
87 {
88   capacity_1::main ();
89   cons_1::main ();
90   cons_2::main ();
91   cons_3::main ();
92   element_access_1::main ();
93   element_access_empty::main ();
94   element_access_front_back::main ();
95   inserters_2::main ();
96   modifiers_remove_prefix::main ();
97   modifiers_remove_suffix::main ();
98   modifiers_swap::test01 ();
99   operations_compare_1::main ();
100   operations_compare_13650::main ();
101   operations_copy_1::main ();
102   operations_data_1::main ();
103   operations_find_1::main ();
104   operations_find_2::main ();
105   operations_find_3::main ();
106   operations_find_4::main ();
107   operations_rfind_1::main ();
108   operations_rfind_2::main ();
109   operations_rfind_3::main ();
110   operations_substr_1::main ();
111   operators_2::main ();
112 
113   constexpr gdb::string_view sv_empty;
114   SELF_CHECK (sv_empty.empty ());
115 
116   std::string std_string = "fika";
117   gdb::string_view sv1 (std_string);
118   SELF_CHECK (sv1 == "fika");
119 
120   constexpr const char *fika = "fika";
121   gdb::string_view sv2 (fika);
122   SELF_CHECK (sv2 == "fika");
123 
124   constexpr gdb::string_view sv3 (fika, 3);
125   SELF_CHECK (sv3 == "fik");
126 
127   constexpr gdb::string_view sv4 (sv3);
128   SELF_CHECK (sv4 == "fik");
129 
130   constexpr gdb::string_view::iterator it_begin = sv4.begin ();
131   static_assert (*it_begin == 'f', "");
132 
133   constexpr gdb::string_view::iterator it_end = sv4.end ();
134   static_assert (*it_end == 'a', "");
135 
136   const gdb::string_view::reverse_iterator it_rbegin = sv4.rbegin ();
137   SELF_CHECK (*it_rbegin == 'k');
138 
139   const gdb::string_view::reverse_iterator it_rend = sv4.rend ();
140   SELF_CHECK (*(it_rend - 1) == 'f');
141 
142   constexpr gdb::string_view::size_type size = sv4.size ();
143   static_assert (size == 3, "");
144 
145   constexpr gdb::string_view::size_type length = sv4.length ();
146   static_assert (length == 3, "");
147 
148   constexpr gdb::string_view::size_type max_size = sv4.max_size ();
149   static_assert (max_size > 0, "");
150 
151   constexpr bool empty = sv4.empty ();
152   static_assert (!empty, "");
153 
154   constexpr char c1 = sv4[1];
155   static_assert (c1 == 'i', "");
156 
157   constexpr char c2 = sv4.at (2);
158   static_assert (c2 == 'k', "");
159 
160   constexpr char front = sv4.front ();
161   static_assert (front == 'f', "");
162 
163   constexpr char back = sv4.back ();
164   static_assert (back == 'k', "");
165 
166   constexpr const char *data = sv4.data ();
167   static_assert (data == fika, "");
168 }
169 
170 } /* namespace string_view */
171 } /* namespace selftests */
172 
173 #endif /* __cplusplus < 201703L */
174 
175 void _initialize_string_view_selftests ();
176 void
177 _initialize_string_view_selftests ()
178 {
179 #if defined(GDB_STRING_VIEW)
180   selftests::register_test ("string_view", selftests::string_view::run_tests);
181 #endif
182 }
183