1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
#ifndef C4CORE_SINGLE_HEADER
#include "c4/szconv.hpp"
#endif
#include "c4/libtest/supprwarn_push.hpp"
#include "c4/test.hpp"
#define C4_EXPECT_NARROWER(yes_or_no, ty_out, ty_in) \
CHECK_UNARY(( yes_or_no (is_narrower_size<ty_out C4_COMMA ty_in>::value)));
namespace c4 {
TEST_CASE("is_narrower_size.signed_types")
{
C4_EXPECT_NARROWER( ! , int8_t , int8_t );
C4_EXPECT_NARROWER( , int8_t , int16_t);
C4_EXPECT_NARROWER( , int8_t , int32_t);
C4_EXPECT_NARROWER( , int8_t , int64_t);
C4_EXPECT_NARROWER( , int8_t , uint8_t );
C4_EXPECT_NARROWER( , int8_t , uint16_t);
C4_EXPECT_NARROWER( , int8_t , uint32_t);
C4_EXPECT_NARROWER( , int8_t , uint64_t);
C4_EXPECT_NARROWER( ! , int16_t , int8_t );
C4_EXPECT_NARROWER( ! , int16_t , int16_t);
C4_EXPECT_NARROWER( , int16_t , int32_t);
C4_EXPECT_NARROWER( , int16_t , int64_t);
C4_EXPECT_NARROWER( ! , int16_t , uint8_t );
C4_EXPECT_NARROWER( , int16_t , uint16_t);
C4_EXPECT_NARROWER( , int16_t , uint32_t);
C4_EXPECT_NARROWER( , int16_t , uint64_t);
C4_EXPECT_NARROWER( ! , int32_t , int8_t );
C4_EXPECT_NARROWER( ! , int32_t , int16_t);
C4_EXPECT_NARROWER( ! , int32_t , int32_t);
C4_EXPECT_NARROWER( , int32_t , int64_t);
C4_EXPECT_NARROWER( ! , int32_t , uint8_t );
C4_EXPECT_NARROWER( ! , int32_t , uint16_t);
C4_EXPECT_NARROWER( , int32_t , uint32_t);
C4_EXPECT_NARROWER( , int32_t , uint64_t);
C4_EXPECT_NARROWER( ! , int64_t , int8_t );
C4_EXPECT_NARROWER( ! , int64_t , int16_t);
C4_EXPECT_NARROWER( ! , int64_t , int32_t);
C4_EXPECT_NARROWER( ! , int64_t , int64_t);
C4_EXPECT_NARROWER( ! , int64_t , uint8_t );
C4_EXPECT_NARROWER( ! , int64_t , uint16_t);
C4_EXPECT_NARROWER( ! , int64_t , uint32_t);
C4_EXPECT_NARROWER( , int64_t , uint64_t);
}
TEST_CASE("is_narrower_size.unsigned_types")
{
C4_EXPECT_NARROWER( ! , uint8_t , int8_t );
C4_EXPECT_NARROWER( , uint8_t , int16_t);
C4_EXPECT_NARROWER( , uint8_t , int32_t);
C4_EXPECT_NARROWER( , uint8_t , int64_t);
C4_EXPECT_NARROWER( ! , uint8_t , uint8_t );
C4_EXPECT_NARROWER( , uint8_t , uint16_t);
C4_EXPECT_NARROWER( , uint8_t , uint32_t);
C4_EXPECT_NARROWER( , uint8_t , uint64_t);
C4_EXPECT_NARROWER( ! , uint16_t , int8_t );
C4_EXPECT_NARROWER( ! , uint16_t , int16_t);
C4_EXPECT_NARROWER( , uint16_t , int32_t);
C4_EXPECT_NARROWER( , uint16_t , int64_t);
C4_EXPECT_NARROWER( ! , uint16_t , uint8_t );
C4_EXPECT_NARROWER( ! , uint16_t , uint16_t);
C4_EXPECT_NARROWER( , uint16_t , uint32_t);
C4_EXPECT_NARROWER( , uint16_t , uint64_t);
C4_EXPECT_NARROWER( ! , uint32_t , int8_t );
C4_EXPECT_NARROWER( ! , uint32_t , int16_t);
C4_EXPECT_NARROWER( ! , uint32_t , int32_t);
C4_EXPECT_NARROWER( , uint32_t , int64_t);
C4_EXPECT_NARROWER( ! , uint32_t , uint8_t );
C4_EXPECT_NARROWER( ! , uint32_t , uint16_t);
C4_EXPECT_NARROWER( ! , uint32_t , uint32_t);
C4_EXPECT_NARROWER( , uint32_t , uint64_t);
C4_EXPECT_NARROWER( ! , uint64_t , int8_t );
C4_EXPECT_NARROWER( ! , uint64_t , int16_t);
C4_EXPECT_NARROWER( ! , uint64_t , int32_t);
C4_EXPECT_NARROWER( ! , uint64_t , int64_t);
C4_EXPECT_NARROWER( ! , uint64_t , uint8_t );
C4_EXPECT_NARROWER( ! , uint64_t , uint16_t);
C4_EXPECT_NARROWER( ! , uint64_t , uint32_t);
C4_EXPECT_NARROWER( ! , uint64_t , uint64_t);
}
template<typename I, typename O>
typename std::enable_if<std::is_same<I, O>::value, void>::type
test_szconv()
{
// nothing to do here
}
template<typename I, typename O>
typename std::enable_if< ! std::is_same<I, O>::value, void>::type
test_szconv()
{
C4_STATIC_ASSERT(std::is_integral<I>::value);
C4_STATIC_ASSERT(std::is_integral<O>::value);
const I imax = std::numeric_limits<I>::max();
const I imin = std::numeric_limits<I>::min();
const O omax = std::numeric_limits<O>::max();
const O omin = std::numeric_limits<O>::min();
CHECK_EQ(szconv<O>(I(0)), O(0));
CHECK_EQ(szconv<I>(I(0)), I(0));
#if C4_USE_XASSERT
if((uint64_t)omax < (uint64_t)imax)
{
C4_EXPECT_ERROR_OCCURS([&]{
O out = szconv<O>(imax);
});
}
else if((uint64_t)omax > (uint64_t)imax)
{
C4_EXPECT_ERROR_OCCURS([&]{
I out = szconv<I>(omax);
});
}
#endif
}
#define DO_TEST_SZCONV(ty) \
TEST_CASE("szconv." #ty "_to_int8") \
{ \
test_szconv<ty##_t, int8_t>(); \
} \
TEST_CASE("zconv." #ty "_to_uint8") \
{ \
test_szconv<ty##_t, uint8_t>(); \
} \
TEST_CASE("zconv." #ty "_to_int16") \
{ \
test_szconv<ty##_t, int16_t>(); \
} \
TEST_CASE("zconv." #ty "_to_uint16") \
{ \
test_szconv<ty##_t, uint16_t>(); \
} \
TEST_CASE("zconv." #ty "_to_int32") \
{ \
test_szconv<ty##_t, int32_t>(); \
} \
TEST_CASE("zconv." #ty "_to_uint32") \
{ \
test_szconv<ty##_t, uint32_t>(); \
} \
TEST_CASE("zconv." #ty "_to_int64") \
{ \
test_szconv<ty##_t, int64_t>(); \
} \
TEST_CASE("szconv." #ty "_to_uint64") \
{ \
test_szconv<ty##_t, uint64_t>(); \
}
DO_TEST_SZCONV(int8)
DO_TEST_SZCONV(uint8)
DO_TEST_SZCONV(int16)
DO_TEST_SZCONV(uint16)
DO_TEST_SZCONV(int32)
DO_TEST_SZCONV(uint32)
DO_TEST_SZCONV(int64)
DO_TEST_SZCONV(uint64)
} // namespace c4
#include "c4/libtest/supprwarn_pop.hpp"
|