| // Copyright 2013 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. |
| |
| import 'dart:async'; |
| import 'dart:js_interop'; |
| |
| import 'package:test/test.dart'; |
| import 'package:ui/src/engine.dart' as engine; |
| import 'package:ui/src/engine/initialization.dart'; |
| import 'package:ui/ui.dart' as ui; |
| import 'package:ui/ui_web/src/ui_web.dart' as ui_web; |
| |
| import 'fake_asset_manager.dart'; |
| import 'rendering.dart'; |
| |
| void setUpUnitTests({ |
| bool withImplicitView = false, |
| bool emulateTesterEnvironment = true, |
| bool setUpTestViewDimensions = true, |
| }) { |
| late final FakeAssetScope debugFontsScope; |
| setUpAll(() async { |
| if (emulateTesterEnvironment) { |
| ui_web.debugEmulateFlutterTesterEnvironment = true; |
| } |
| |
| debugFontsScope = configureDebugFontsAssetScope(fakeAssetManager); |
| debugOnlyAssetManager = fakeAssetManager; |
| await bootstrapAndRunApp(withImplicitView: withImplicitView); |
| engine.debugOverrideJsConfiguration(<String, Object?>{ |
| 'fontFallbackBaseUrl': 'assets/fallback_fonts/', |
| }.jsify() as engine.JsFlutterConfiguration?); |
| |
| if (setUpTestViewDimensions) { |
| // The following parameters are hard-coded in Flutter's test embedder. Since |
| // we don't have an embedder yet this is the lowest-most layer we can put |
| // this stuff in. |
| const double devicePixelRatio = 3.0; |
| engine.EngineFlutterDisplay.instance.debugOverrideDevicePixelRatio(devicePixelRatio); |
| engine.EnginePlatformDispatcher.instance.implicitView?.debugPhysicalSizeOverride = |
| const ui.Size(800 * devicePixelRatio, 600 * devicePixelRatio); |
| engine.scheduleFrameCallback = () {}; |
| } |
| |
| setUpRenderingForTests(); |
| }); |
| |
| tearDownAll(() async { |
| fakeAssetManager.popAssetScope(debugFontsScope); |
| }); |
| } |
| |
| Future<void> bootstrapAndRunApp({bool withImplicitView = false}) async { |
| final Completer<void> completer = Completer<void>(); |
| await ui_web.bootstrapEngine(runApp: () => completer.complete()); |
| await completer.future; |
| if (!withImplicitView) { |
| _disableImplicitView(); |
| } |
| } |
| |
| void _disableImplicitView() { |
| // TODO(mdebbar): Instead of disabling the implicit view, we should be able to |
| // initialize tests without an implicit view to begin with. |
| // https://github.com/flutter/flutter/issues/138906 |
| final engine.EngineFlutterWindow? implicitView = engine.EnginePlatformDispatcher.instance.implicitView; |
| if (implicitView != null) { |
| engine.EnginePlatformDispatcher.instance.viewManager.disposeAndUnregisterView(implicitView.viewId); |
| } |
| } |