46 EXPECT_TRUE(displayLink.
paused);
49 initWithDisplayLink:displayLink
50 block:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp,
54 EXPECT_FALSE(displayLink.
paused);
55 [displayLink tickWithTimestamp:CACurrentMediaTime()
56 targetTimestamp:CACurrentMediaTime() + 1.0 / 60.0];
57 EXPECT_TRUE(displayLink.
paused);
74 auto test = [&](CFTimeInterval waitDuration, CFTimeInterval expectedDelay) {
75 __block CFTimeInterval timestamp = 0;
76 __block CFTimeInterval targetTimestamp = 0;
77 __block
size_t baton = 0;
78 const uintptr_t kWarmUpBaton = 0xFFFFFFFF;
80 initWithDisplayLink:displayLink
81 block:^(CFTimeInterval _timestamp, CFTimeInterval _targetTimestamp,
83 if (_baton == kWarmUpBaton) {
86 timestamp = _timestamp;
87 targetTimestamp = _targetTimestamp;
89 EXPECT_TRUE(CACurrentMediaTime() >= _timestamp - kTimerLatencyCompensation);
90 CFRunLoopStop(CFRunLoopGetCurrent());
96 CFTimeInterval now = CACurrentMediaTime();
98 [displayLink tickWithTimestamp:now + 0.5 * displayLink.nominalOutputRefreshPeriod
99 targetTimestamp:now + 2 * displayLink.nominalOutputRefreshPeriod];
100 EXPECT_EQ(displayLink.
paused, YES);
102 EXPECT_EQ(timestamp, 0);
107 CFTimeInterval expectedTimestamp = now + expectedDelay;
112 EXPECT_DOUBLE_EQ(timestamp, expectedTimestamp);
114 EXPECT_EQ(baton,
size_t(1));
129 const uintptr_t kWarmUpBaton = 0xFFFFFFFF;
132 CFTimeInterval timestamp;
133 CFTimeInterval targetTimestamp;
136 __block std::vector<Entry> entries;
139 initWithDisplayLink:displayLink
140 block:^(CFTimeInterval timestamp, CFTimeInterval targetTimestamp,
142 entries.push_back({timestamp, targetTimestamp, baton});
143 if (baton == kWarmUpBaton) {
146 EXPECT_TRUE(CACurrentMediaTime() >= timestamp - kTimerLatencyCompensation);
147 CFRunLoopStop(CFRunLoopGetCurrent());
150 __block CFTimeInterval expectedStartUntil;
155 [[NSRunLoop currentRunLoop] performBlock:^{
156 expectedStartUntil = CACurrentMediaTime();
160 CFTimeInterval now = CACurrentMediaTime();
162 [displayLink tickWithTimestamp:now + 0.5 * displayLink.nominalOutputRefreshPeriod
163 targetTimestamp:now + 2 * displayLink.nominalOutputRefreshPeriod];
164 EXPECT_EQ(displayLink.
paused, YES);
170 [displayLink tickWithTimestamp:now + 1.5 * displayLink.nominalOutputRefreshPeriod
171 targetTimestamp:now + 3 * displayLink.nominalOutputRefreshPeriod];
175 [displayLink tickWithTimestamp:now + 2.5 * displayLink.nominalOutputRefreshPeriod
176 targetTimestamp:now + 4 * displayLink.nominalOutputRefreshPeriod];
179 EXPECT_FALSE(displayLink.
paused);
181 [displayLink tickWithTimestamp:now + 3.5 * displayLink.nominalOutputRefreshPeriod
182 targetTimestamp:now + 5 * displayLink.nominalOutputRefreshPeriod];
184 CFTimeInterval
start = CACurrentMediaTime();
185 while (!displayLink.
paused) {
187 CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.02, NO);
188 if (CACurrentMediaTime() -
start > 1.0) {
192 ASSERT_TRUE(displayLink.
paused);
194 EXPECT_EQ(entries.size(),
size_t(4));
197 EXPECT_TRUE(entries[0].timestamp <= expectedStartUntil);
198 EXPECT_TRUE(entries[0].targetTimestamp <= expectedStartUntil);
199 EXPECT_EQ(entries[0].baton, kWarmUpBaton);
203 EXPECT_EQ(entries[1].baton,
size_t(1));
206 EXPECT_EQ(entries[2].baton,
size_t(2));
209 EXPECT_EQ(entries[3].baton,
size_t(3));