Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/google/ruy.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'ruy/check_macros_test.cc')
-rw-r--r--ruy/check_macros_test.cc153
1 files changed, 153 insertions, 0 deletions
diff --git a/ruy/check_macros_test.cc b/ruy/check_macros_test.cc
new file mode 100644
index 0000000..7e47e7f
--- /dev/null
+++ b/ruy/check_macros_test.cc
@@ -0,0 +1,153 @@
+/* Copyright 2019 Google LLC. All Rights Reserved.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+==============================================================================*/
+
+#include "ruy/check_macros.h"
+
+#include "testing/base/public/gunit.h"
+
+namespace {
+
+#define TEST_CONDITION_FOR_FAMILY(family, vacuously_succeeds, condition) \
+ do { \
+ if (vacuously_succeeds || (condition)) { \
+ RUY_##family(condition); \
+ } \
+ } while (false)
+
+#define TEST_COMPARISON_FOR_FAMILY(family, vacuously_succeeds, op_name, x, op, \
+ y) \
+ do { \
+ if (vacuously_succeeds || ((x)op(y))) { \
+ RUY_##family##_##op_name(x, y); \
+ } \
+ } while (false)
+
+#ifdef NDEBUG
+#define TEST_CONDITION(condition) \
+ do { \
+ TEST_CONDITION_FOR_FAMILY(CHECK, false, condition); \
+ } while (false)
+#define TEST_COMPARISON(op_name, x, op, y) \
+ do { \
+ TEST_COMPARISON_FOR_FAMILY(CHECK, false, op_name, x, op, y); \
+ } while (false)
+#else
+#define TEST_CONDITION(condition) \
+ do { \
+ TEST_CONDITION_FOR_FAMILY(CHECK, false, condition); \
+ TEST_CONDITION_FOR_FAMILY(DCHECK, false, condition); \
+ } while (false)
+#define TEST_COMPARISON(op_name, x, op, y) \
+ do { \
+ TEST_COMPARISON_FOR_FAMILY(CHECK, false, op_name, x, op, y); \
+ TEST_COMPARISON_FOR_FAMILY(DCHECK, false, op_name, x, op, y); \
+ } while (false)
+
+#endif
+
+template <typename LhsType, typename RhsType>
+void TestEqualityComparisons(const LhsType& lhs, const RhsType& rhs) {
+ RUY_CHECK_EQ(lhs, lhs);
+ TEST_COMPARISON(EQ, lhs, ==, lhs);
+ RUY_CHECK_EQ(lhs, lhs);
+ RUY_CHECK_EQ(lhs, lhs);
+ if (lhs == rhs) {
+ RUY_CHECK_EQ(lhs, rhs);
+ }
+ if (lhs != rhs) {
+ RUY_CHECK_NE(lhs, rhs);
+ }
+}
+
+template <typename LhsType, typename RhsType>
+void TestComparisons(const LhsType& lhs, const RhsType& rhs) {
+ TestEqualityComparisons(lhs, rhs);
+ if (lhs > rhs) {
+ RUY_CHECK_GT(lhs, rhs);
+ }
+ if (lhs >= rhs) {
+ RUY_CHECK_GE(lhs, rhs);
+ }
+ if (lhs < rhs) {
+ RUY_CHECK_LT(lhs, rhs);
+ }
+ if (lhs <= rhs) {
+ RUY_CHECK_LE(lhs, rhs);
+ }
+}
+
+TEST(CheckMacrosTest, IntInt) {
+ TestComparisons(0, 0);
+ TestComparisons(0, 1);
+ TestComparisons(1, -1);
+ TestComparisons(-1, 0);
+ TestComparisons(123, -456);
+ TestComparisons(std::numeric_limits<int>::min(),
+ std::numeric_limits<int>::max());
+ TestComparisons(123, std::numeric_limits<int>::max());
+ TestComparisons(123, std::numeric_limits<int>::min());
+}
+
+TEST(CheckMacrosTest, Uint8Uint8) {
+ TestComparisons<std::uint8_t, std::uint8_t>(0, 0);
+ TestComparisons<std::uint8_t, std::uint8_t>(255, 0);
+ TestComparisons<std::uint8_t, std::uint8_t>(0, 255);
+ TestComparisons<std::uint8_t, std::uint8_t>(12, 34);
+}
+
+TEST(CheckMacrosTest, Uint8Int) {
+ TestComparisons<std::uint8_t, int>(0, std::numeric_limits<int>::min());
+ TestComparisons<std::uint8_t, int>(255, std::numeric_limits<int>::min());
+ TestComparisons<std::uint8_t, int>(0, std::numeric_limits<int>::max());
+ TestComparisons<std::uint8_t, int>(255, std::numeric_limits<int>::max());
+}
+
+TEST(CheckMacrosTest, FloatFloat) {
+ TestComparisons(0.f, 0.f);
+ TestComparisons(0.f, 1.f);
+ TestComparisons(1.f, -1.f);
+ TestComparisons(-1.f, 0.f);
+ TestComparisons(123.f, -456.f);
+ TestComparisons(std::numeric_limits<float>::lowest(),
+ std::numeric_limits<float>::max());
+ TestComparisons(123.f, std::numeric_limits<float>::max());
+ TestComparisons(123.f, std::numeric_limits<float>::lowest());
+}
+
+TEST(CheckMacrosTest, IntFloat) {
+ TestComparisons(0, 0.f);
+ TestComparisons(0, 1.f);
+ TestComparisons(1, -1.f);
+ TestComparisons(-1, 0.f);
+ TestComparisons(123, -456.f);
+ TestComparisons(std::numeric_limits<int>::lowest(),
+ std::numeric_limits<float>::max());
+ TestComparisons(123, std::numeric_limits<float>::max());
+ TestComparisons(123, std::numeric_limits<float>::lowest());
+}
+
+TEST(CheckMacrosTest, EnumClass) {
+ enum class SomeEnumClass { kA, kB, kC };
+ TestEqualityComparisons(SomeEnumClass::kA, SomeEnumClass::kA);
+ TestEqualityComparisons(SomeEnumClass::kA, SomeEnumClass::kB);
+ TestEqualityComparisons(SomeEnumClass::kC, SomeEnumClass::kB);
+}
+
+} // namespace
+
+int main(int argc, char** argv) {
+ ::testing::InitGoogleTest(&argc, argv);
+ return RUN_ALL_TESTS();
+}