Implement frameData for TestWindow (#105537)
This commit is contained in:
parent
f9468d3695
commit
21841d7e35
@ -156,6 +156,12 @@ abstract class TestWidgetsFlutterBinding extends BindingBase
|
||||
debugDisableShadows = disableShadows;
|
||||
}
|
||||
|
||||
@override
|
||||
void handleBeginFrame(Duration? rawTimeStamp) {
|
||||
_window.incrementFrameNumber();
|
||||
super.handleBeginFrame(rawTimeStamp);
|
||||
}
|
||||
|
||||
@override
|
||||
TestWindow get window => _window;
|
||||
final TestWindow _window;
|
||||
@ -1048,7 +1054,6 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
|
||||
}
|
||||
_phase = newPhase;
|
||||
if (hasScheduledFrame) {
|
||||
addTime(const Duration(milliseconds: 500));
|
||||
_currentFakeAsync!.flushMicrotasks();
|
||||
handleBeginFrame(Duration(
|
||||
milliseconds: _clock!.now().millisecondsSinceEpoch,
|
||||
@ -1093,8 +1098,6 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
|
||||
),
|
||||
);
|
||||
|
||||
addTime(additionalTime);
|
||||
|
||||
return realAsyncZone.run<Future<T?>>(() async {
|
||||
_pendingAsyncTasks = Completer<void>();
|
||||
T? result;
|
||||
|
@ -59,6 +59,14 @@ class TestWindow implements ui.SingletonFlutterWindow {
|
||||
}) : _window = window,
|
||||
platformDispatcher = TestPlatformDispatcher(platformDispatcher: window.platformDispatcher);
|
||||
|
||||
|
||||
int _frameNumber = 0;
|
||||
/// Indicates that the test binding has pumped a frame.
|
||||
void incrementFrameNumber() {
|
||||
_frameNumber += 1;
|
||||
platformDispatcher.frameData = _TestFrameData(_frameNumber);
|
||||
}
|
||||
|
||||
/// The [dart:ui.SingletonFlutterWindow] that is wrapped by this [TestWindow].
|
||||
final ui.SingletonFlutterWindow _window;
|
||||
|
||||
@ -491,6 +499,9 @@ class TestWindow implements ui.SingletonFlutterWindow {
|
||||
platformDispatcher.onPlatformMessage = callback;
|
||||
}
|
||||
|
||||
@override
|
||||
ui.FrameData get frameData => platformDispatcher.frameData;
|
||||
|
||||
/// Delete any test value properties that have been set on this [TestWindow]
|
||||
/// as well as its [platformDispatcher].
|
||||
///
|
||||
@ -505,6 +516,7 @@ class TestWindow implements ui.SingletonFlutterWindow {
|
||||
clearDisplayFeaturesTestValue();
|
||||
clearPhysicalSizeTestValue();
|
||||
clearViewInsetsTestValue();
|
||||
_frameNumber = 0;
|
||||
platformDispatcher.clearAllTestValues();
|
||||
}
|
||||
|
||||
@ -882,6 +894,7 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
|
||||
clearLocalesTestValue();
|
||||
clearSemanticsEnabledTestValue();
|
||||
clearTextScaleFactorTestValue();
|
||||
frameData = const _TestFrameData(0);
|
||||
}
|
||||
|
||||
@override
|
||||
@ -914,7 +927,7 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
|
||||
ui.PlatformConfiguration get configuration => _platformDispatcher.configuration;
|
||||
|
||||
@override
|
||||
ui.FrameData get frameData => _platformDispatcher.frameData;
|
||||
ui.FrameData frameData = const _TestFrameData(0);
|
||||
|
||||
@override
|
||||
ByteData? getPersistentIsolateData() => _platformDispatcher.getPersistentIsolateData();
|
||||
@ -930,3 +943,10 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
class _TestFrameData implements ui.FrameData {
|
||||
const _TestFrameData(this.frameNumber);
|
||||
|
||||
@override
|
||||
final int frameNumber;
|
||||
}
|
||||
|
@ -33,6 +33,35 @@ void main() {
|
||||
});
|
||||
});
|
||||
|
||||
test('frameNumber', () async {
|
||||
binding.window.clearAllTestValues();
|
||||
expect(binding.window.frameData.frameNumber, 0);
|
||||
await binding.runTest(() async {
|
||||
// runTest pumps a frame.
|
||||
expect(binding.window.frameData.frameNumber, 1);
|
||||
|
||||
// Scheduling should not pump
|
||||
binding.scheduleFrame();
|
||||
expect(binding.window.frameData.frameNumber, 1);
|
||||
binding.handleBeginFrame(null);
|
||||
expect(binding.window.frameData.frameNumber, 2);
|
||||
binding.handleDrawFrame();
|
||||
expect(binding.window.frameData.frameNumber, 2);
|
||||
|
||||
// Pump with no scheduled frame.
|
||||
await binding.pump();
|
||||
expect(binding.window.frameData.frameNumber, 2);
|
||||
|
||||
// Schedule and pump, similar to handleBeginFrame.
|
||||
binding.scheduleFrame();
|
||||
await binding.pump();
|
||||
expect(binding.window.frameData.frameNumber, 3);
|
||||
}, () {});
|
||||
binding.postTest();
|
||||
binding.window.clearAllTestValues();
|
||||
expect(binding.window.frameData.frameNumber, 0);
|
||||
});
|
||||
|
||||
// The next three tests must run in order -- first using `test`, then `testWidgets`, then `test` again.
|
||||
|
||||
int order = 0;
|
||||
|
Loading…
x
Reference in New Issue
Block a user