|
| 1 | +#include "openvic-simulation/core/string/StringLiteral.hpp" |
| 2 | + |
| 3 | +#include <cstddef> |
| 4 | +#include <iterator> |
| 5 | +#include <string_view> |
| 6 | + |
| 7 | +#include <range/v3/algorithm/equal.hpp> |
| 8 | +#include <range/v3/view/drop.hpp> |
| 9 | + |
| 10 | +#include "Helper.hpp" // IWYU pragma: keep |
| 11 | +#include <snitch/snitch_append.hpp> |
| 12 | +#include <snitch/snitch_macros_check.hpp> |
| 13 | +#include <snitch/snitch_macros_constexpr.hpp> |
| 14 | +#include <snitch/snitch_macros_misc.hpp> |
| 15 | +#include <snitch/snitch_macros_test_case.hpp> |
| 16 | +#include <snitch/snitch_string.hpp> |
| 17 | + |
| 18 | +using namespace OpenVic; |
| 19 | +using namespace std::string_view_literals; |
| 20 | + |
| 21 | +namespace snitch { |
| 22 | + template<std::size_t N, typename CharT, class Traits> |
| 23 | + [[nodiscard]] inline static constexpr bool append( // |
| 24 | + snitch::small_string_span ss, OpenVic::string_literal<N, CharT, Traits> const& s |
| 25 | + ) noexcept { |
| 26 | + return append(ss, s.as_string_view()); |
| 27 | + } |
| 28 | +} |
| 29 | + |
| 30 | +TEST_CASE("string_literal Constructor methods", "[string_literal][string_literal-constructor]") { |
| 31 | + static constexpr string_literal empty {}; |
| 32 | + CONSTEXPR_CHECK(empty.empty()); |
| 33 | + |
| 34 | + static constexpr string_literal char_value = 'c'; |
| 35 | + CONSTEXPR_CHECK(char_value.size() == 1); |
| 36 | + CONSTEXPR_CHECK(char_value[0] == 'c'); |
| 37 | + |
| 38 | + static constexpr string_literal value = "value"; |
| 39 | + CONSTEXPR_CHECK(value.size() == 5); |
| 40 | + CONSTEXPR_CHECK(value[0] == 'v'); |
| 41 | + CONSTEXPR_CHECK(value[1] == 'a'); |
| 42 | + CONSTEXPR_CHECK(value[2] == 'l'); |
| 43 | + CONSTEXPR_CHECK(value[3] == 'u'); |
| 44 | + CONSTEXPR_CHECK(value[4] == 'e'); |
| 45 | +} |
| 46 | + |
| 47 | +TEST_CASE("string_literal Operators", "[string_literal][string_literal-operators]") { |
| 48 | + static constexpr string_literal check1 = "check1"; |
| 49 | + CONSTEXPR_CHECK(check1[0] == 'c'); |
| 50 | + CONSTEXPR_CHECK(check1[1] == 'h'); |
| 51 | + CONSTEXPR_CHECK(check1[2] == 'e'); |
| 52 | + CONSTEXPR_CHECK(check1[3] == 'c'); |
| 53 | + CONSTEXPR_CHECK(check1[4] == 'k'); |
| 54 | + CONSTEXPR_CHECK(check1[5] == '1'); |
| 55 | + CONSTEXPR_CHECK(check1 == check1); |
| 56 | + |
| 57 | + static constexpr string_literal check2 = "check2"; |
| 58 | + CONSTEXPR_CHECK(check1 != check2); |
| 59 | + CONSTEXPR_CHECK(static_cast<std::string_view>(check2) == "check2"sv); |
| 60 | + CONSTEXPR_CHECK(static_cast<char const*>(check2) == "check2"sv); |
| 61 | + CONSTEXPR_CHECK((check1 + check2) == "check1check2"sv); |
| 62 | + CONSTEXPR_CHECK((check1 + "check2") == "check1check2"sv); |
| 63 | + CONSTEXPR_CHECK(("check1" + check2) == "check1check2"sv); |
| 64 | +} |
| 65 | + |
| 66 | +TEST_CASE("string_literal Iterator methods", "[string_literal][string_literal-iterator]") { |
| 67 | + static constexpr string_literal iterator = "iterator"; |
| 68 | + CONSTEXPR_CHECK(*iterator.begin() == 'i'); |
| 69 | + CONSTEXPR_CHECK(*(iterator.begin() + 1) == 't'); |
| 70 | + CONSTEXPR_CHECK(*(iterator.begin() + 2) == 'e'); |
| 71 | + CONSTEXPR_CHECK(*(iterator.begin() + 3) == 'r'); |
| 72 | + CONSTEXPR_CHECK(*(iterator.begin() + 4) == 'a'); |
| 73 | + CONSTEXPR_CHECK(*(iterator.begin() + 5) == 't'); |
| 74 | + CONSTEXPR_CHECK(*(iterator.begin() + 6) == 'o'); |
| 75 | + CONSTEXPR_CHECK(*(iterator.begin() + 7) == 'r'); |
| 76 | + CONSTEXPR_CHECK((iterator.begin() + 8) == iterator.end()); |
| 77 | + |
| 78 | + |
| 79 | + CONSTEXPR_CHECK(*iterator.rbegin() == 'r'); |
| 80 | + CONSTEXPR_CHECK(*(iterator.rbegin() + 1) == 'o'); |
| 81 | + CONSTEXPR_CHECK(*(iterator.rbegin() + 2) == 't'); |
| 82 | + CONSTEXPR_CHECK(*(iterator.rbegin() + 3) == 'a'); |
| 83 | + CONSTEXPR_CHECK(*(iterator.rbegin() + 4) == 'r'); |
| 84 | + CONSTEXPR_CHECK(*(iterator.rbegin() + 5) == 'e'); |
| 85 | + CONSTEXPR_CHECK(*(iterator.rbegin() + 6) == 't'); |
| 86 | + CONSTEXPR_CHECK(*(iterator.rbegin() + 7) == 'i'); |
| 87 | + CONSTEXPR_CHECK((iterator.rbegin() + 8) == iterator.rend()); |
| 88 | + |
| 89 | + CONSTEXPR_CHECK(std::reverse_iterator { iterator.begin() } == iterator.rend()); |
| 90 | + CONSTEXPR_CHECK(std::reverse_iterator { iterator.end() } == iterator.rbegin()); |
| 91 | + CONSTEXPR_CHECK(iterator.cbegin() == iterator.begin()); |
| 92 | + CONSTEXPR_CHECK(iterator.cend() == iterator.end()); |
| 93 | + CONSTEXPR_CHECK(iterator.crbegin() == iterator.rbegin()); |
| 94 | + CONSTEXPR_CHECK(iterator.crend() == iterator.rend()); |
| 95 | +} |
| 96 | + |
| 97 | +TEST_CASE("string_literal Access methods", "[string_literal][string_literal-access]") { |
| 98 | + static constexpr string_literal access = "access"; |
| 99 | + CONSTEXPR_CHECK(access.at(0) == 'a'); |
| 100 | + CONSTEXPR_CHECK(access.at(1) == 'c'); |
| 101 | + CONSTEXPR_CHECK(access.at(2) == 'c'); |
| 102 | + CONSTEXPR_CHECK(access.at(3) == 'e'); |
| 103 | + CONSTEXPR_CHECK(access.at(4) == 's'); |
| 104 | + CONSTEXPR_CHECK(access.at(5) == 's'); |
| 105 | + |
| 106 | + CONSTEXPR_CHECK(access.front() == 'a'); |
| 107 | + CONSTEXPR_CHECK(access.back() == 's'); |
| 108 | + |
| 109 | + CONSTEXPR_CHECK(access.data()[0] == 'a'); |
| 110 | + CONSTEXPR_CHECK(access.data()[1] == 'c'); |
| 111 | + CONSTEXPR_CHECK(access.data()[2] == 'c'); |
| 112 | + CONSTEXPR_CHECK(access.data()[3] == 'e'); |
| 113 | + CONSTEXPR_CHECK(access.data()[4] == 's'); |
| 114 | + CONSTEXPR_CHECK(access.data()[5] == 's'); |
| 115 | + |
| 116 | + CONSTEXPR_CHECK(access.c_str() == "access"sv); |
| 117 | +} |
| 118 | + |
| 119 | +TEST_CASE("string_literal Inspect methods", "[string_literal][string_literal-Inspect]") { |
| 120 | + static constexpr string_literal inspect = "inspect"; |
| 121 | + CONSTEXPR_CHECK(inspect.compare("inspect"sv) == 0); |
| 122 | + CONSTEXPR_CHECK(inspect.compare("inspect") == 0); |
| 123 | + CONSTEXPR_CHECK(inspect.compare("notinspect"sv) == -1); |
| 124 | + CONSTEXPR_CHECK(inspect.compare("notinspect") == -1); |
| 125 | + CONSTEXPR_CHECK(inspect.compare("aotinspect"sv) == 1); |
| 126 | + CONSTEXPR_CHECK(inspect.compare("aotinspect") == 1); |
| 127 | + |
| 128 | + CONSTEXPR_CHECK(inspect.starts_with("in"sv)); |
| 129 | + CONSTEXPR_CHECK(inspect.starts_with('i')); |
| 130 | + CONSTEXPR_CHECK(inspect.starts_with("in")); |
| 131 | + CONSTEXPR_CHECK_FALSE(inspect.starts_with("et"sv)); |
| 132 | + CONSTEXPR_CHECK_FALSE(inspect.starts_with('b')); |
| 133 | + CONSTEXPR_CHECK_FALSE(inspect.starts_with("da")); |
| 134 | + |
| 135 | + static constexpr string_literal in = "in"; |
| 136 | + CONSTEXPR_CHECK(inspect.starts_with(in)); |
| 137 | + |
| 138 | + static constexpr string_literal not_inspect = "not inspect"; |
| 139 | + CONSTEXPR_CHECK_FALSE(inspect.starts_with(not_inspect)); |
| 140 | + |
| 141 | + CONSTEXPR_CHECK(inspect.ends_with("ect"sv)); // spellchecker:disable-line |
| 142 | + CONSTEXPR_CHECK(inspect.ends_with('t')); |
| 143 | + CONSTEXPR_CHECK(inspect.ends_with("pect")); |
| 144 | + CONSTEXPR_CHECK_FALSE(inspect.ends_with("nb"sv)); |
| 145 | + CONSTEXPR_CHECK_FALSE(inspect.ends_with('q')); |
| 146 | + CONSTEXPR_CHECK_FALSE(inspect.ends_with("rp")); |
| 147 | + |
| 148 | + static constexpr string_literal ct = "ct"; |
| 149 | + CONSTEXPR_CHECK(inspect.ends_with(ct)); |
| 150 | + |
| 151 | + CONSTEXPR_CHECK_FALSE(inspect.ends_with(not_inspect)); |
| 152 | + |
| 153 | + CONSTEXPR_CHECK(inspect.find("ec") == 4); |
| 154 | + CONSTEXPR_CHECK(inspect.find("ec"sv) == 4); |
| 155 | + CONSTEXPR_CHECK(inspect.find("ec", 3) == 4); |
| 156 | + CONSTEXPR_CHECK(inspect.find("ec"sv, 2) == 4); |
| 157 | + CONSTEXPR_CHECK(inspect.find("non") == inspect.npos); |
| 158 | + CONSTEXPR_CHECK(inspect.find("non"sv) == inspect.npos); |
| 159 | + |
| 160 | + CONSTEXPR_CHECK(inspect.rfind("ec") == 4); |
| 161 | + CONSTEXPR_CHECK(inspect.rfind("ec"sv) == 4); |
| 162 | + CONSTEXPR_CHECK(inspect.rfind("ns", 1) == 1); |
| 163 | + CONSTEXPR_CHECK(inspect.rfind("ns"sv, 2) == 1); |
| 164 | + CONSTEXPR_CHECK(inspect.rfind("non") == inspect.npos); |
| 165 | + CONSTEXPR_CHECK(inspect.rfind("non"sv) == inspect.npos); |
| 166 | +} |
| 167 | + |
| 168 | +TEST_CASE("string_literal Modifier methods", "[string_literal][string_literal-modifier]") { |
| 169 | + static constexpr string_literal modifier = "modifier"; |
| 170 | + CONSTEXPR_CHECK(modifier.clear().empty()); |
| 171 | + CONSTEXPR_CHECK(modifier.push_back('a') == "modifiera"sv); |
| 172 | + CONSTEXPR_CHECK(modifier.pop_back() == "modifie"sv); |
| 173 | + CONSTEXPR_CHECK(modifier.append<3>('b') == "modifierbbb"sv); |
| 174 | + CONSTEXPR_CHECK(modifier.append("hey") == "modifierhey"sv); |
| 175 | + CONSTEXPR_CHECK(modifier.append(modifier) == "modifiermodifier"sv); |
| 176 | + CONSTEXPR_CHECK(modifier.substr<1, 3>() == "odi"sv); |
| 177 | + CONSTEXPR_CHECK(modifier.substr<1>() == "odifier"sv); |
| 178 | + CONSTEXPR_CHECK(modifier.substr() == modifier); |
| 179 | + CONSTEXPR_CHECK(modifier.substr(2, 3) == "dif"sv); |
| 180 | + CONSTEXPR_CHECK(modifier.substr(3) == "ifier"sv); |
| 181 | +} |
0 commit comments