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