Pawin Vongmasa | 3665390 | 2018-11-15 00:10:25 -0800 | [diff] [blame^] | 1 | /* |
| 2 | * Copyright 2014 The Android Open Source Project |
| 3 | * |
| 4 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 5 | * you may not use this file except in compliance with the License. |
| 6 | * You may obtain a copy of the License at |
| 7 | * |
| 8 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 9 | * |
| 10 | * Unless required by applicable law or agreed to in writing, software |
| 11 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 12 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 13 | * See the License for the specific language governing permissions and |
| 14 | * limitations under the License. |
| 15 | */ |
| 16 | |
| 17 | //#define LOG_NDEBUG 0 |
| 18 | #define LOG_TAG "C2_test" |
| 19 | |
| 20 | #include <gtest/gtest.h> |
| 21 | |
| 22 | #include <C2.h> |
| 23 | |
| 24 | /* ======================================= STATIC TESTS ======================================= */ |
| 25 | |
| 26 | template<int N> |
| 27 | struct c2_const_checker |
| 28 | { |
| 29 | inline constexpr static int num() { return N; } |
| 30 | }; |
| 31 | |
| 32 | constexpr auto min_i32_i32 = c2_min(int32_t(1), int32_t(2)); |
| 33 | static_assert(std::is_same<decltype(min_i32_i32), const int32_t>::value, "should be int32_t"); |
| 34 | constexpr auto min_i32_i64 = c2_min(int32_t(3), int64_t(2)); |
| 35 | static_assert(std::is_same<decltype(min_i32_i64), const int64_t>::value, "should be int64_t"); |
| 36 | constexpr auto min_i8_i32 = c2_min(int8_t(0xff), int32_t(0xffffffff)); |
| 37 | static_assert(std::is_same<decltype(min_i8_i32), const int32_t>::value, "should be int32_t"); |
| 38 | |
| 39 | static_assert(c2_const_checker<min_i32_i32>::num() == 1, "should be 1"); |
| 40 | static_assert(c2_const_checker<min_i32_i64>::num() == 2, "should be 2"); |
| 41 | static_assert(c2_const_checker<min_i8_i32>::num() == 0xffffffff, "should be 0xffffffff"); |
| 42 | |
| 43 | constexpr auto min_u32_u32 = c2_min(uint32_t(1), uint32_t(2)); |
| 44 | static_assert(std::is_same<decltype(min_u32_u32), const uint32_t>::value, "should be uint32_t"); |
| 45 | constexpr auto min_u32_u64 = c2_min(uint32_t(3), uint64_t(2)); |
| 46 | static_assert(std::is_same<decltype(min_u32_u64), const uint32_t>::value, "should be uint32_t"); |
| 47 | constexpr auto min_u32_u8 = c2_min(uint32_t(0xffffffff), uint8_t(0xff)); |
| 48 | static_assert(std::is_same<decltype(min_u32_u8), const uint8_t>::value, "should be uint8_t"); |
| 49 | |
| 50 | static_assert(c2_const_checker<min_u32_u32>::num() == 1, "should be 1"); |
| 51 | static_assert(c2_const_checker<min_u32_u64>::num() == 2, "should be 2"); |
| 52 | static_assert(c2_const_checker<min_u32_u8>::num() == 0xff, "should be 0xff"); |
| 53 | |
| 54 | constexpr auto max_i32_i32 = c2_max(int32_t(1), int32_t(2)); |
| 55 | static_assert(std::is_same<decltype(max_i32_i32), const int32_t>::value, "should be int32_t"); |
| 56 | constexpr auto max_i32_i64 = c2_max(int32_t(3), int64_t(2)); |
| 57 | static_assert(std::is_same<decltype(max_i32_i64), const int64_t>::value, "should be int64_t"); |
| 58 | constexpr auto max_i8_i32 = c2_max(int8_t(0xff), int32_t(0xffffffff)); |
| 59 | static_assert(std::is_same<decltype(max_i8_i32), const int32_t>::value, "should be int32_t"); |
| 60 | |
| 61 | static_assert(c2_const_checker<max_i32_i32>::num() == 2, "should be 2"); |
| 62 | static_assert(c2_const_checker<max_i32_i64>::num() == 3, "should be 3"); |
| 63 | static_assert(c2_const_checker<max_i8_i32>::num() == 0xffffffff, "should be 0xffffffff"); |
| 64 | |
| 65 | constexpr auto max_u32_u32 = c2_max(uint32_t(1), uint32_t(2)); |
| 66 | static_assert(std::is_same<decltype(max_u32_u32), const uint32_t>::value, "should be uint32_t"); |
| 67 | constexpr auto max_u32_u64 = c2_max(uint32_t(3), uint64_t(2)); |
| 68 | static_assert(std::is_same<decltype(max_u32_u64), const uint64_t>::value, "should be uint64_t"); |
| 69 | constexpr auto max_u32_u8 = c2_max(uint32_t(0x7fffffff), uint8_t(0xff)); |
| 70 | static_assert(std::is_same<decltype(max_u32_u8), const uint32_t>::value, "should be uint32_t"); |
| 71 | |
| 72 | static_assert(c2_const_checker<max_u32_u32>::num() == 2, "should be 2"); |
| 73 | static_assert(c2_const_checker<max_u32_u64>::num() == 3, "should be 3"); |
| 74 | static_assert(c2_const_checker<max_u32_u8>::num() == 0x7fffffff, "should be 0x7fffffff"); |
| 75 | |
| 76 | /* ======================================= COUNTER TESTS ======================================= */ |
| 77 | |
| 78 | void c2_cntr_static_test() { |
| 79 | // sanity checks for construction/assignment |
| 80 | constexpr c2_cntr32_t c32_a(123); |
| 81 | constexpr c2_cntr64_t c64_a(-456); |
| 82 | c2_cntr32_t c32_b __unused = c64_a; |
| 83 | // c32_b = 64.; // DISALLOWED |
| 84 | // c2_cntr64_t c64_b = c32_a; // DISALLOWED |
| 85 | |
| 86 | // sanity checks for some constexpr operators |
| 87 | static_assert(std::is_same<decltype(c32_a + c64_a), decltype(c64_a + c32_a)>::value, "+ should result same type"); |
| 88 | static_assert(c32_a + c64_a == c2_cntr32_t(-333), "123 + -456 = -333"); |
| 89 | static_assert(c32_a + c32_a == c2_cntr32_t(246), "123 + 123 = 246"); |
| 90 | static_assert(c64_a + c32_a == c2_cntr32_t(-333), "-456 + 123 = 579"); |
| 91 | static_assert(std::is_same<decltype(c32_a + 1), decltype(1 + c32_a)>::value, "+ should result same type"); |
| 92 | static_assert(c32_a + 456 == c2_cntr32_t(579), "123 + 456 = 579"); |
| 93 | static_assert(456 + c64_a == c2_cntr64_t(0), "456 + -456 = 0"); |
| 94 | static_assert(std::is_same<decltype(c32_a - c64_a), decltype(c64_a - c32_a)>::value, "- should result same type"); |
| 95 | static_assert(c32_a - c64_a == c2_cntr32_t(579), "123 - -456 = 579"); |
| 96 | static_assert(c32_a - c32_a == c2_cntr32_t(0), "123 - 123 = 0"); |
| 97 | static_assert(c64_a - c32_a == c2_cntr32_t(-579), "-456 - 123 = -579"); |
| 98 | static_assert(std::is_same<decltype(c32_a - 1), decltype(1 - c32_a)>::value, "- should result same type"); |
| 99 | static_assert(c32_a - 456 == c2_cntr32_t(-333), "123 - 456 = -333"); |
| 100 | static_assert(456 - c64_a == c2_cntr64_t(912), "456 - -456 = 912"); |
| 101 | static_assert(std::is_same<decltype(c32_a * c64_a), decltype(c64_a * c32_a)>::value, "* should result same type"); |
| 102 | static_assert(c32_a * c64_a == c2_cntr32_t(-56088), "123 * -456 = -56088"); |
| 103 | static_assert(c32_a * c32_a == c2_cntr32_t(15129), "123 * 123 = 15129"); |
| 104 | static_assert(c64_a * c32_a == c2_cntr32_t(-56088), "-456 * 123 = -56088"); |
| 105 | static_assert(std::is_same<decltype(c32_a * 1), decltype(1 * c32_a)>::value, "* should result same type"); |
| 106 | static_assert(c32_a * 456 == c2_cntr32_t(56088), "123 * 456 = 56088"); |
| 107 | static_assert(456 * c64_a == c2_cntr64_t(-207936), "456 * -456 = -207936"); |
| 108 | |
| 109 | static_assert((c32_a << 26u) == c2_cntr32_t(0xEC000000), "123 << 26 = 0xEC000000"); |
| 110 | |
| 111 | // sanity checks for unary operators |
| 112 | static_assert(c2_cntr32_t(1) == +c2_cntr32_t(1), "1 == +1"); |
| 113 | static_assert(c2_cntr32_t(1) == -c2_cntr32_t(-1), "1 == --1"); |
| 114 | |
| 115 | // sanity checks for comparison |
| 116 | using c8_t = c2_cntr_t<uint8_t>; |
| 117 | static_assert(c8_t(-0x80) > c8_t(0x7f), "80 > 7F"); |
| 118 | static_assert(c8_t(-0x80) >= c8_t(0x7f), "80 >= 7F"); |
| 119 | static_assert(c8_t(0x7f) > c8_t(0x7e), "7F > 7E"); |
| 120 | static_assert(c8_t(0x7f) >= c8_t(0x7e), "7F >= 7E"); |
| 121 | static_assert(!(c8_t(-0x80) > c8_t(0)), "80 !> 00"); |
| 122 | static_assert(!(c8_t(-0x80) >= c8_t(0)), "80 !>= 00"); |
| 123 | static_assert(!(c8_t(-0x80) > c8_t(-0x80)), "80 !> 80"); |
| 124 | static_assert(c8_t(-0x80) >= c8_t(-0x80), "80 >= 80"); |
| 125 | |
| 126 | static_assert(c8_t(-0x80) == c8_t(0x80), "80 == 80"); |
| 127 | static_assert(!(c8_t(-0x80) == c8_t(0)), "80 != 0"); |
| 128 | static_assert(c8_t(-0x80) != c8_t(0x7f), "80 != 7F"); |
| 129 | static_assert(!(c8_t(0x7f) != c8_t(0x7f)), "80 != 7F"); |
| 130 | |
| 131 | static_assert(c8_t(0x7f) < c8_t(-0x80), "7F < 80"); |
| 132 | static_assert(c8_t(0x7f) <= c8_t(-0x80), "7F < 80"); |
| 133 | static_assert(c8_t(0x7e) < c8_t(0x7f), "7E < 7F"); |
| 134 | static_assert(c8_t(0x7e) <= c8_t(0x7f), "7E < 7F"); |
| 135 | static_assert(!(c8_t(-0x40) < c8_t(0x40)), "-40 !< 40"); |
| 136 | static_assert(!(c8_t(-0x40) <= c8_t(0x40)), "-40 !<= 40"); |
| 137 | static_assert(!(c8_t(-0x40) < c8_t(-0x40)), "-40 !< -40"); |
| 138 | static_assert(c8_t(-0x40) <= c8_t(-0x40), "-40 <= -40"); |
| 139 | |
| 140 | static_assert(c2_cntr32_t(-0x7fffffff - 1) > c2_cntr32_t(0x7fffffff), "80 > 7F"); |
| 141 | static_assert(!(c2_cntr32_t(-0x7fffffff - 1) > c2_cntr32_t(0)), "80 !> 00"); |
| 142 | static_assert(c2_cntr32_t(1) == c2_cntr32_t(c2_cntr64_t(0x100000001ul)), "1 == 1"); |
| 143 | } |
| 144 | |
| 145 | class C2Test : public ::testing::Test { |
| 146 | }; |
| 147 | |
| 148 | TEST_F(C2Test, CounterTest) { |
| 149 | c2_cntr32_t c32_a(123); |
| 150 | c2_cntr64_t c64_a(-456); |
| 151 | EXPECT_EQ(c32_a += 3, c2_cntr32_t(126)); |
| 152 | EXPECT_EQ(c32_a += c64_a, c2_cntr32_t(-330)); |
| 153 | EXPECT_EQ(c32_a <<= 2u, c2_cntr32_t(-1320)); |
| 154 | EXPECT_EQ(c64_a *= 3, c2_cntr64_t(-1368)); |
| 155 | EXPECT_EQ(c32_a -= c64_a, c2_cntr32_t(48)); |
| 156 | EXPECT_EQ(c32_a -= 40, c2_cntr32_t(8)); |
| 157 | EXPECT_EQ(c32_a *= c32_a, c2_cntr32_t(64)); |
| 158 | } |
| 159 | |