#include #include namespace NYql { Y_UNIT_TEST_SUITE(TYqlWideIntTest) { template void TestUnary(const T aa) { using Test = TWide::Type>; const Test at(aa); static_assert(sizeof(at) == sizeof(aa), "Bad wide int size!"); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); UNIT_ASSERT_VALUES_EQUAL(static_cast(aa), static_cast(at)); #ifndef _win_ UNIT_ASSERT(static_cast(aa) == static_cast(at)); UNIT_ASSERT(static_cast(aa) == static_cast(at)); #endif { const auto exp = ~aa; const auto tst = ~at; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = +aa; const auto tst = +at; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = -aa; const auto tst = -at; UNIT_ASSERT(T(tst) == T(exp)); } { auto exp = aa; auto tst = at; ++exp; ++tst; UNIT_ASSERT(T(tst) == T(exp)); } { auto exp = aa; auto tst = at; --exp; --tst; UNIT_ASSERT(T(tst) == T(exp)); } { auto exp = aa; auto tst = at; exp++; tst++; UNIT_ASSERT(T(tst) == T(exp)); } { auto exp = aa; auto tst = at; exp--; tst--; UNIT_ASSERT(T(tst) == T(exp)); } } template void TestBinary(const T ll, const T rr) { using Test = TWide::Type>; const Test lt(ll), rt(rr); { const auto exp = ll & rr; const auto tst = lt & rt; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = ll | rr; const auto tst = lt | rt; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = ll ^ rr; const auto tst = lt ^ rt; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = ll + rr; const auto tst = lt + rt; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = ll - rr; const auto tst = lt - rt; UNIT_ASSERT(T(tst) == T(exp)); } if (rr > 0 && rr < T(sizeof(T) << 3U)) { const auto exp = ll >> rr; const auto tst = lt >> rt; UNIT_ASSERT(T(tst) == T(exp)); } if (rr > 0 && rr < T(sizeof(T) << 3U)) { const auto exp = ll << rr; const auto tst = lt << rt; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = ll * rr; const auto tst = lt * rt; UNIT_ASSERT(T(tst) == T(exp)); } if (rr) { const auto exp = ll / rr; const auto tst = lt / rt; UNIT_ASSERT(T(tst) == T(exp)); } if (rr) { const auto exp = ll % rr; const auto tst = lt % rt; UNIT_ASSERT(T(tst) == T(exp)); } { const auto exp = ll == rr; const auto tst = lt == rt; UNIT_ASSERT_VALUES_EQUAL(tst, exp); } { const auto exp = ll != rr; const auto tst = lt != rt; UNIT_ASSERT_VALUES_EQUAL(tst, exp); } { const auto exp = ll > rr; const auto tst = lt > rt; UNIT_ASSERT_VALUES_EQUAL(tst, exp); } { const auto exp = ll < rr; const auto tst = lt < rt; UNIT_ASSERT_VALUES_EQUAL(tst, exp); } { const auto exp = ll >= rr; const auto tst = lt >= rt; UNIT_ASSERT_VALUES_EQUAL(tst, exp); } { const auto exp = ll <= rr; const auto tst = lt <= rt; UNIT_ASSERT_VALUES_EQUAL(tst, exp); } } template void TestsForUnsignedType() { static_assert(std::is_unsigned::value, "Tests for unsigned type."); TestUnary(2U); TestUnary(4U); TestUnary(17U); TestUnary(42U); TestUnary(127U); TestUnary(128U); TestUnary(129U); TestUnary(200U); TestUnary(255U); TestUnary(256U); TestUnary(257U); TestUnary(std::numeric_limits::min()); TestUnary(std::numeric_limits::max()); TestUnary(std::numeric_limits::max() - 1U); TestUnary(std::numeric_limits::max() >> 1U); TestUnary(std::numeric_limits::max() >> 3U); TestUnary(std::numeric_limits::max() >> 7U); TestUnary(std::numeric_limits::min() + 1U); TestUnary(std::numeric_limits::max() - 1U); TestUnary(std::numeric_limits::min() + 3U); TestUnary(std::numeric_limits::max() - 3U); TestUnary(std::numeric_limits::min() + 7U); TestUnary(std::numeric_limits::max() - 7U); TestBinary(1U, 1U); TestBinary(7U, 31U); TestBinary(30000U, 13U); TestBinary(127U, 13U); TestBinary(128U, 19U); TestBinary(129U, 17U); TestBinary(std::numeric_limits::min(), 7U); TestBinary(std::numeric_limits::max(), 7U); TestBinary(std::numeric_limits::min(), 8U); TestBinary(std::numeric_limits::max(), 8U); TestBinary(std::numeric_limits::min(), 9U); TestBinary(std::numeric_limits::max(), 9U); TestBinary(std::numeric_limits::max() - 1U, std::numeric_limits::min()); TestBinary(std::numeric_limits::max() - 1U, std::numeric_limits::min() + 1U); TestBinary(std::numeric_limits::max(), std::numeric_limits::max()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min()); TestBinary(std::numeric_limits::min(), std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min() + 1U); TestBinary(std::numeric_limits::max() - 1U, std::numeric_limits::min()); TestBinary(std::numeric_limits::max() - 1U, std::numeric_limits::min() + 1U); TestBinary(std::numeric_limits::max() - 1U, std::numeric_limits::min()); TestBinary(std::numeric_limits::min() + 1U, std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), 1U); TestBinary(std::numeric_limits::min(), 1U); TestBinary(std::numeric_limits::max() - 1U, 1U); TestBinary(std::numeric_limits::min() + 1U, 1U); TestBinary(std::numeric_limits::max(), 7U); TestBinary(std::numeric_limits::min(), 7U); TestBinary(std::numeric_limits::max() - 1U, 7U); TestBinary(std::numeric_limits::min() + 1U, 7U); TestBinary(std::numeric_limits::max() >> 1U, std::numeric_limits::min() >> 1U); TestBinary(std::numeric_limits::max() >> 1U, std::numeric_limits::min() + 1U); TestBinary(std::numeric_limits::max() - 1U, std::numeric_limits::min() >> 1U); TestBinary(std::numeric_limits::max() >> 1U, std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min() >> 1U); TestBinary(std::numeric_limits::max() >> 3U, std::numeric_limits::min() >> 3U); TestBinary(std::numeric_limits::max() >> 3U, std::numeric_limits::min() + 3U); TestBinary(std::numeric_limits::max() - 3U, std::numeric_limits::min() >> 3U); TestBinary(std::numeric_limits::max() >> 3U, std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min() >> 3U); } template void TestsForSignedType() { static_assert(std::is_signed::value, "Tests for signed type."); TestUnary(0); TestUnary(1); TestUnary(-1); TestUnary(2); TestUnary(-2); TestUnary(3); TestUnary(-3); TestUnary(4); TestUnary(-4); TestUnary(17); TestUnary(-17); TestUnary(42); TestUnary(-42); TestUnary(127); TestUnary(-127); TestUnary(128); TestUnary(-128); TestUnary(129); TestUnary(-129); TestUnary(200); TestUnary(-200); TestUnary(255); TestUnary(-255); TestUnary(256); TestUnary(-256); TestUnary(257); TestUnary(-257); TestUnary(258); TestUnary(-258); TestUnary(std::numeric_limits::min()); TestUnary(std::numeric_limits::max()); TestUnary(std::numeric_limits::min() + 1); TestUnary(std::numeric_limits::max() - 1); TestUnary(std::numeric_limits::min() + 2); TestUnary(std::numeric_limits::max() - 2); TestUnary(std::numeric_limits::min() + 3); TestUnary(std::numeric_limits::max() - 3); TestUnary(std::numeric_limits::min() + 7); TestUnary(std::numeric_limits::max() - 7); TestUnary(std::numeric_limits::min() >> 1); TestUnary(std::numeric_limits::max() >> 1); TestUnary(std::numeric_limits::min() >> 3); TestUnary(std::numeric_limits::max() >> 3); TestUnary(std::numeric_limits::min() >> 7); TestUnary(std::numeric_limits::max() >> 7); TestUnary(std::numeric_limits::min() + 1); TestUnary(std::numeric_limits::max() - 1); TestUnary(std::numeric_limits::min() + 3); TestUnary(std::numeric_limits::max() - 3); TestUnary(std::numeric_limits::min() + 7); TestUnary(std::numeric_limits::max() - 7); TestBinary(0, 0); TestBinary(1, 0); TestBinary(0, -1); TestBinary(1, 1); TestBinary(1, -1); TestBinary(-1, 1); TestBinary(-1, -1); TestBinary(7, 42); TestBinary(-7, 42); TestBinary(0, -43); TestBinary(-30000, 64); TestBinary(30000, -64); TestBinary(30000, 64); TestBinary(21, 0); TestBinary(13, -127); TestBinary(-19, 128); TestBinary(-77, -129); TestBinary(13, 127); TestBinary(19, 128); TestBinary(77, 129); TestBinary(std::numeric_limits::max(), -1); TestBinary(std::numeric_limits::min(), -7); TestBinary(std::numeric_limits::max(), -7); TestBinary(std::numeric_limits::min(), -8); TestBinary(std::numeric_limits::max(), -8); TestBinary(std::numeric_limits::min(), -9); TestBinary(std::numeric_limits::max(), -9); TestBinary(std::numeric_limits::min(), std::numeric_limits::min() >> 5); TestBinary(std::numeric_limits::max(), std::numeric_limits::min() >> 5); TestBinary(std::numeric_limits::min(), 7); TestBinary(std::numeric_limits::max(), 7); TestBinary(std::numeric_limits::min(), 8); TestBinary(std::numeric_limits::max(), 8); TestBinary(std::numeric_limits::min(), 9); TestBinary(std::numeric_limits::max(), 9); TestBinary(std::numeric_limits::max() - 1, std::numeric_limits::min()); TestBinary(std::numeric_limits::max() - 1, std::numeric_limits::min() + 1); TestBinary(std::numeric_limits::max(), std::numeric_limits::max()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min()); TestBinary(std::numeric_limits::min(), std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min() + 1); TestBinary(std::numeric_limits::max() - 1, std::numeric_limits::min()); TestBinary(std::numeric_limits::max() - 1, std::numeric_limits::min() + 1); TestBinary(std::numeric_limits::max(), 0); TestBinary(std::numeric_limits::min(), 0); TestBinary(std::numeric_limits::max() - 1, 0); TestBinary(std::numeric_limits::min() + 1, 0); TestBinary(std::numeric_limits::max(), 1); TestBinary(std::numeric_limits::min(), 1); TestBinary(std::numeric_limits::max() - 1, 1); TestBinary(std::numeric_limits::min() + 1, 1); TestBinary(std::numeric_limits::max(), 7); TestBinary(std::numeric_limits::min(), 7); TestBinary(std::numeric_limits::max() - 1, 7); TestBinary(std::numeric_limits::min() + 1, 7); TestBinary(std::numeric_limits::max() >> 1, std::numeric_limits::min() >> 1); TestBinary(std::numeric_limits::max() >> 1, std::numeric_limits::min() + 1); TestBinary(std::numeric_limits::max() - 1, std::numeric_limits::min() >> 1); TestBinary(std::numeric_limits::max() >> 1, std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min() >> 1); TestBinary(std::numeric_limits::max() >> 3, std::numeric_limits::min() >> 3); TestBinary(std::numeric_limits::max() >> 3, std::numeric_limits::min() + 3); TestBinary(std::numeric_limits::max() - 3, std::numeric_limits::min() >> 3); TestBinary(std::numeric_limits::max() >> 3, std::numeric_limits::min()); TestBinary(std::numeric_limits::max(), std::numeric_limits::min() >> 3); } Y_UNIT_TEST(CheckUnsignedByCompilerIntegrals) { TestsForUnsignedType(); TestsForUnsignedType(); #ifndef _win_ TestsForUnsignedType(); #endif } #ifndef _ubsan_enabled_ #ifndef _msan_enabled_ Y_UNIT_TEST(CheckSignedByCompilerIntegrals) { TestsForSignedType(); TestsForSignedType(); #ifndef _win_ TestsForSignedType(); #endif } #endif #endif } }