based

Opinionated utility library
git clone git://git.dimitrijedobrota.com/based.git
Log | Files | Refs | README | LICENSE | HACKING | CONTRIBUTING | CODE_OF_CONDUCT | BUILDING

standard_test.cpp (1436B)


0 #define CATCH_CONFIG_RUNTIME_STATIC_REQUIRE
2 #include <catch2/catch_test_macros.hpp>
4 #include "based/concept/is_invocable.hpp"
5 #include "based/enum/enum.hpp"
6 #include "based/integral/types.hpp"
8 struct Test
9 {
10 BASED_ENUM_STANDARD(var, based::I8) {
11 a,
12 b,
13 c,
14 min = a,
15 max = c,
16 none = -1,
17 };
19 [[nodiscard]] int get_var(var req) const;
21 private:
22 int m_a = 1;
23 int m_b = 2;
24 int m_c = 3;
25 };
27 BASED_ENUM_TRAITS_STANDARD(Test::var, based::I8)
29 inline int Test::get_var(var req) const
30 {
31 switch (based::enumeration::enum_cast<var>(req)) {
32 case var::a:
33 return m_a;
34 case var::b:
35 return m_b;
36 case var::c:
37 return m_c;
38 case var::none:
39 return -1;
40 }
41 }
43 TEST_CASE("types", "[enum/standard]")
44 {
45 STATIC_REQUIRE(requires { typename Test::var; });
47 STATIC_REQUIRE(requires { Test::var::a; });
48 STATIC_REQUIRE(requires { Test::var::b; });
49 STATIC_REQUIRE(requires { Test::var::c; });
50 STATIC_REQUIRE(requires { Test::var::min; });
51 STATIC_REQUIRE(requires { Test::var::max; });
52 STATIC_REQUIRE(requires { Test::var::none; });
53 }
55 TEST_CASE("safety", "[enum/standard]")
56 {
57 const Test crnt;
59 REQUIRE(crnt.get_var(Test::var::a) == 1);
60 REQUIRE(crnt.get_var(Test::var::b) == 2);
61 REQUIRE(crnt.get_var(Test::var::c) == 3);
63 REQUIRE(!based::trait::IsInvocable<decltype(&Test::get_var), based::U8>);
64 REQUIRE(!based::trait::IsInvocable<decltype(&Test::get_var), int>);
65 }