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
44namespace selftests {
45namespace 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
85static void
86run_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
175void _initialize_string_view_selftests ();
176void
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