| /* |
| * Copyright (C) 2016 Apple Inc. All rights reserved. |
| * |
| * Redistribution and use in source and binary forms, with or without |
| * modification, are permitted provided that the following conditions |
| * are met: |
| * 1. Redistributions of source code must retain the above copyright |
| * notice, this list of conditions and the following disclaimer. |
| * 2. 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. |
| * |
| * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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 "config.h" |
| #include <wtf/ClockType.h> |
| #include <wtf/MonotonicTime.h> |
| #include <wtf/Seconds.h> |
| #include <wtf/StringPrintStream.h> |
| #include <wtf/TimeWithDynamicClockType.h> |
| #include <wtf/WallTime.h> |
| |
| namespace WTF { |
| |
| std::basic_ostream<char>& operator<<(std::basic_ostream<char>& out, Seconds value) |
| { |
| out << toCString(value).data(); |
| return out; |
| } |
| |
| std::basic_ostream<char>& operator<<(std::basic_ostream<char>& out, WallTime value) |
| { |
| out << toCString(value).data(); |
| return out; |
| } |
| |
| std::basic_ostream<char>& operator<<(std::basic_ostream<char>& out, MonotonicTime value) |
| { |
| out << toCString(value).data(); |
| return out; |
| } |
| |
| std::basic_ostream<char>& operator<<(std::basic_ostream<char>& out, TimeWithDynamicClockType value) |
| { |
| out << toCString(value).data(); |
| return out; |
| } |
| |
| } // namespace WTF |
| |
| using namespace WTF; |
| |
| namespace TestWebKitAPI { |
| |
| namespace { |
| |
| Seconds s(double value) |
| { |
| return Seconds(value); |
| } |
| |
| WallTime wt(double value) |
| { |
| return WallTime::fromRawSeconds(value); |
| } |
| |
| MonotonicTime mt(double value) |
| { |
| return MonotonicTime::fromRawSeconds(value); |
| } |
| |
| TimeWithDynamicClockType dt(double value, ClockType type) |
| { |
| return TimeWithDynamicClockType::fromRawSeconds(value, type); |
| } |
| |
| TimeWithDynamicClockType dtw(double value) |
| { |
| return dt(value, ClockType::Wall); |
| } |
| |
| TimeWithDynamicClockType dtm(double value) |
| { |
| return dt(value, ClockType::Monotonic); |
| } |
| |
| } // anonymous namespace |
| |
| TEST(WTF_Time, units) |
| { |
| EXPECT_EQ(s(60), Seconds::fromMinutes(1)); |
| EXPECT_EQ(s(0.001), Seconds::fromMilliseconds(1)); |
| EXPECT_EQ(s(0.000001), Seconds::fromMicroseconds(1)); |
| EXPECT_EQ(s(0.0000005), Seconds::fromNanoseconds(500)); |
| |
| EXPECT_EQ(s(120).minutes(), 2); |
| EXPECT_EQ(s(2).seconds(), 2); |
| EXPECT_EQ(s(2).milliseconds(), 2000); |
| EXPECT_EQ(s(2).microseconds(), 2000000); |
| EXPECT_EQ(s(2).nanoseconds(), 2000000000); |
| } |
| |
| TEST(WTF_Time, plus) |
| { |
| EXPECT_EQ(s(6), s(1) + s(5)); |
| EXPECT_EQ(s(6), s(5) + s(1)); |
| EXPECT_EQ(wt(6), s(1) + wt(5)); |
| EXPECT_EQ(wt(6), s(5) + wt(1)); |
| EXPECT_EQ(wt(6), wt(1) + s(5)); |
| EXPECT_EQ(wt(6), wt(5) + s(1)); |
| EXPECT_EQ(mt(6), s(1) + mt(5)); |
| EXPECT_EQ(mt(6), s(5) + mt(1)); |
| EXPECT_EQ(mt(6), mt(1) + s(5)); |
| EXPECT_EQ(mt(6), mt(5) + s(1)); |
| EXPECT_EQ(dtw(6), s(1) + dtw(5)); |
| EXPECT_EQ(dtw(6), s(5) + dtw(1)); |
| EXPECT_EQ(dtw(6), dtw(1) + s(5)); |
| EXPECT_EQ(dtw(6), dtw(5) + s(1)); |
| EXPECT_EQ(dtm(6), s(1) + dtm(5)); |
| EXPECT_EQ(dtm(6), s(5) + dtm(1)); |
| EXPECT_EQ(dtm(6), dtm(1) + s(5)); |
| EXPECT_EQ(dtm(6), dtm(5) + s(1)); |
| } |
| |
| TEST(WTF_Time, minus) |
| { |
| EXPECT_EQ(s(-4), s(1) - s(5)); |
| EXPECT_EQ(s(4), s(5) - s(1)); |
| EXPECT_EQ(wt(-4), s(1) - wt(5)); |
| EXPECT_EQ(wt(4), s(5) - wt(1)); |
| EXPECT_EQ(wt(-4), wt(1) - s(5)); |
| EXPECT_EQ(wt(4), wt(5) - s(1)); |
| EXPECT_EQ(mt(-4), s(1) - mt(5)); |
| EXPECT_EQ(mt(4), s(5) - mt(1)); |
| EXPECT_EQ(mt(-4), mt(1) - s(5)); |
| EXPECT_EQ(mt(4), mt(5) - s(1)); |
| EXPECT_EQ(dtw(-4), s(1) - dtw(5)); |
| EXPECT_EQ(dtw(4), s(5) - dtw(1)); |
| EXPECT_EQ(dtw(-4), dtw(1) - s(5)); |
| EXPECT_EQ(dtw(4), dtw(5) - s(1)); |
| EXPECT_EQ(dtm(-4), s(1) - dtm(5)); |
| EXPECT_EQ(dtm(4), s(5) - dtm(1)); |
| EXPECT_EQ(dtm(-4), dtm(1) - s(5)); |
| EXPECT_EQ(dtm(4), dtm(5) - s(1)); |
| } |
| |
| TEST(WTF_Time, negate) |
| { |
| EXPECT_EQ(s(-7), -s(7)); |
| EXPECT_EQ(s(7), -s(-7)); |
| EXPECT_EQ(wt(-7), -wt(7)); |
| EXPECT_EQ(wt(7), -wt(-7)); |
| EXPECT_EQ(mt(-7), -mt(7)); |
| EXPECT_EQ(mt(7), -mt(-7)); |
| EXPECT_EQ(dtw(-7), -dtw(7)); |
| EXPECT_EQ(dtw(7), -dtw(-7)); |
| EXPECT_EQ(dtm(-7), -dtm(7)); |
| EXPECT_EQ(dtm(7), -dtm(-7)); |
| } |
| |
| TEST(WTF_Time, times) |
| { |
| EXPECT_EQ(s(15), s(3) * 5); |
| } |
| |
| TEST(WTF_Time, divide) |
| { |
| EXPECT_EQ(s(3), s(15) / 5); |
| } |
| |
| TEST(WTF_Time, less) |
| { |
| EXPECT_FALSE(s(2) < s(1)); |
| EXPECT_FALSE(s(2) < s(2)); |
| EXPECT_TRUE(s(2) < s(3)); |
| EXPECT_FALSE(wt(2) < wt(1)); |
| EXPECT_FALSE(wt(2) < wt(2)); |
| EXPECT_TRUE(wt(2) < wt(3)); |
| EXPECT_FALSE(mt(2) < mt(1)); |
| EXPECT_FALSE(mt(2) < mt(2)); |
| EXPECT_TRUE(mt(2) < mt(3)); |
| EXPECT_FALSE(dtw(2) < dtw(1)); |
| EXPECT_FALSE(dtw(2) < dtw(2)); |
| EXPECT_TRUE(dtw(2) < dtw(3)); |
| EXPECT_FALSE(dtm(2) < dtm(1)); |
| EXPECT_FALSE(dtm(2) < dtm(2)); |
| EXPECT_TRUE(dtm(2) < dtm(3)); |
| } |
| |
| TEST(WTF_Time, lessEqual) |
| { |
| EXPECT_FALSE(s(2) <= s(1)); |
| EXPECT_TRUE(s(2) <= s(2)); |
| EXPECT_TRUE(s(2) <= s(3)); |
| EXPECT_FALSE(wt(2) <= wt(1)); |
| EXPECT_TRUE(wt(2) <= wt(2)); |
| EXPECT_TRUE(wt(2) <= wt(3)); |
| EXPECT_FALSE(mt(2) <= mt(1)); |
| EXPECT_TRUE(mt(2) <= mt(2)); |
| EXPECT_TRUE(mt(2) <= mt(3)); |
| EXPECT_FALSE(dtw(2) <= dtw(1)); |
| EXPECT_TRUE(dtw(2) <= dtw(2)); |
| EXPECT_TRUE(dtw(2) <= dtw(3)); |
| EXPECT_FALSE(dtm(2) <= dtm(1)); |
| EXPECT_TRUE(dtm(2) <= dtm(2)); |
| EXPECT_TRUE(dtm(2) <= dtm(3)); |
| } |
| |
| TEST(WTF_Time, greater) |
| { |
| EXPECT_TRUE(s(2) > s(1)); |
| EXPECT_FALSE(s(2) > s(2)); |
| EXPECT_FALSE(s(2) > s(3)); |
| EXPECT_TRUE(wt(2) > wt(1)); |
| EXPECT_FALSE(wt(2) > wt(2)); |
| EXPECT_FALSE(wt(2) > wt(3)); |
| EXPECT_TRUE(mt(2) > mt(1)); |
| EXPECT_FALSE(mt(2) > mt(2)); |
| EXPECT_FALSE(mt(2) > mt(3)); |
| EXPECT_TRUE(dtw(2) > dtw(1)); |
| EXPECT_FALSE(dtw(2) > dtw(2)); |
| EXPECT_FALSE(dtw(2) > dtw(3)); |
| EXPECT_TRUE(dtm(2) > dtm(1)); |
| EXPECT_FALSE(dtm(2) > dtm(2)); |
| EXPECT_FALSE(dtm(2) > dtm(3)); |
| } |
| |
| TEST(WTF_Time, greaterEqual) |
| { |
| EXPECT_TRUE(s(2) >= s(1)); |
| EXPECT_TRUE(s(2) >= s(2)); |
| EXPECT_FALSE(s(2) >= s(3)); |
| EXPECT_TRUE(wt(2) >= wt(1)); |
| EXPECT_TRUE(wt(2) >= wt(2)); |
| EXPECT_FALSE(wt(2) >= wt(3)); |
| EXPECT_TRUE(mt(2) >= mt(1)); |
| EXPECT_TRUE(mt(2) >= mt(2)); |
| EXPECT_FALSE(mt(2) >= mt(3)); |
| EXPECT_TRUE(dtw(2) >= dtw(1)); |
| EXPECT_TRUE(dtw(2) >= dtw(2)); |
| EXPECT_FALSE(dtw(2) >= dtw(3)); |
| EXPECT_TRUE(dtm(2) >= dtm(1)); |
| EXPECT_TRUE(dtm(2) >= dtm(2)); |
| EXPECT_FALSE(dtm(2) >= dtm(3)); |
| } |
| |
| TEST(WTF_Time, equal) |
| { |
| EXPECT_FALSE(s(2) == s(1)); |
| EXPECT_TRUE(s(2) == s(2)); |
| EXPECT_FALSE(s(2) == s(3)); |
| EXPECT_FALSE(wt(2) == wt(1)); |
| EXPECT_TRUE(wt(2) == wt(2)); |
| EXPECT_FALSE(wt(2) == wt(3)); |
| EXPECT_FALSE(mt(2) == mt(1)); |
| EXPECT_TRUE(mt(2) == mt(2)); |
| EXPECT_FALSE(mt(2) == mt(3)); |
| EXPECT_FALSE(dtw(2) == dtw(1)); |
| EXPECT_TRUE(dtw(2) == dtw(2)); |
| EXPECT_FALSE(dtw(2) == dtw(3)); |
| EXPECT_FALSE(dtm(2) == dtm(1)); |
| EXPECT_TRUE(dtm(2) == dtm(2)); |
| EXPECT_FALSE(dtm(2) == dtm(3)); |
| } |
| |
| TEST(WTF_Time, notEqual) |
| { |
| EXPECT_TRUE(s(2) != s(1)); |
| EXPECT_FALSE(s(2) != s(2)); |
| EXPECT_TRUE(s(2) != s(3)); |
| EXPECT_TRUE(wt(2) != wt(1)); |
| EXPECT_FALSE(wt(2) != wt(2)); |
| EXPECT_TRUE(wt(2) != wt(3)); |
| EXPECT_TRUE(mt(2) != mt(1)); |
| EXPECT_FALSE(mt(2) != mt(2)); |
| EXPECT_TRUE(mt(2) != mt(3)); |
| EXPECT_TRUE(dtw(2) != dtw(1)); |
| EXPECT_FALSE(dtw(2) != dtw(2)); |
| EXPECT_TRUE(dtw(2) != dtw(3)); |
| EXPECT_TRUE(dtm(2) != dtm(1)); |
| EXPECT_FALSE(dtm(2) != dtm(2)); |
| EXPECT_TRUE(dtm(2) != dtm(3)); |
| } |
| |
| TEST(WTF_Time, literals) |
| { |
| EXPECT_TRUE(s(120) == 2_min); |
| EXPECT_TRUE(s(2) == 2_s); |
| EXPECT_TRUE(s(2) == 2000_ms); |
| EXPECT_TRUE(s(2) - 1000_ms == s(1)); |
| EXPECT_TRUE(2_s - s(1) == 1000_ms); |
| |
| EXPECT_TRUE(Seconds::fromMinutes(2) == 2_min); |
| EXPECT_TRUE(Seconds(2) == 2_s); |
| EXPECT_TRUE(Seconds::fromMilliseconds(2) == 2_ms); |
| EXPECT_TRUE(Seconds::fromMicroseconds(2) == 2_us); |
| EXPECT_TRUE(Seconds::fromNanoseconds(2) == 2_ns); |
| |
| EXPECT_TRUE(Seconds::fromMinutes(2.5) == 2.5_min); |
| EXPECT_TRUE(Seconds(2.5) == 2.5_s); |
| EXPECT_TRUE(Seconds::fromMilliseconds(2.5) == 2.5_ms); |
| EXPECT_TRUE(Seconds::fromMicroseconds(2.5) == 2.5_us); |
| EXPECT_TRUE(Seconds::fromNanoseconds(2.5) == 2.5_ns); |
| } |
| |
| TEST(WTF_Time, clamp) |
| { |
| Seconds positiveInfinity = Seconds::infinity(); |
| EXPECT_TRUE(positiveInfinity.secondsAs<int32_t>() == INT32_MAX); |
| EXPECT_TRUE(positiveInfinity.secondsAs<uint32_t>() == UINT32_MAX); |
| EXPECT_TRUE(positiveInfinity.secondsAs<int64_t>() == INT64_MAX); |
| EXPECT_TRUE(positiveInfinity.secondsAs<uint64_t>() == UINT64_MAX); |
| EXPECT_TRUE(positiveInfinity.millisecondsAs<int32_t>() == INT32_MAX); |
| EXPECT_TRUE(positiveInfinity.millisecondsAs<uint32_t>() == UINT32_MAX); |
| EXPECT_TRUE(positiveInfinity.millisecondsAs<int64_t>() == INT64_MAX); |
| EXPECT_TRUE(positiveInfinity.millisecondsAs<uint64_t>() == UINT64_MAX); |
| EXPECT_TRUE(positiveInfinity.microsecondsAs<int32_t>() == INT32_MAX); |
| EXPECT_TRUE(positiveInfinity.microsecondsAs<uint32_t>() == UINT32_MAX); |
| EXPECT_TRUE(positiveInfinity.microsecondsAs<int64_t>() == INT64_MAX); |
| EXPECT_TRUE(positiveInfinity.microsecondsAs<uint64_t>() == UINT64_MAX); |
| EXPECT_TRUE(positiveInfinity.nanosecondsAs<int32_t>() == INT32_MAX); |
| EXPECT_TRUE(positiveInfinity.nanosecondsAs<uint32_t>() == UINT32_MAX); |
| EXPECT_TRUE(positiveInfinity.nanosecondsAs<int64_t>() == INT64_MAX); |
| EXPECT_TRUE(positiveInfinity.nanosecondsAs<uint64_t>() == UINT64_MAX); |
| |
| Seconds negativeInfinity = -Seconds::infinity(); |
| EXPECT_TRUE(negativeInfinity.secondsAs<int32_t>() == INT32_MIN); |
| EXPECT_TRUE(negativeInfinity.secondsAs<uint32_t>() == 0); |
| EXPECT_TRUE(negativeInfinity.secondsAs<int64_t>() == INT64_MIN); |
| EXPECT_TRUE(negativeInfinity.secondsAs<uint64_t>() == 0); |
| EXPECT_TRUE(negativeInfinity.millisecondsAs<int32_t>() == INT32_MIN); |
| EXPECT_TRUE(negativeInfinity.millisecondsAs<uint32_t>() == 0); |
| EXPECT_TRUE(negativeInfinity.millisecondsAs<int64_t>() == INT64_MIN); |
| EXPECT_TRUE(negativeInfinity.millisecondsAs<uint64_t>() == 0); |
| EXPECT_TRUE(negativeInfinity.microsecondsAs<int32_t>() == INT32_MIN); |
| EXPECT_TRUE(negativeInfinity.microsecondsAs<uint32_t>() == 0); |
| EXPECT_TRUE(negativeInfinity.microsecondsAs<int64_t>() == INT64_MIN); |
| EXPECT_TRUE(negativeInfinity.microsecondsAs<uint64_t>() == 0); |
| EXPECT_TRUE(negativeInfinity.nanosecondsAs<int32_t>() == INT32_MIN); |
| EXPECT_TRUE(negativeInfinity.nanosecondsAs<uint32_t>() == 0); |
| EXPECT_TRUE(negativeInfinity.nanosecondsAs<int64_t>() == INT64_MIN); |
| EXPECT_TRUE(negativeInfinity.nanosecondsAs<uint64_t>() == 0); |
| } |
| |
| // Test MonotonicTime constexpr features. If they are not calculated in constexpr, |
| // they invokes global constructors and becomes compile errors. |
| static const MonotonicTime NaN = MonotonicTime::nan(); |
| static const MonotonicTime Infinity = MonotonicTime::infinity(); |
| static const MonotonicTime Zero = MonotonicTime::fromRawSeconds(0); |
| static const MonotonicTime One = Zero + Seconds(1); |
| static const MonotonicTime NegativeOne = Zero - Seconds(1); |
| static const bool ZeroIsFalse = !!Zero; |
| static const bool Equal = Zero == Zero; |
| static const bool NotEqual = Zero != One; |
| static const bool LessThan = Zero < One; |
| static const bool GreaterThan = One > Zero; |
| static const bool LessThanOrEqual = Zero <= Zero; |
| static const bool GreaterThanOrEqual = Zero >= Zero; |
| |
| TEST(WTF_Time, constexprMonotonicTime) |
| { |
| EXPECT_TRUE(std::isnan(NaN)); |
| EXPECT_TRUE(std::isinf(Infinity)); |
| EXPECT_TRUE(Zero.secondsSinceEpoch().value() == 0.0); |
| EXPECT_TRUE(One.secondsSinceEpoch().value() == 1.0); |
| EXPECT_TRUE(NegativeOne.secondsSinceEpoch().value() == -1.0); |
| EXPECT_FALSE(ZeroIsFalse); |
| EXPECT_TRUE(Equal); |
| EXPECT_TRUE(NotEqual); |
| EXPECT_TRUE(LessThan); |
| EXPECT_TRUE(GreaterThan); |
| EXPECT_TRUE(LessThanOrEqual); |
| EXPECT_TRUE(GreaterThanOrEqual); |
| } |
| |
| |
| } // namespace TestWebKitAPI |
| |