test_nonascii.cpp
Go to the documentation of this file.
1 // Licensed under the MIT License <http://opensource.org/licenses/MIT>.
2 // SPDX-License-Identifier: MIT
3 // Copyright (c) 2019 - 2024 Daniil Goncharov <neargye@gmail.com>.
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 // SOFTWARE.
22 
23 #define CATCH_CONFIG_MAIN
24 #include <catch2/catch.hpp>
25 
26 #undef MAGIC_ENUM_RANGE_MIN
27 #define MAGIC_ENUM_RANGE_MIN -120
28 #undef MAGIC_ENUM_RANGE_MAX
29 #define MAGIC_ENUM_RANGE_MAX 120
33 
34 #include <array>
35 #include <cctype>
36 #include <string_view>
37 #include <sstream>
38 
39 enum class Language : int { 日本語 = 10, 한국어 = 20, English = 30, 😃 = 40, TVÅ = 50 };
40 
41 enum class LanguageFlag : int {
42  日本語 = 1 << 1,
43  한국어 = 1 << 2,
44  English = 1 << 3,
45  😃 = 1 << 4
46 };
47 
48 using namespace magic_enum;
49 
50 static_assert(is_magic_enum_supported, "magic_enum: Unsupported compiler (https://github.com/Neargye/magic_enum#compiler-compatibility).");
51 
52 TEST_CASE("enum_cast") {
53  SECTION("string") {
54  constexpr auto lang = enum_cast<Language>("日本語");
55  REQUIRE(enum_cast<Language&>("한국어").value() == Language::한국어);
56  REQUIRE(enum_cast<const Language>("English").value() == Language::English);
57  REQUIRE(lang.value() == Language::日本語);
58  REQUIRE(enum_cast<Language>("😃").value() == Language::😃);
59  REQUIRE(enum_cast<Language>("TVÅ").value() == Language::TVÅ);
60  REQUIRE_FALSE(enum_cast<Language>("Französisch").has_value());
61  }
62 
63  SECTION("integer") {
64  constexpr auto lang = enum_cast<Language>(10);
65  REQUIRE(enum_cast<Language&>(20).value() == Language::한국어);
66  REQUIRE(enum_cast<const Language>(30).value() == Language::English);
67  REQUIRE(lang.value() == Language::日本語);
68  REQUIRE(enum_cast<Language>(40).value() == Language::😃);
69  REQUIRE_FALSE(enum_cast<Language>(0).has_value());
70  }
71 }
72 
73 TEST_CASE("enum_integer") {
74  constexpr auto lang = enum_integer(Language::日本語);
76  REQUIRE(enum_integer<Language&>(korean) == 20);
77  REQUIRE(enum_integer<const Language>(Language::English) == 30);
79  REQUIRE(lang == 10);
80  REQUIRE(enum_integer(static_cast<Language>(0)) == 0);
81 }
82 
83 TEST_CASE("enum_index") {
84  constexpr auto lang = enum_index<Language>(Language::日本語);
86  REQUIRE(enum_index<Language&>(korean) == 1);
87  REQUIRE(enum_index<const Language>(Language::English).value() == 2);
89  REQUIRE(lang.value() == 0);
90  REQUIRE_FALSE(enum_index(static_cast<Language>(0)).has_value());
91 }
92 
93 TEST_CASE("enum_contains") {
94  SECTION("value") {
95  constexpr auto lang = enum_contains(Language::日本語);
97  REQUIRE(enum_contains<Language&>(korean));
98  REQUIRE(enum_contains<const Language>(Language::English));
100  REQUIRE(lang);
101  }
102 
103  SECTION("integer") {
104  constexpr auto lang = enum_integer(Language::日本語);
105  REQUIRE(enum_contains<Language&>(lang));
106  REQUIRE(enum_contains<const Language>(Language::한국어));
107  REQUIRE(enum_contains<Language>(Language::😃));
108  REQUIRE_FALSE(enum_contains<Language>(static_cast<Language>(0)));
109  }
110 
111  SECTION("string") {
112  auto lang = std::string{"日本語"};
113  REQUIRE(enum_contains<Language&>("한국어"));
114  REQUIRE(enum_contains<Language>("English"));
115  REQUIRE(enum_contains<const Language>(lang));
116  REQUIRE(enum_contains<Language>("😃"));
117  REQUIRE_FALSE(enum_contains<Language>("None"));
118  }
119 }
120 
121 TEST_CASE("enum_value") {
122  constexpr auto lang = enum_value<Language>(3);
123  REQUIRE(enum_value<Language&>(0) == Language::日本語);
124  REQUIRE(enum_value<const Language>(1) == Language::한국어);
125  REQUIRE(enum_value<Language>(2) == Language::English);
126  REQUIRE(lang == Language::😃);
127 }
128 
129 TEST_CASE("enum_values") {
130  constexpr auto& s7 = enum_values<const Language>();
132 }
133 
134 TEST_CASE("enum_count") {
135  constexpr auto s7 = enum_count<Language>();
136  REQUIRE(s7 == 5);
137 }
138 
139 TEST_CASE("enum_name") {
140  SECTION("automatic storage") {
141  constexpr Language lang = Language::日本語;
142  constexpr auto lang_name = enum_name(lang);
144  REQUIRE(enum_name<Language&>(lk) == "한국어");
145  REQUIRE(enum_name<const Language>(Language::English) == "English");
146  REQUIRE(lang_name == "日本語");
147  REQUIRE(enum_name(Language::😃) == "😃");
148  REQUIRE(enum_name(Language::TVÅ) == "TVÅ");
149  REQUIRE(enum_name(static_cast<Language>(0)).empty());
150  }
151 
152  SECTION("static storage") {
153  constexpr Language lang = Language::日本語;
154  constexpr auto lang_name = enum_name<lang>();
155  REQUIRE(enum_name<Language::한국어>() == "한국어");
156  REQUIRE(enum_name<Language::English>() == "English");
157  REQUIRE(lang_name == "日本語");
158  REQUIRE(enum_name<Language::😃>() == "😃");
159  }
160 }
161 
162 TEST_CASE("enum_names") {
163  constexpr auto& s5 = enum_names<const Language>();
164  REQUIRE(s5 == std::array<std::string_view, 5>{{"日本語", "한국어", "English", "😃", "TVÅ"}});
165 }
166 
167 TEST_CASE("enum_entries") {
168  constexpr auto& s5 = enum_entries<const Language>();
169  REQUIRE(s5 == std::array<std::pair<Language, std::string_view>, 5>{{{Language::日本語, "日本語"}, {Language::한국어, "한국어"}, {Language::English, "English"}, {Language::😃, "😃"}, {Language::TVÅ, "TVÅ"}}});
170 }
171 
172 TEST_CASE("ostream_operators") {
173  auto test_ostream = [](auto e, std::string name) {
174  using namespace magic_enum::ostream_operators;
175  std::stringstream ss;
176  ss << e;
177  REQUIRE(ss);
178  REQUIRE(ss.str() == name);
179  };
180 
181  test_ostream(std::make_optional(Language::日本語), "日本語");
182  test_ostream(Language::한국어, "한국어");
183  test_ostream(Language::English, "English");
184  test_ostream(Language::😃, "😃");
185  test_ostream(static_cast<Language>(0), "0");
186  test_ostream(std::make_optional(static_cast<Language>(0)), "0");
187 }
188 
189 TEST_CASE("istream_operators") {
190  auto test_istream = [](const auto e, std::string name) {
191  using namespace magic_enum::istream_operators;
192  std::istringstream ss(name);
193  std::decay_t<decltype(e)> v;
194  ss >> v;
195  REQUIRE(ss);
196  REQUIRE(v == e);
197  };
198 
199  test_istream(Language::한국어, "한국어");
200  test_istream(Language::English, "English");
201  test_istream(Language::😃, "😃");
202 }
203 
204 TEST_CASE("bitwise_operators") {
205  using namespace magic_enum::bitwise_operators;
206 
207  SECTION("operator^") {
209  }
210 
211  SECTION("operator|") {
213  }
214 
215  SECTION("operator&") {
217 
218  }
219 
220  SECTION("operator^") {
222  }
223 
224  SECTION("operator|=") {
226  x5 |= Language::한국어;
228  }
229 
230  SECTION("operator&=") {
232  x5 &= Language::한국어;
234  }
235 
236  SECTION("operator^=") {
238  x5 ^= Language::한국어;
240  }
241 }
242 TEST_CASE("type_traits") {
243  REQUIRE_FALSE(is_unscoped_enum_v<Language>);
244 }
245 
246 TEST_CASE("enum_type_name") {
247  REQUIRE(enum_type_name<const Language&>() == "Language");
248 }
249 
250 TEST_CASE("extrema") {
251  SECTION("min") {
254  REQUIRE(magic_enum::detail::min_v<Language, as_common<>> == 10);
255  }
256 
257  SECTION("max") {
260  REQUIRE(magic_enum::detail::max_v<Language, as_common<>> == 50);
261  }
262 }
263 
264 /* LanguageFlag tests */
265 TEST_CASE("flag enum_cast") {
266  SECTION("string") {
267  constexpr auto lang = enum_cast<LanguageFlag>("日本語");
268  REQUIRE(enum_cast<LanguageFlag&>("한국어").value() == LanguageFlag::한국어);
269  REQUIRE(enum_cast<const LanguageFlag>("English").value() == LanguageFlag::English);
270  REQUIRE(lang.value() == LanguageFlag::日本語);
271  REQUIRE(enum_cast<LanguageFlag>("😃").value() == LanguageFlag::😃);
272  REQUIRE_FALSE(enum_cast<LanguageFlag>("None").has_value());
273  }
274 
275  SECTION("integer") {
276  constexpr auto lang = enum_cast<LanguageFlag>(1 << 1);
277  REQUIRE(enum_cast<LanguageFlag&>(1 << 2).value() == LanguageFlag::한국어);
278  REQUIRE(enum_cast<const LanguageFlag>(1 << 3).value() == LanguageFlag::English);
279  REQUIRE(lang.value() == LanguageFlag::日本語);
280  REQUIRE(enum_cast<LanguageFlag>(1 << 4).value() == LanguageFlag::😃);
281  REQUIRE_FALSE(enum_cast<LanguageFlag>(0).has_value());
282  }
283 }
284 
285 TEST_CASE("flag enum_index") {
286  constexpr auto lang = enum_index<LanguageFlag>(LanguageFlag::日本語);
288  REQUIRE(enum_index<LanguageFlag&>(korean).value() == 1);
289  REQUIRE(enum_index<const LanguageFlag>(LanguageFlag::English).value() == 2);
291  REQUIRE(lang.value() == 0);
292  REQUIRE_FALSE(enum_index(static_cast<LanguageFlag>(0)).has_value());
293 }
294 
295 TEST_CASE("flag enum_contains") {
296  SECTION("value") {
297  constexpr auto lang = enum_index<LanguageFlag>(LanguageFlag::日本語);
299  REQUIRE(enum_contains<LanguageFlag&>(korean));
300  REQUIRE(enum_contains<const LanguageFlag>(LanguageFlag::English));
302  REQUIRE(lang);
303  REQUIRE_FALSE(enum_contains(static_cast<LanguageFlag>(0)));
304  }
305 
306  SECTION("integer") {
307  constexpr auto lang = enum_contains<LanguageFlag&>(1 << 1);
308  REQUIRE(lang);
309  REQUIRE(enum_contains<const LanguageFlag>(1 << 2));
310  REQUIRE(enum_contains<LanguageFlag>(1 << 3));
311  REQUIRE(enum_contains<LanguageFlag>(1 << 4));
312  REQUIRE_FALSE(enum_contains(static_cast<LanguageFlag>(0)));
313  }
314 
315  SECTION("string") {
316  auto lang = std::string{"日本語"};
317  REQUIRE(enum_contains<LanguageFlag&>("한국어"));
318  REQUIRE(enum_contains<LanguageFlag>("English"));
319  REQUIRE(enum_contains<const LanguageFlag>(lang));
320  REQUIRE(enum_contains<LanguageFlag>("😃"));
321  REQUIRE_FALSE(enum_contains<LanguageFlag>("None"));
322  }
323 }
324 
325 
326 TEST_CASE("flag enum_value") {
327  constexpr auto lang = enum_value<LanguageFlag>(3);
328  REQUIRE(enum_value<LanguageFlag&>(0) == LanguageFlag::日本語);
329  REQUIRE(enum_value<const LanguageFlag>(1) == LanguageFlag::한국어);
330  REQUIRE(enum_value<LanguageFlag>(2) == LanguageFlag::English);
331  REQUIRE(lang == LanguageFlag::😃);
332 }
333 
334 TEST_CASE("flag enum_values") {
335  constexpr auto& s5 = enum_values<const LanguageFlag>();
337 }
338 
339 TEST_CASE("flag enum_count") {
340  constexpr auto s5 = enum_count<LanguageFlag>();
341  REQUIRE(s5 == 4);
342 }
343 
344 TEST_CASE("flag enum_name") {
345  SECTION("automatic storage") {
346  constexpr LanguageFlag lang = LanguageFlag::日本語;
347  constexpr auto lang_name = enum_name(lang);
349  REQUIRE(enum_name<LanguageFlag&>(lk) == "한국어");
350  REQUIRE(enum_name<const LanguageFlag>(LanguageFlag::English) == "English");
351  REQUIRE(lang_name == "日本語");
353  REQUIRE(enum_name(static_cast<LanguageFlag>(0)).empty());
354  }
355 }
356 
357 TEST_CASE("flag enum_flags_name") {
358  constexpr LanguageFlag lang = LanguageFlag::日本語;
359  auto lang_name = enum_flags_name(lang);
361  REQUIRE(enum_flags_name<LanguageFlag&>(lk) == "한국어");
362  REQUIRE(enum_flags_name<const LanguageFlag>(LanguageFlag::English) == "English");
363  REQUIRE(lang_name == "日本語");
365  REQUIRE(enum_flags_name(static_cast<LanguageFlag>(0)).empty());
366 }
367 
368 TEST_CASE("flag enum_names") {
369  constexpr auto& s5 = enum_names<const LanguageFlag>();
370  REQUIRE(s5 == std::array<std::string_view, 4>{{"日本語", "한국어", "English", "😃"}});
371 }
372 
373 TEST_CASE("flag enum_entries") {
374  constexpr auto& s5 = enum_entries<const LanguageFlag>();
375  REQUIRE(s5 == std::array<std::pair<LanguageFlag, std::string_view>, 4>{{{LanguageFlag::日本語, "日本語"}, {LanguageFlag::한국어, "한국어"}, {LanguageFlag::English, "English"}, {LanguageFlag::😃, "😃"}}});
376 }
377 
378 TEST_CASE("flag ostream_operators") {
379  auto test_ostream = [](auto e, std::string name) {
380  using namespace magic_enum::ostream_operators;
381  std::stringstream ss;
382  ss << e;
383  REQUIRE(ss.str() == name);
384  };
385 
386  test_ostream(std::make_optional(LanguageFlag::日本語), "日本語");
387  test_ostream(LanguageFlag::한국어, "한국어");
388  test_ostream(LanguageFlag::English, "English");
389  test_ostream(LanguageFlag::😃, "😃");
390  test_ostream(static_cast<LanguageFlag>(0), "0");
391  test_ostream(std::make_optional(static_cast<LanguageFlag>(0)), "0");
392 }
393 
394 TEST_CASE("flag istream_operators") {
395  auto test_istream = [](const auto e, std::string name) {
396  using namespace magic_enum::istream_operators;
397  std::istringstream ss(name);
398  std::decay_t<decltype(e)> v;
399  ss >> v;
400  REQUIRE(v == e);
401  REQUIRE(ss);
402  };
403 
404  test_istream(LanguageFlag::한국어, "한국어");
405  test_istream(LanguageFlag::English, "English");
406  test_istream(LanguageFlag::😃, "😃");
407 }
408 
409 
410 TEST_CASE("flag bitwise_operators") {
411  using namespace magic_enum::bitwise_operators;
412  SECTION("operator~") {
414  }
415 
416  SECTION("operator|") {
418  }
419 
420  SECTION("operator&") {
422  }
423 
424  SECTION("operator^") {
426  }
427 
428  SECTION("operator|=") {
432  }
433 
434  SECTION("operator&=") {
438  }
439 
440  SECTION("operator^=") {
444  }
445 }
magic_enum::bitwise_operators
Definition: magic_enum.hpp:1464
MAGIC_ENUM_RANGE_MAX
#define MAGIC_ENUM_RANGE_MAX
Definition: test_nonascii.cpp:29
magic_enum.hpp
Language::日本語
@ 日本語
LanguageFlag
LanguageFlag
Definition: test_nonascii.cpp:41
magic_enum::enum_flags_name
auto enum_flags_name(E value, char_type sep=static_cast< char_type >('|')) -> detail::enable_if_t< E, string >
Definition: magic_enum_flags.hpp:67
LanguageFlag::한국어
@ 한국어
Language::한국어
@ 한국어
magic_enum_iostream.hpp
magic_enum::detail::value
constexpr E value(std::size_t i) noexcept
Definition: magic_enum.hpp:679
magic_enum::ostream_operators
Definition: magic_enum_iostream.hpp:44
Language::😃
@ 😃
magic_enum::enum_contains
constexpr auto enum_contains(E value) noexcept -> detail::enable_if_t< E, bool >
Definition: magic_enum.hpp:1396
REQUIRE
#define REQUIRE(...)
Definition: catch.hpp:17637
SECTION
#define SECTION(...)
Definition: catch.hpp:17677
LanguageFlag::😃
@ 😃
magic_enum::is_magic_enum_supported
constexpr bool is_magic_enum_supported
Definition: magic_enum.hpp:1141
TEST_CASE
TEST_CASE("enum_cast")
Definition: test_nonascii.cpp:52
magic_enum::enum_index
constexpr auto enum_index(E value) noexcept -> detail::enable_if_t< E, optional< std::size_t >>
Definition: magic_enum.hpp:1238
magic_enum_fuse.hpp
magic_enum::detail::max_v
constexpr auto max_v
Definition: magic_enum.hpp:839
magic_enum::detail::min_v
constexpr auto min_v
Definition: magic_enum.hpp:836
magic_enum::istream_operators
Definition: magic_enum_iostream.hpp:78
magic_enum::customize::enum_range
Definition: magic_enum.hpp:172
catch.hpp
magic_enum::enum_name
constexpr auto enum_name() noexcept -> detail::enable_if_t< decltype(V), string_view >
Definition: magic_enum.hpp:1290
magic_enum::detail::reflected_max
constexpr int reflected_max() noexcept
Definition: magic_enum.hpp:700
REQUIRE_FALSE
#define REQUIRE_FALSE(...)
Definition: catch.hpp:17638
Language::TVÅ
@ TVÅ
LanguageFlag::日本語
@ 日本語
LanguageFlag::English
@ English
magic_enum
Definition: magic_enum.hpp:126
magic_enum::detail::reflected_min
constexpr int reflected_min() noexcept
Definition: magic_enum.hpp:684
Language
Language
Definition: example_nonascii_name.cpp:28
Language::English
@ English
magic_enum::enum_integer
constexpr auto enum_integer(E value) noexcept -> detail::enable_if_t< E, underlying_type_t< E >>
Definition: magic_enum.hpp:1225
MAGIC_ENUM_RANGE_MIN
#define MAGIC_ENUM_RANGE_MIN
Definition: test_nonascii.cpp:27


magic_enum
Author(s):
autogenerated on Fri Feb 21 2025 03:20:19