#include <chrono>#include <cmath>#include <cstdint>#include <ctime>#include <iomanip>#include <limits>#include <random>#include <string>#include "gmock/gmock.h"#include "gtest/gtest.h"#include "absl/time/time.h"
Go to the source code of this file.
Defines | |
| #define | ROUND_TRIP_UNIT(U, LOW, HIGH) |
| #define | TEST_ADD_OPS(UNIT) |
| #define | TEST_DURATION_CONVERSION(UNIT) |
| #define | TEST_FACTORY_OVERLOADS(NAME) |
| #define | TEST_INF_DIV_WITH_TYPE(T) |
| #define | TEST_INF_MUL_WITH_TYPE(T) |
| #define | TEST_MOD_IDENTITY(a, b) EXPECT_EQ((a), ((a) / (b))*(b) + ((a)%(b))) |
| #define | TEST_MUL_OPS(UNIT) |
| #define | TEST_NAN_HANDLING(NAME, NAN) |
| #define | TEST_PARSE_ROUNDTRIP(d) |
| #define | TEST_REL_OPS(UNIT) |
| #define ROUND_TRIP_UNIT | ( | U, | |
| LOW, | |||
| HIGH | |||
| ) |
do { \ for (int64_t i = LOW; i < HIGH; ++i) { \ absl::Duration d = absl::U(i); \ if (d == absl::InfiniteDuration()) \ EXPECT_EQ(kint64max, d / absl::U(1)); \ else if (d == -absl::InfiniteDuration()) \ EXPECT_EQ(kint64min, d / absl::U(1)); \ else \ EXPECT_EQ(i, absl::U(i) / absl::U(1)); \ } \ } while (0)
| #define TEST_ADD_OPS | ( | UNIT | ) |
do { \ EXPECT_EQ(UNIT(2), UNIT(1) + UNIT(1)); \ EXPECT_EQ(UNIT(1), UNIT(2) - UNIT(1)); \ EXPECT_EQ(UNIT(0), UNIT(2) - UNIT(2)); \ EXPECT_EQ(UNIT(-1), UNIT(1) - UNIT(2)); \ EXPECT_EQ(UNIT(-2), UNIT(0) - UNIT(2)); \ EXPECT_EQ(UNIT(-2), UNIT(1) - UNIT(3)); \ absl::Duration a = UNIT(1); \ a += UNIT(1); \ EXPECT_EQ(UNIT(2), a); \ a -= UNIT(1); \ EXPECT_EQ(UNIT(1), a); \ } while (0)
| #define TEST_DURATION_CONVERSION | ( | UNIT | ) |
do { \ const absl::Duration d = absl::UNIT(1.5); \ constexpr absl::Duration z = absl::ZeroDuration(); \ constexpr absl::Duration inf = absl::InfiniteDuration(); \ constexpr double dbl_inf = std::numeric_limits<double>::infinity(); \ EXPECT_EQ(kint64min, absl::ToInt64##UNIT(-inf)); \ EXPECT_EQ(-1, absl::ToInt64##UNIT(-d)); \ EXPECT_EQ(0, absl::ToInt64##UNIT(z)); \ EXPECT_EQ(1, absl::ToInt64##UNIT(d)); \ EXPECT_EQ(kint64max, absl::ToInt64##UNIT(inf)); \ EXPECT_EQ(-dbl_inf, absl::ToDouble##UNIT(-inf)); \ EXPECT_EQ(-1.5, absl::ToDouble##UNIT(-d)); \ EXPECT_EQ(0, absl::ToDouble##UNIT(z)); \ EXPECT_EQ(1.5, absl::ToDouble##UNIT(d)); \ EXPECT_EQ(dbl_inf, absl::ToDouble##UNIT(inf)); \ } while (0)
| #define TEST_FACTORY_OVERLOADS | ( | NAME | ) |
EXPECT_EQ(1, NAME(kOne) / NAME(kOne)); \ EXPECT_EQ(1, NAME(static_cast<int8_t>(1)) / NAME(1)); \ EXPECT_EQ(1, NAME(static_cast<int16_t>(1)) / NAME(1)); \ EXPECT_EQ(1, NAME(static_cast<int32_t>(1)) / NAME(1)); \ EXPECT_EQ(1, NAME(static_cast<int64_t>(1)) / NAME(1)); \ EXPECT_EQ(1, NAME(static_cast<uint8_t>(1)) / NAME(1)); \ EXPECT_EQ(1, NAME(static_cast<uint16_t>(1)) / NAME(1)); \ EXPECT_EQ(1, NAME(static_cast<uint32_t>(1)) / NAME(1)); \ EXPECT_EQ(1, NAME(static_cast<uint64_t>(1)) / NAME(1)); \ EXPECT_EQ(NAME(1) / 2, NAME(static_cast<float>(0.5))); \ EXPECT_EQ(NAME(1) / 2, NAME(static_cast<double>(0.5))); \ EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<float>(1.5)), NAME(1))); \ EXPECT_EQ(1.5, absl::FDivDuration(NAME(static_cast<double>(1.5)), NAME(1)));
| #define TEST_INF_DIV_WITH_TYPE | ( | T | ) |
EXPECT_EQ(inf, inf / static_cast<T>(2)); \ EXPECT_EQ(-inf, inf / static_cast<T>(-2)); \ EXPECT_EQ(-inf, -inf / static_cast<T>(2)); \ EXPECT_EQ(inf, -inf / static_cast<T>(-2));
| #define TEST_INF_MUL_WITH_TYPE | ( | T | ) |
EXPECT_EQ(inf, inf * static_cast<T>(2)); \ EXPECT_EQ(-inf, inf * static_cast<T>(-2)); \ EXPECT_EQ(-inf, -inf * static_cast<T>(2)); \ EXPECT_EQ(inf, -inf * static_cast<T>(-2)); \ EXPECT_EQ(inf, inf * static_cast<T>(0)); \ EXPECT_EQ(-inf, -inf * static_cast<T>(0)); \ EXPECT_EQ(inf, sec_max * static_cast<T>(2)); \ EXPECT_EQ(inf, sec_min * static_cast<T>(-2)); \ EXPECT_EQ(inf, (sec_max / static_cast<T>(2)) * static_cast<T>(3)); \ EXPECT_EQ(-inf, sec_max * static_cast<T>(-2)); \ EXPECT_EQ(-inf, sec_min * static_cast<T>(2)); \ EXPECT_EQ(-inf, (sec_min / static_cast<T>(2)) * static_cast<T>(3));
| #define TEST_MUL_OPS | ( | UNIT | ) |
do { \ EXPECT_EQ(UNIT(5), UNIT(2) * 2.5); \ EXPECT_EQ(UNIT(2), UNIT(5) / 2.5); \ EXPECT_EQ(UNIT(-5), UNIT(-2) * 2.5); \ EXPECT_EQ(UNIT(-5), -UNIT(2) * 2.5); \ EXPECT_EQ(UNIT(-5), UNIT(2) * -2.5); \ EXPECT_EQ(UNIT(-2), UNIT(-5) / 2.5); \ EXPECT_EQ(UNIT(-2), -UNIT(5) / 2.5); \ EXPECT_EQ(UNIT(-2), UNIT(5) / -2.5); \ EXPECT_EQ(UNIT(2), UNIT(11) % UNIT(3)); \ absl::Duration a = UNIT(2); \ a *= 2.5; \ EXPECT_EQ(UNIT(5), a); \ a /= 2.5; \ EXPECT_EQ(UNIT(2), a); \ a %= UNIT(1); \ EXPECT_EQ(UNIT(0), a); \ absl::Duration big = UNIT(1000000000); \ big *= 3; \ big /= 3; \ EXPECT_EQ(UNIT(1000000000), big); \ EXPECT_EQ(-UNIT(2), -UNIT(2)); \ EXPECT_EQ(-UNIT(2), UNIT(2) * -1); \ EXPECT_EQ(-UNIT(2), -1 * UNIT(2)); \ EXPECT_EQ(-UNIT(-2), UNIT(2)); \ EXPECT_EQ(2, UNIT(2) / UNIT(1)); \ absl::Duration rem; \ EXPECT_EQ(2, absl::IDivDuration(UNIT(2), UNIT(1), &rem)); \ EXPECT_EQ(2.0, absl::FDivDuration(UNIT(2), UNIT(1))); \ } while (0)
| #define TEST_NAN_HANDLING | ( | NAME, | |
| NAN | |||
| ) |
do { \ const auto inf = absl::InfiniteDuration(); \ auto x = NAME(NAN); \ EXPECT_TRUE(x == inf || x == -inf); \ auto y = NAME(42); \ y *= NAN; \ EXPECT_TRUE(y == inf || y == -inf); \ auto z = NAME(42); \ z /= NAN; \ EXPECT_TRUE(z == inf || z == -inf); \ } while (0)
| #define TEST_PARSE_ROUNDTRIP | ( | d | ) |
do { \ std::string s = absl::FormatDuration(d); \ absl::Duration dur; \ EXPECT_TRUE(absl::ParseDuration(s, &dur)); \ EXPECT_EQ(d, dur); \ } while (0)
| #define TEST_REL_OPS | ( | UNIT | ) |
static_assert(UNIT(2) == UNIT(2), ""); \ static_assert(UNIT(1) != UNIT(2), ""); \ static_assert(UNIT(1) < UNIT(2), ""); \ static_assert(UNIT(3) > UNIT(2), ""); \ static_assert(UNIT(1) <= UNIT(2), ""); \ static_assert(UNIT(2) <= UNIT(2), ""); \ static_assert(UNIT(3) >= UNIT(2), ""); \ static_assert(UNIT(2) >= UNIT(2), "");