Skip to content

Commit

Permalink
Implement frameData for TestWindow (#105537)
Browse files Browse the repository at this point in the history
  • Loading branch information
dnfield authored Jun 27, 2022
1 parent f9468d3 commit 21841d7
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 4 deletions.
9 changes: 6 additions & 3 deletions packages/flutter_test/lib/src/binding.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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,
Expand Down Expand Up @@ -1093,8 +1098,6 @@ class AutomatedTestWidgetsFlutterBinding extends TestWidgetsFlutterBinding {
),
);

addTime(additionalTime);

return realAsyncZone.run<Future<T?>>(() async {
_pendingAsyncTasks = Completer<void>();
T? result;
Expand Down
22 changes: 21 additions & 1 deletion packages/flutter_test/lib/src/window.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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].
///
Expand All @@ -505,6 +516,7 @@ class TestWindow implements ui.SingletonFlutterWindow {
clearDisplayFeaturesTestValue();
clearPhysicalSizeTestValue();
clearViewInsetsTestValue();
_frameNumber = 0;
platformDispatcher.clearAllTestValues();
}

Expand Down Expand Up @@ -882,6 +894,7 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
clearLocalesTestValue();
clearSemanticsEnabledTestValue();
clearTextScaleFactorTestValue();
frameData = const _TestFrameData(0);
}

@override
Expand Down Expand Up @@ -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();
Expand All @@ -930,3 +943,10 @@ class TestPlatformDispatcher implements ui.PlatformDispatcher {
return null;
}
}

class _TestFrameData implements ui.FrameData {
const _TestFrameData(this.frameNumber);

@override
final int frameNumber;
}
29 changes: 29 additions & 0 deletions packages/flutter_test/test/bindings_test.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit 21841d7

Please sign in to comment.