blob: 2bb22d8a349d789d55bd0d6f97a9e93a110f9fe0 [file] [log] [blame]
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/// @docImport 'package:flutter/widgets.dart';
library;
import 'dart:ui';
import 'package:flutter_test/flutter_test.dart';
class FakeView extends TestFlutterView {
FakeView(FlutterView view, {this.viewId = 100})
: super(
view: view,
platformDispatcher: view.platformDispatcher as TestPlatformDispatcher,
display: view.display as TestDisplay,
);
@override
final int viewId;
@override
void render(Scene scene, {Size? size}) {
// Do not render the scene in the engine. The engine only observes one
// instance of FlutterView (the _view), and it is generally expected that
// the framework will render no more than one `Scene` per frame.
}
@override
void updateSemantics(SemanticsUpdate update) {
// Do not send the update to the engine. The engine only observes one
// instance of FlutterView (the _view). Sending semantic updates meant for
// different views to the same engine view does not work as the updates do
// not produce consistent semantics trees.
}
}
/// A test platform dispatcher that can show/hide its underlying `implicitView`,
/// depending on the value of the [implicitViewHidden] flag.
class NoImplicitViewPlatformDispatcher extends TestPlatformDispatcher {
NoImplicitViewPlatformDispatcher({required super.platformDispatcher})
: superPlatformDispatcher = platformDispatcher;
final PlatformDispatcher superPlatformDispatcher;
bool implicitViewHidden = false;
@override
TestFlutterView? get implicitView {
return implicitViewHidden ? null : superPlatformDispatcher.implicitView as TestFlutterView?;
}
}
/// Test Flutter Bindings that allow tests to hide/show the `implicitView`
/// of their [NoImplicitViewPlatformDispatcher] `platformDispatcher`.
///
/// This is used to test that [runApp] throws an assertion error with an
/// explanation when used when the `implicitView` is disabled (like in Flutter
/// web when multi-view is enabled).
///
/// Because of how [testWidgets] uses `runApp` internally to manage the lifecycle
/// of a test, the implicitView must be disabled/reenabled inside of the body of
/// the [WidgetTesterCallback] under test. In practice: the implicitView is disabled
/// in the first line of the test, and reenabled in the last.
///
/// See: multi_view_no_implicitView_binding_test.dart
class NoImplicitViewWidgetsBinding extends AutomatedTestWidgetsFlutterBinding {
late final NoImplicitViewPlatformDispatcher _platformDispatcher =
NoImplicitViewPlatformDispatcher(platformDispatcher: super.platformDispatcher);
@override
NoImplicitViewPlatformDispatcher get platformDispatcher => _platformDispatcher;
void hideImplicitView() {
platformDispatcher.implicitViewHidden = true;
}
void showImplicitView() {
platformDispatcher.implicitViewHidden = false;
}
}