1 #include "type_name.hpp"
2 
3 #include <catch2/catch.hpp>
4 
5 namespace estd {
6 
7 TEST_CASE("type_name<T> works for primitive types", "[type_name]") {
8 	CHECK(type_name<bool>()      == "bool");
9 	CHECK(type_name<char>()      == "char");
10 	CHECK(type_name<short>()     == "short");
11 	CHECK(type_name<int>()       == "int");
12 	CHECK(type_name<long>()      == "long");
13 	CHECK(type_name<long long>() == "long long");
14 
15 	CHECK(type_name<unsigned char>()      == "unsigned char");
16 	CHECK(type_name<unsigned short>()     == "unsigned short");
17 	CHECK(type_name<unsigned int>()       == "unsigned int");
18 	CHECK(type_name<unsigned long>()      == "unsigned long");
19 	CHECK(type_name<unsigned long long>() == "unsigned long long");
20 
21 	CHECK(type_name<float>()       == "float");
22 	CHECK(type_name<double>()      == "double");
23 	CHECK(type_name<long double>() == "long double");
24 }
25 
26 TEST_CASE("full_type_name<T> works for primitive types", "[type_name]") {
27 	CHECK(full_type_name<bool>()      == "bool");
28 	CHECK(full_type_name<char>()      == "char");
29 	CHECK(full_type_name<short>()     == "short");
30 	CHECK(full_type_name<int>()       == "int");
31 	CHECK(full_type_name<long>()      == "long");
32 	CHECK(full_type_name<long long>() == "long long");
33 
34 	CHECK(full_type_name<unsigned char>()      == "unsigned char");
35 	CHECK(full_type_name<unsigned short>()     == "unsigned short");
36 	CHECK(full_type_name<unsigned int>()       == "unsigned int");
37 	CHECK(full_type_name<unsigned long>()      == "unsigned long");
38 	CHECK(full_type_name<unsigned long long>() == "unsigned long long");
39 
40 	CHECK(full_type_name<float>()       == "float");
41 	CHECK(full_type_name<double>()      == "double");
42 	CHECK(full_type_name<long double>() == "long double");
43 }
44 
45 TEST_CASE("type_name<T> works cv-qualified primitive types", "[type_name]") {
46 	CHECK(type_name<int>()                  == "int");
47 	CHECK(type_name<int const>()            == "int const");
48 	CHECK(type_name<int volatile>()         == "int volatile");
49 	CHECK(type_name<int const volatile>()   == "int const volatile");
50 }
51 
52 TEST_CASE("type_name<T> works cv-qualified primitive reference types", "[type_name]") {
53 	CHECK(type_name<int &>()                == "int &");
54 	CHECK(type_name<int const &>()          == "int const &");
55 	CHECK(type_name<int volatile &>()       == "int volatile &");
56 	CHECK(type_name<int volatile const &>() == "int const volatile &");
57 
58 	CHECK(type_name<int &&>()                == "int &&");
59 	CHECK(type_name<int const &&>()          == "int const &&");
60 	CHECK(type_name<int volatile &&>()       == "int volatile &&");
61 	CHECK(type_name<int volatile const &&>() == "int const volatile &&");
62 }
63 
64 TEST_CASE("type_name<T> works cv-qualified complex types", "[type_name]") {
65 	CHECK(type_name<std::string>()                  == "std::string");
66 	CHECK(type_name<std::string const>()            == "std::string const");
67 	CHECK(type_name<std::string volatile>()         == "std::string volatile");
68 	CHECK(type_name<std::string const volatile>()   == "std::string const volatile");
69 
70 	CHECK(type_name<std::string &>()                  == "std::string &");
71 	CHECK(type_name<std::string const &>()            == "std::string const &");
72 	CHECK(type_name<std::string volatile &>()         == "std::string volatile &");
73 	CHECK(type_name<std::string const volatile &>()   == "std::string const volatile &");
74 
75 	CHECK(type_name<std::string &&>()                  == "std::string &&");
76 	CHECK(type_name<std::string const &&>()            == "std::string const &&");
77 	CHECK(type_name<std::string volatile &&>()         == "std::string volatile &&");
78 	CHECK(type_name<std::string const volatile &&>()   == "std::string const volatile &&");
79 }
80 
81 template<typename T> struct Foo{};
82 
83 TEST_CASE("type_name<T> works cv-qualified templated types", "[type_name]") {
84 	CHECK(type_name<estd::Foo<int>>()                   == "estd::Foo<int>");
85 	CHECK(type_name<estd::Foo<int> const>()             == "estd::Foo<int> const");
86 	CHECK(type_name<estd::Foo<int> volatile>()          == "estd::Foo<int> volatile");
87 	CHECK(type_name<estd::Foo<int> const volatile>()    == "estd::Foo<int> const volatile");
88 
89 	CHECK(type_name<estd::Foo<int> &>()                 == "estd::Foo<int> &");
90 	CHECK(type_name<estd::Foo<int> const &>()           == "estd::Foo<int> const &");
91 	CHECK(type_name<estd::Foo<int> volatile &>()        == "estd::Foo<int> volatile &");
92 	CHECK(type_name<estd::Foo<int> const volatile &>()  == "estd::Foo<int> const volatile &");
93 
94 	CHECK(type_name<estd::Foo<int> &&>()                == "estd::Foo<int> &&");
95 	CHECK(type_name<estd::Foo<int> const &&>()          == "estd::Foo<int> const &&");
96 	CHECK(type_name<estd::Foo<int> volatile &&>()       == "estd::Foo<int> volatile &&");
97 	CHECK(type_name<estd::Foo<int> const volatile &&>() == "estd::Foo<int> const volatile &&");
98 }
99 
100 }
101