5#import <OCMock/OCMock.h>
6#import <XCTest/XCTest.h>
17 auto thread = std::make_unique<fml::Thread>(
name);
18 auto runner = thread->GetTaskRunner();
23@interface VSyncClient (Testing)
26- (void)onDisplayLink:(CADisplayLink*)link;
35- (void)testSetAllowPauseAfterVsyncCorrect {
36 auto thread_task_runner = CreateNewThread(
"VsyncWaiterIosTest");
38 initWithTaskRunner:thread_task_runner
39 callback:[](std::unique_ptr<flutter::FrameTimingsRecorder> recorder) {}];
40 CADisplayLink* link = [vsyncClient getDisplayLink];
43 [vsyncClient onDisplayLink:link];
44 XCTAssertFalse(link.isPaused);
48 [vsyncClient onDisplayLink:link];
49 XCTAssertTrue(link.isPaused);
52- (void)testSetCorrectVariableRefreshRates {
53 auto thread_task_runner = CreateNewThread(
"VsyncWaiterIosTest");
54 auto callback = [](std::unique_ptr<flutter::FrameTimingsRecorder> recorder) {};
55 id bundleMock = OCMPartialMock([NSBundle mainBundle]);
58 id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]];
59 double maxFrameRate = 120;
60 [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate];
64 CADisplayLink* link = [vsyncClient getDisplayLink];
65 if (@available(iOS 15.0, *)) {
66 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.maximum, maxFrameRate, 0.1);
67 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.preferred, maxFrameRate, 0.1);
68 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.minimum, maxFrameRate / 2, 0.1);
70 XCTAssertEqualWithAccuracy(link.preferredFramesPerSecond, maxFrameRate, 0.1);
74- (void)testDoNotSetVariableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotOn {
75 auto thread_task_runner = CreateNewThread(
"VsyncWaiterIosTest");
76 auto callback = [](std::unique_ptr<flutter::FrameTimingsRecorder> recorder) {};
77 id bundleMock = OCMPartialMock([NSBundle mainBundle]);
80 id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]];
81 double maxFrameRate = 120;
82 [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate];
86 CADisplayLink* link = [vsyncClient getDisplayLink];
87 if (@available(iOS 15.0, *)) {
88 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.maximum, 0, 0.1);
89 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.preferred, 0, 0.1);
90 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.minimum, 0, 0.1);
92 XCTAssertEqualWithAccuracy(link.preferredFramesPerSecond, 0, 0.1);
96- (void)testDoNotSetVariableRefreshRatesIfCADisableMinimumFrameDurationOnPhoneIsNotSet {
97 auto thread_task_runner = CreateNewThread(
"VsyncWaiterIosTest");
98 auto callback = [](std::unique_ptr<flutter::FrameTimingsRecorder> recorder) {};
99 id mockDisplayLinkManager = [OCMockObject mockForClass:[DisplayLinkManager class]];
100 double maxFrameRate = 120;
101 [[[mockDisplayLinkManager stub] andReturnValue:@(maxFrameRate)] displayRefreshRate];
104 CADisplayLink* link = [vsyncClient getDisplayLink];
105 if (@available(iOS 15.0, *)) {
106 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.maximum, 0, 0.1);
107 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.preferred, 0, 0.1);
108 XCTAssertEqualWithAccuracy(link.preferredFrameRateRange.minimum, 0, 0.1);
110 XCTAssertEqualWithAccuracy(link.preferredFramesPerSecond, 0, 0.1);
114- (void)testAwaitAndPauseWillWorkCorrectly {
115 auto thread_task_runner = CreateNewThread(
"VsyncWaiterIosTest");
117 initWithTaskRunner:thread_task_runner
118 callback:[](std::unique_ptr<flutter::FrameTimingsRecorder> recorder) {}];
120 CADisplayLink* link = [vsyncClient getDisplayLink];
121 XCTAssertTrue(link.isPaused);
124 XCTAssertFalse(link.isPaused);
127 XCTAssertTrue(link.isPaused);
130- (void)testReleasesLinkOnInvalidation {
131 __weak CADisplayLink* weakLink;
133 auto thread_task_runner = CreateNewThread(
"VsyncWaiterIosTest");
135 initWithTaskRunner:thread_task_runner
136 callback:[](std::unique_ptr<flutter::FrameTimingsRecorder> recorder) {}];
138 weakLink = [vsyncClient getDisplayLink];
139 XCTAssertNotNil(weakLink);
143 XCTAssertNil(weakLink);
CADisplayLink * getDisplayLink()
FlutterDesktopBinaryReply callback
BOOL allowPauseAfterVsync
Default value is YES. Vsync client will pause vsync callback after receiving a vsync signal....
void invalidate()
Call invalidate before releasing this object to remove from runloops.
NSString *const kCADisableMinimumFrameDurationOnPhoneKey
Info.plist key enabling the full range of ProMotion refresh rates for CADisplayLink callbacks and CAA...