Fix nullptr in with_command_1
[external/binutils.git] / gdb / unittests / string_view-selftests.c
1 /* Self tests for string_view for GDB, the GNU debugger.
2
3    Copyright (C) 2018-2019 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
176 _initialize_string_view_selftests ()
177 {
178 #if defined(GDB_STRING_VIEW)
179   selftests::register_test ("string_view", selftests::string_view::run_tests);
180 #endif
181 }