|  | // Copyright 2013 The Flutter Authors. All rights reserved. | 
|  | // Use of this source code is governed by a BSD-style license that can be | 
|  | // found in the LICENSE file. | 
|  |  | 
|  | #include <thread> | 
|  |  | 
|  | #include "flutter/fml/time/chrono_timestamp_provider.h" | 
|  | #include "flutter/fml/time/time_delta.h" | 
|  | #include "gtest/gtest.h" | 
|  |  | 
|  | namespace fml { | 
|  | namespace { | 
|  |  | 
|  | TEST(Time, Now) { | 
|  | auto start = ChronoTicksSinceEpoch(); | 
|  | for (int i = 0; i < 3; ++i) { | 
|  | auto now = ChronoTicksSinceEpoch(); | 
|  | EXPECT_GE(now, start); | 
|  | std::this_thread::yield(); | 
|  | } | 
|  | } | 
|  |  | 
|  | TEST(Time, IntConversions) { | 
|  | // Integer conversions should all truncate, not round. | 
|  | TimeDelta delta = TimeDelta::FromNanoseconds(102304506708ll); | 
|  | EXPECT_EQ(102304506708ll, delta.ToNanoseconds()); | 
|  | EXPECT_EQ(102304506ll, delta.ToMicroseconds()); | 
|  | EXPECT_EQ(102304ll, delta.ToMilliseconds()); | 
|  | EXPECT_EQ(102ll, delta.ToSeconds()); | 
|  | } | 
|  |  | 
|  | TEST(Time, FloatConversions) { | 
|  | // Float conversions should remain close to the original value. | 
|  | TimeDelta delta = TimeDelta::FromNanoseconds(102304506708ll); | 
|  | EXPECT_FLOAT_EQ(102304506708.0, delta.ToNanosecondsF()); | 
|  | EXPECT_FLOAT_EQ(102304506.708, delta.ToMicrosecondsF()); | 
|  | EXPECT_FLOAT_EQ(102304.506708, delta.ToMillisecondsF()); | 
|  | EXPECT_FLOAT_EQ(102.304506708, delta.ToSecondsF()); | 
|  | } | 
|  |  | 
|  | TEST(Time, TimespecConversions) { | 
|  | struct timespec ts; | 
|  | ts.tv_sec = 5; | 
|  | ts.tv_nsec = 7; | 
|  | TimeDelta from_timespec = TimeDelta::FromTimespec(ts); | 
|  | EXPECT_EQ(5, from_timespec.ToSeconds()); | 
|  | EXPECT_EQ(5 * 1000000000ll + 7, from_timespec.ToNanoseconds()); | 
|  | struct timespec to_timespec = from_timespec.ToTimespec(); | 
|  | EXPECT_EQ(ts.tv_sec, to_timespec.tv_sec); | 
|  | EXPECT_EQ(ts.tv_nsec, to_timespec.tv_nsec); | 
|  | } | 
|  |  | 
|  | }  // namespace | 
|  | }  // namespace fml |