// 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/services.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { final TextSelectionDelegate delegate = _FakeEditableTextState(); test('editable intrinsics', () { final editable = RenderEditable( text: const TextSpan(style: TextStyle(height: 1.0, fontSize: 10.0), text: '12345'), startHandleLayerLink: LayerLink(), endHandleLayerLink: LayerLink(), textDirection: TextDirection.ltr, locale: const Locale('ja', 'JP'), offset: ViewportOffset.zero(), textSelectionDelegate: delegate, ); expect(editable.getMinIntrinsicWidth(double.infinity), 50.0); // The width includes the width of the cursor (1.0). expect(editable.getMaxIntrinsicWidth(double.infinity), 52.0); expect(editable.getMinIntrinsicHeight(double.infinity), 10.0); expect(editable.getMaxIntrinsicHeight(double.infinity), 10.0); expect( editable.toStringDeep(minLevel: DiagnosticLevel.info), equalsIgnoringHashCodes( 'RenderEditable#00000 NEEDS-LAYOUT NEEDS-PAINT NEEDS-COMPOSITING-BITS-UPDATE DETACHED\n' ' │ parentData: MISSING\n' ' │ constraints: MISSING\n' ' │ size: MISSING\n' ' │ cursorColor: null\n' ' │ showCursor: ValueNotifier#00000(false)\n' ' │ maxLines: 1\n' ' │ minLines: null\n' ' │ selectionColor: null\n' ' │ locale: ja_JP\n' ' │ selection: null\n' ' │ offset: _FixedViewportOffset#00000(offset: 0.0)\n' ' ╘═╦══ text ═══\n' ' ║ TextSpan:\n' ' ║ inherit: true\n' ' ║ size: 10.0\n' ' ║ height: 1.0x\n' ' ║ "12345"\n' ' ╚═══════════\n', ), ); }); test('textScaler affects intrinsics', () { final editable = RenderEditable( text: const TextSpan(style: TextStyle(fontSize: 10), text: 'Hello World'), textDirection: TextDirection.ltr, startHandleLayerLink: LayerLink(), endHandleLayerLink: LayerLink(), offset: ViewportOffset.zero(), textSelectionDelegate: delegate, ); expect(editable.getMaxIntrinsicWidth(double.infinity), 110 + 2); editable.textScaler = const TextScaler.linear(2); expect(editable.getMaxIntrinsicWidth(double.infinity), 220 + 2); }); test('maxLines affects intrinsics', () { final editable = RenderEditable( text: TextSpan( style: const TextStyle(fontSize: 10), text: List.filled(5, 'A').join('\n'), ), textDirection: TextDirection.ltr, startHandleLayerLink: LayerLink(), endHandleLayerLink: LayerLink(), offset: ViewportOffset.zero(), textSelectionDelegate: delegate, maxLines: null, ); expect(editable.getMaxIntrinsicHeight(double.infinity), 50); editable.maxLines = 1; expect(editable.getMaxIntrinsicHeight(double.infinity), 10); }); test('strutStyle affects intrinsics', () { final editable = RenderEditable( text: const TextSpan(style: TextStyle(fontSize: 10), text: 'Hello World'), textDirection: TextDirection.ltr, startHandleLayerLink: LayerLink(), endHandleLayerLink: LayerLink(), offset: ViewportOffset.zero(), textSelectionDelegate: delegate, ); expect(editable.getMaxIntrinsicHeight(double.infinity), 10); editable.strutStyle = const StrutStyle(fontSize: 100, forceStrutHeight: true); expect(editable.getMaxIntrinsicHeight(double.infinity), 100); }); } class _FakeEditableTextState with TextSelectionDelegate { @override TextEditingValue textEditingValue = TextEditingValue.empty; TextSelection? selection; @override void hideToolbar([bool hideHandles = true]) {} @override void userUpdateTextEditingValue(TextEditingValue value, SelectionChangedCause cause) { selection = value.selection; } @override void bringIntoView(TextPosition position) {} @override void cutSelection(SelectionChangedCause cause) {} @override Future pasteText(SelectionChangedCause cause) { return Future.value(); } @override void selectAll(SelectionChangedCause cause) {} @override void copySelection(SelectionChangedCause cause) {} }