| // 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. |
| |
| import 'package:flutter/rendering.dart'; |
| import 'package:flutter/scheduler.dart'; |
| import 'package:flutter/widgets.dart'; |
| import 'package:flutter_test/flutter_test.dart'; |
| |
| void main() { |
| WidgetsFlutterBinding.ensureInitialized(); |
| |
| test('handleMetricsChanged does not scheduleForcedFrame unless there a registered renderView with a child', () async { |
| expect(SchedulerBinding.instance.hasScheduledFrame, false); |
| RendererBinding.instance.handleMetricsChanged(); |
| expect(SchedulerBinding.instance.hasScheduledFrame, false); |
| |
| RendererBinding.instance.addRenderView(RendererBinding.instance.renderView); |
| RendererBinding.instance.handleMetricsChanged(); |
| expect(SchedulerBinding.instance.hasScheduledFrame, false); |
| |
| RendererBinding.instance.renderView.child = RenderLimitedBox(); |
| RendererBinding.instance.handleMetricsChanged(); |
| expect(SchedulerBinding.instance.hasScheduledFrame, true); |
| |
| RendererBinding.instance.removeRenderView(RendererBinding.instance.renderView); |
| }); |
| |
| test('debugDumpSemantics prints explanation when semantics are unavailable', () { |
| RendererBinding.instance.addRenderView(RendererBinding.instance.renderView); |
| final List<String?> log = <String?>[]; |
| debugPrint = (String? message, {int? wrapWidth}) { |
| log.add(message); |
| }; |
| debugDumpSemanticsTree(); |
| expect(log, hasLength(1)); |
| expect(log.single, startsWith('Semantics not generated')); |
| expect(log.single, endsWith( |
| 'For performance reasons, the framework only generates semantics when asked to do so by the platform.\n' |
| 'Usually, platforms only ask for semantics when assistive technologies (like screen readers) are running.\n' |
| 'To generate semantics, try turning on an assistive technology (like VoiceOver or TalkBack) on your device.' |
| )); |
| RendererBinding.instance.removeRenderView(RendererBinding.instance.renderView); |
| }); |
| |
| test('root pipeline owner cannot manage root node', () { |
| final RenderObject rootNode = RenderProxyBox(); |
| expect( |
| () => RendererBinding.instance.rootPipelineOwner.rootNode = rootNode, |
| throwsA(isFlutterError.having( |
| (FlutterError e) => e.message, |
| 'message', |
| contains('Cannot set a rootNode on the default root pipeline owner.'), |
| )), |
| ); |
| }); |
| } |