| // Copyright 2016, VIXL authors |
| // All rights reserved. |
| // |
| // Redistribution and use in source and binary forms, with or without |
| // modification, are permitted provided that the following conditions are met: |
| // |
| // * Redistributions of source code must retain the above copyright notice, |
| // this list of conditions and the following disclaimer. |
| // * Redistributions in binary form must reproduce the above copyright notice, |
| // this list of conditions and the following disclaimer in the documentation |
| // and/or other materials provided with the distribution. |
| // * Neither the name of ARM Limited nor the names of its contributors may be |
| // used to endorse or promote products derived from this software without |
| // specific prior written permission. |
| // |
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS CONTRIBUTORS "AS IS" AND |
| // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
| // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
| // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE |
| // FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
| // DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
| // SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
| // CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
| // OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
| |
| #include "test-runner.h" |
| |
| #include "utils-vixl.h" |
| |
| #define TEST(name) TEST_(API_##name) |
| |
| #define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) |
| |
| namespace vixl { |
| |
| // Describe the result of a test. Should IsUintN() and IsIntN() return true or |
| // false for N and X? |
| template <typename T> |
| struct UintIntTest { |
| bool is_uintn; |
| bool is_intn; |
| unsigned n; |
| T x; |
| }; |
| |
| // Test IsUintN() and IsIntN() against various values and integral types. |
| TEST(IsUint_IsInt) { |
| UintIntTest<uint32_t> test_little_values_unsigned[] = { |
| { true, true, 1, UINT32_C(0x0) }, |
| { true, false, 1, UINT32_C(0x1) }, |
| { false, false, 1, UINT32_C(0x2) }, |
| { false, false, 1, UINT32_C(0x3) }, |
| { false, false, 1, UINT32_C(0x4) }, |
| { false, false, 1, UINT32_C(0x5) }, |
| { false, false, 1, UINT32_C(0x6) }, |
| { false, false, 1, UINT32_C(0x7) }, |
| { false, false, 1, UINT32_C(0x8) }, |
| { false, false, 1, UINT32_C(0x9) }, |
| { false, false, 1, UINT32_C(0xa) }, |
| { false, false, 1, UINT32_C(0xb) }, |
| { false, false, 1, UINT32_C(0xc) }, |
| { false, false, 1, UINT32_C(0xd) }, |
| { false, false, 1, UINT32_C(0xe) }, |
| { false, false, 1, UINT32_C(0xf) }, |
| |
| { true, true, 2, UINT32_C(0x0) }, |
| { true, true, 2, UINT32_C(0x1) }, |
| { true, false, 2, UINT32_C(0x2) }, |
| { true, false, 2, UINT32_C(0x3) }, |
| { false, false, 2, UINT32_C(0x4) }, |
| { false, false, 2, UINT32_C(0x5) }, |
| { false, false, 2, UINT32_C(0x6) }, |
| { false, false, 2, UINT32_C(0x7) }, |
| { false, false, 2, UINT32_C(0x8) }, |
| { false, false, 2, UINT32_C(0x9) }, |
| { false, false, 2, UINT32_C(0xa) }, |
| { false, false, 2, UINT32_C(0xb) }, |
| { false, false, 2, UINT32_C(0xc) }, |
| { false, false, 2, UINT32_C(0xd) }, |
| { false, false, 2, UINT32_C(0xe) }, |
| { false, false, 2, UINT32_C(0xf) }, |
| }; |
| |
| UintIntTest<int32_t> test_little_values_signed[] = { |
| { true, true, 1, INT32_C(0) }, |
| { true, false, 1, INT32_C(1) }, |
| { false, false, 1, INT32_C(2) }, |
| { false, false, 1, INT32_C(3) }, |
| { false, false, 1, INT32_C(4) }, |
| { false, false, 1, INT32_C(5) }, |
| { false, false, 1, INT32_C(6) }, |
| { false, false, 1, INT32_C(7) }, |
| { false, true, 1, INT32_C(-1) }, |
| { false, false, 1, INT32_C(-2) }, |
| { false, false, 1, INT32_C(-3) }, |
| { false, false, 1, INT32_C(-4) }, |
| { false, false, 1, INT32_C(-5) }, |
| { false, false, 1, INT32_C(-6) }, |
| { false, false, 1, INT32_C(-7) }, |
| { false, false, 1, INT32_C(-8) }, |
| |
| { true, true, 2, INT32_C(0) }, |
| { true, true, 2, INT32_C(1) }, |
| { true, false, 2, INT32_C(2) }, |
| { true, false, 2, INT32_C(3) }, |
| { false, false, 2, INT32_C(4) }, |
| { false, false, 2, INT32_C(5) }, |
| { false, false, 2, INT32_C(6) }, |
| { false, false, 2, INT32_C(7) }, |
| { false, true, 2, INT32_C(-1) }, |
| { false, true, 2, INT32_C(-2) }, |
| { false, false, 2, INT32_C(-3) }, |
| { false, false, 2, INT32_C(-4) }, |
| { false, false, 2, INT32_C(-5) }, |
| { false, false, 2, INT32_C(-6) }, |
| { false, false, 2, INT32_C(-7) }, |
| { false, false, 2, INT32_C(-8) }, |
| }; |
| |
| UintIntTest<uint32_t> test_u16[] = { |
| { true, true, 16, UINT32_C(0x0) }, |
| { true, false, 16, UINT32_C(0xabcd) }, |
| { true, false, 16, UINT32_C(0x8000) }, |
| { true, false, 16, UINT32_C(0xffff) }, |
| { false, false, 16, UINT32_C(0x10000) }, |
| { false, false, 16, UINT32_C(0xffff0000) }, |
| { false, false, 16, UINT32_C(0xffff8000) }, |
| { false, false, 16, UINT32_C(0xffffffff) }, |
| }; |
| |
| UintIntTest<int32_t> test_i16[] = { |
| { true, true, 16, INT32_C(0x0) }, |
| { true, false, 16, INT32_C(0xabcd) }, |
| { true, false, 16, INT32_C(0x8000) }, |
| { true, false, 16, INT32_C(0xffff) }, |
| { false, false, 16, INT32_C(0x10000) }, |
| { true, true, 16, INT32_C(42) }, |
| { false, true, 16, INT32_C(-42) }, |
| { false, true, 16, INT32_C(-1) }, |
| }; |
| |
| UintIntTest<uint64_t> test_u32[] = { |
| { true, true, 32, UINT64_C(0x0) }, |
| { true, false, 32, UINT64_C(0xabcdabcd) }, |
| { true, false, 32, UINT64_C(0x80000000) }, |
| { true, false, 32, UINT64_C(0xffffffff) }, |
| }; |
| |
| UintIntTest<int64_t> test_i32[] = { |
| { true, true, 32, INT64_C(0) }, |
| { true, true, 32, INT64_C(42) }, |
| { false, true, 32, INT64_C(-42) }, |
| { false, true, 32, INT64_C(-1) }, |
| { true, true, 32, INT64_C(2147483647) }, // (1 << (32 - 1)) - 1 |
| { false, true, 32, INT64_C(-2147483648) }, // -(1 << (32 - 1)) |
| }; |
| |
| UintIntTest<uint64_t> test_unsigned_higher_than_32[] = { |
| { false, false, 54, UINT64_C(0xabcdef9012345678) }, |
| { true, false, 33, UINT64_C(0x100000000) }, |
| { true, false, 62, UINT64_C(0x3fffffffffffffff) }, |
| { true, false, 63, UINT64_C(0x7fffffffffffffff) }, |
| }; |
| |
| UintIntTest<int64_t> test_signed_higher_than_32[] = { |
| { true, true, 54, INT64_C(9007199254740991) }, // (1 << (54 - 1)) - 1 |
| { true, false, 54, INT64_C(9007199254740992) }, // 1 << (54 - 1) |
| { true, true, 33, INT64_C(4294967295) }, // (1 << (33 - 1) - 1) |
| { false, true, 33, INT64_C(-4294967296) }, // -(1 << (33 - 1)) |
| }; |
| |
| #define TEST_LIST(M) \ |
| M(test_little_values_unsigned) \ |
| M(test_little_values_signed) \ |
| M(test_u16) \ |
| M(test_i16) \ |
| M(test_u32) \ |
| M(test_i32) \ |
| M(test_unsigned_higher_than_32) \ |
| M(test_signed_higher_than_32) |
| |
| |
| #define TEST_UINT(test_vector) \ |
| for (unsigned i = 0; i < ARRAY_SIZE(test_vector); i++) { \ |
| if (test_vector[i].is_uintn) { \ |
| VIXL_CHECK(IsUintN(test_vector[i].n, test_vector[i].x)); \ |
| } else { \ |
| VIXL_CHECK(!IsUintN(test_vector[i].n, test_vector[i].x)); \ |
| } \ |
| } |
| |
| #define TEST_INT(test_vector) \ |
| for (unsigned i = 0; i < ARRAY_SIZE(test_vector); i++) { \ |
| if (test_vector[i].is_intn) { \ |
| VIXL_CHECK(IsIntN(test_vector[i].n, test_vector[i].x)); \ |
| } else { \ |
| VIXL_CHECK(!IsIntN(test_vector[i].n, test_vector[i].x)); \ |
| } \ |
| } |
| |
| TEST_LIST(TEST_UINT) |
| TEST_LIST(TEST_INT) |
| |
| #undef TEST_UINT |
| #undef TEST_INT |
| |
| #undef TEST_LIST |
| } |
| |
| } // namespace vixl |