Skip to content

Commit 21841d7

Browse files
authored
Implement frameData for TestWindow (#105537)
1 parent f9468d3 commit 21841d7

File tree

3 files changed

+56
-4
lines changed

3 files changed

+56
-4
lines changed

packages/flutter_test/lib/src/binding.dart

+6-3
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,12 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
156156
debugDisableShadows = disableShadows;
157157
}
158158

159+
@override
160+
void handleBeginFrame(Duration? rawTimeStamp) {
161+
_window.incrementFrameNumber();
162+
super.handleBeginFrame(rawTimeStamp);
163+
}
164+
159165
@override
160166
TestWindow get window => _window;
161167
final TestWindow _window;
@@ -1048,7 +1054,6 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
10481054
}
10491055
_phase = newPhase;
10501056
if (hasScheduledFrame) {
1051-
addTime(const Duration(milliseconds: 500));
10521057
_currentFakeAsync!.flushMicrotasks();
10531058
handleBeginFrame(Duration(
10541059
milliseconds: _clock!.now().millisecondsSinceEpoch,
@@ -1093,8 +1098,6 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
10931098
),
10941099
);
10951100

1096-
addTime(additionalTime);
1097-
10981101
return realAsyncZone.run<Future<T?>>(() async {
10991102
_pendingAsyncTasks = Completer<void>();
11001103
T? result;

packages/flutter_test/lib/src/window.dart

+21-1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ class TestWindow implements ui.SingletonFlutterWindow {
5959
}) : _window = window,
6060
platformDispatcher = TestPlatformDispatcher(platformDispatcher: window.platformDispatcher);
6161

62+
63+
int _frameNumber = 0;
64+
/// Indicates that the test binding has pumped a frame.
65+
void incrementFrameNumber() {
66+
_frameNumber += 1;
67+
platformDispatcher.frameData = _TestFrameData(_frameNumber);
68+
}
69+
6270
/// The [dart:ui.SingletonFlutterWindow] that is wrapped by this [TestWindow].
6371
final ui.SingletonFlutterWindow _window;
6472

@@ -491,6 +499,9 @@ class TestWindow implements ui.SingletonFlutterWindow {
491499
platformDispatcher.onPlatformMessage = callback;
492500
}
493501

502+
@override
503+
ui.FrameData get frameData => platformDispatcher.frameData;
504+
494505
/// Delete any test value properties that have been set on this [TestWindow]
495506
/// as well as its [platformDispatcher].
496507
///
@@ -505,6 +516,7 @@ class TestWindow implements ui.SingletonFlutterWindow {
505516
clearDisplayFeaturesTestValue();
506517
clearPhysicalSizeTestValue();
507518
clearViewInsetsTestValue();
519+
_frameNumber = 0;
508520
platformDispatcher.clearAllTestValues();
509521
}
510522

@@ -882,6 +894,7 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
882894
clearLocalesTestValue();
883895
clearSemanticsEnabledTestValue();
884896
clearTextScaleFactorTestValue();
897+
frameData = const _TestFrameData(0);
885898
}
886899

887900
@override
@@ -914,7 +927,7 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
914927
ui.PlatformConfiguration get configuration => _platformDispatcher.configuration;
915928

916929
@override
917-
ui.FrameData get frameData => _platformDispatcher.frameData;
930+
ui.FrameData frameData = const _TestFrameData(0);
918931

919932
@override
920933
ByteData? getPersistentIsolateData() => _platformDispatcher.getPersistentIsolateData();
@@ -930,3 +943,10 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
930943
return null;
931944
}
932945
}
946+
947+
class _TestFrameData implements ui.FrameData {
948+
const _TestFrameData(this.frameNumber);
949+
950+
@override
951+
final int frameNumber;
952+
}

packages/flutter_test/test/bindings_test.dart

+29
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,35 @@ void main() {
3333
});
3434
});
3535

36+
test('frameNumber', () async {
37+
binding.window.clearAllTestValues();
38+
expect(binding.window.frameData.frameNumber, 0);
39+
await binding.runTest(() async {
40+
// runTest pumps a frame.
41+
expect(binding.window.frameData.frameNumber, 1);
42+
43+
// Scheduling should not pump
44+
binding.scheduleFrame();
45+
expect(binding.window.frameData.frameNumber, 1);
46+
binding.handleBeginFrame(null);
47+
expect(binding.window.frameData.frameNumber, 2);
48+
binding.handleDrawFrame();
49+
expect(binding.window.frameData.frameNumber, 2);
50+
51+
// Pump with no scheduled frame.
52+
await binding.pump();
53+
expect(binding.window.frameData.frameNumber, 2);
54+
55+
// Schedule and pump, similar to handleBeginFrame.
56+
binding.scheduleFrame();
57+
await binding.pump();
58+
expect(binding.window.frameData.frameNumber, 3);
59+
}, () {});
60+
binding.postTest();
61+
binding.window.clearAllTestValues();
62+
expect(binding.window.frameData.frameNumber, 0);
63+
});
64+
3665
// The next three tests must run in order -- first using `test`, then `testWidgets`, then `test` again.
3766

3867
int order = 0;

0 commit comments

Comments
 (0)