Flutter Engine Uber Docs
Docs for the entire Flutter Engine repo.
 
Loading...
Searching...
No Matches
VsyncWaiterIOSTest.mm
Go to the documentation of this file.
1// Copyright 2013 The Flutter Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#import <OCMock/OCMock.h>
6#import <XCTest/XCTest.h>
7
8#include <memory>
9
12#import "flutter/shell/platform/darwin/ios/InternalFlutterSwift/InternalFlutterSwift.h"
14
15namespace {
16
20 return flutter::TaskRunners("VsyncWaiterIOSTest", task_runner, task_runner, task_runner,
21 task_runner);
22}
23
24} // namespace
25
26@interface VsyncWaiterIOSTest : XCTestCase
27@end
28
29@implementation VsyncWaiterIOSTest
30
31- (void)testSnapDurationWithValidDuration {
32 // 60Hz: 1/60 = 0.016666...
33 CFTimeInterval duration = 0.016667;
34 CFTimeInterval snapped = flutter::VsyncWaiterIOS::SnapDuration(duration, 60.0);
35 XCTAssertEqualWithAccuracy(snapped, 1.0 / 60.0, 0.0001);
36
37 // 120Hz: 1/120 = 0.008333...
38 duration = 0.008334;
39 snapped = flutter::VsyncWaiterIOS::SnapDuration(duration, 120.0);
40 XCTAssertEqualWithAccuracy(snapped, 1.0 / 120.0, 0.0001);
41}
42
43- (void)testSnapDurationWithInvalidDuration {
44 // Zero duration should fallback to max_refresh_rate.
45 CFTimeInterval snapped = flutter::VsyncWaiterIOS::SnapDuration(0.0, 120.0);
46 XCTAssertEqualWithAccuracy(snapped, 1.0 / 120.0, 0.0001);
47
48 // Negative duration should fallback to max_refresh_rate.
49 snapped = flutter::VsyncWaiterIOS::SnapDuration(-0.1, 80.0);
50 XCTAssertEqualWithAccuracy(snapped, 1.0 / 80.0, 0.0001);
51}
52
53- (void)testSnapDurationWithZeroMaxRefreshRateFallback {
54 // If duration is invalid AND max_refresh_rate is 0, fallback to 60Hz.
55 CFTimeInterval snapped = flutter::VsyncWaiterIOS::SnapDuration(0.0, 0.0);
56 XCTAssertEqualWithAccuracy(snapped, 1.0 / 60.0, 0.0001);
57
58 snapped = flutter::VsyncWaiterIOS::SnapDuration(-1.0, -10.0);
59 XCTAssertEqualWithAccuracy(snapped, 1.0 / 60.0, 0.0001);
60}
61
62- (void)testConstructorUsesInjectedDisplayLinkManagerRefreshRate {
63 id mockDisplayLinkManager = OCMPartialMock([FlutterDisplayLinkManager shared]);
64 [self addTeardownBlock:^{
65 [mockDisplayLinkManager stopMocking];
66 }];
67 double maxFrameRate = 120;
68 (void)[[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate];
69
70 flutter::TaskRunners taskRunners = CreateTestTaskRunners();
71 auto waiter = std::make_unique<flutter::VsyncWaiterIOS>(taskRunners, mockDisplayLinkManager);
72
73 XCTAssertEqual(waiter->GetMaxRefreshRateForTesting(), maxFrameRate);
74}
75
76- (void)testAwaitVSyncPicksUpRefreshRateChangesFromInjectedDisplayLinkManager {
77 id mockDisplayLinkManager = OCMPartialMock([FlutterDisplayLinkManager shared]);
78 [self addTeardownBlock:^{
79 [mockDisplayLinkManager stopMocking];
80 }];
81 // A single stub whose return value is re-read on every invocation via the __block variable.
82 // OCMock stubs aren't replaced by re-stubbing the same selector — the first-registered stub
83 // keeps answering — so a fixed andReturnValue: can't model a value that changes over time.
84 double initialFrameRate = 60;
85 __block double refreshRate = initialFrameRate;
86 OCMStub([mockDisplayLinkManager displayRefreshRate]).andDo(^(NSInvocation* invocation) {
87 [invocation setReturnValue:&refreshRate];
88 });
89
90 flutter::TaskRunners taskRunners = CreateTestTaskRunners();
91 auto waiter = std::make_unique<flutter::VsyncWaiterIOS>(taskRunners, mockDisplayLinkManager);
92 XCTAssertEqual(waiter->GetMaxRefreshRateForTesting(), initialFrameRate);
93
94 double updatedFrameRate = 120;
95 refreshRate = updatedFrameRate;
96 waiter->AwaitVSync();
97
98 XCTAssertEqual(waiter->GetMaxRefreshRateForTesting(), updatedFrameRate);
99}
100
101@end
static CFTimeInterval SnapDuration(CFTimeInterval duration, double max_refresh_rate)
static void EnsureInitializedForCurrentThread()
fml::RefPtr< fml::TaskRunner > GetTaskRunner() const
static FML_EMBEDDER_ONLY MessageLoop & GetCurrent()
FlutterFMLTaskRunners * CreateTestTaskRunners(NSString *label)