mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
137 lines
5.3 KiB
Dart
137 lines
5.3 KiB
Dart
// Copyright 2016 The Chromium 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:ui' as ui show TextBox;
|
|
|
|
import 'package:flutter/rendering.dart';
|
|
import 'package:flutter/services.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'rendering_tester.dart';
|
|
|
|
const String _kText = 'I polished up that handle so carefullee\nThat now I am the Ruler of the Queen\'s Navee!';
|
|
|
|
void main() {
|
|
test('getOffsetForCaret control test', () {
|
|
final RenderParagraph paragraph = new RenderParagraph(const TextSpan(text: _kText));
|
|
layout(paragraph);
|
|
|
|
final Rect caret = new Rect.fromLTWH(0.0, 0.0, 2.0, 20.0);
|
|
|
|
final Offset offset5 = paragraph.getOffsetForCaret(const TextPosition(offset: 5), caret);
|
|
expect(offset5.dx, greaterThan(0.0));
|
|
|
|
final Offset offset25 = paragraph.getOffsetForCaret(const TextPosition(offset: 25), caret);
|
|
expect(offset25.dx, greaterThan(offset5.dx));
|
|
|
|
final Offset offset50 = paragraph.getOffsetForCaret(const TextPosition(offset: 50), caret);
|
|
expect(offset50.dy, greaterThan(offset5.dy));
|
|
});
|
|
|
|
test('getPositionForOffset control test', () {
|
|
final RenderParagraph paragraph = new RenderParagraph(const TextSpan(text: _kText));
|
|
layout(paragraph);
|
|
|
|
final TextPosition position20 = paragraph.getPositionForOffset(const Offset(20.0, 5.0));
|
|
expect(position20.offset, greaterThan(0.0));
|
|
|
|
final TextPosition position40 = paragraph.getPositionForOffset(const Offset(40.0, 5.0));
|
|
expect(position40.offset, greaterThan(position20.offset));
|
|
|
|
final TextPosition positionBelow = paragraph.getPositionForOffset(const Offset(5.0, 20.0));
|
|
expect(positionBelow.offset, greaterThan(position40.offset));
|
|
});
|
|
|
|
test('getBoxesForSelection control test', () {
|
|
final RenderParagraph paragraph = new RenderParagraph(const TextSpan(text: _kText));
|
|
layout(paragraph);
|
|
|
|
List<ui.TextBox> boxes = paragraph.getBoxesForSelection(
|
|
const TextSelection(baseOffset: 5, extentOffset: 25)
|
|
);
|
|
|
|
expect(boxes.length, equals(1));
|
|
|
|
boxes = paragraph.getBoxesForSelection(
|
|
const TextSelection(baseOffset: 25, extentOffset: 50)
|
|
);
|
|
|
|
expect(boxes.length, equals(3));
|
|
});
|
|
|
|
test('getWordBoundary control test', () {
|
|
final RenderParagraph paragraph = new RenderParagraph(const TextSpan(text: _kText));
|
|
layout(paragraph);
|
|
|
|
final TextRange range5 = paragraph.getWordBoundary(const TextPosition(offset: 5));
|
|
expect(range5.textInside(_kText), equals('polished'));
|
|
|
|
final TextRange range50 = paragraph.getWordBoundary(const TextPosition(offset: 50));
|
|
expect(range50.textInside(_kText), equals(' '));
|
|
|
|
final TextRange range85 = paragraph.getWordBoundary(const TextPosition(offset: 75));
|
|
expect(range85.textInside(_kText), equals('Queen\'s'));
|
|
});
|
|
|
|
test('overflow test', () {
|
|
final RenderParagraph paragraph = new RenderParagraph(
|
|
const TextSpan(text: 'This is\na wrapping test. It should wrap at manual newlines, and if softWrap is true, also at spaces.'),
|
|
maxLines: 1,
|
|
softWrap: true,
|
|
);
|
|
|
|
void relayoutWith({int maxLines, bool softWrap, TextOverflow overflow}) {
|
|
paragraph
|
|
..maxLines = maxLines
|
|
..softWrap = softWrap
|
|
..overflow = overflow;
|
|
pumpFrame();
|
|
}
|
|
|
|
// Lay out in a narrow box to force wrapping.
|
|
layout(paragraph, constraints: const BoxConstraints(maxWidth: 50.0));
|
|
final double lineHeight = paragraph.size.height;
|
|
|
|
relayoutWith(maxLines: 3, softWrap: true, overflow: TextOverflow.clip);
|
|
expect(paragraph.size.height, equals(3 * lineHeight));
|
|
|
|
relayoutWith(maxLines: null, softWrap: true, overflow: TextOverflow.clip);
|
|
expect(paragraph.size.height, greaterThan(5 * lineHeight));
|
|
|
|
// Try again with ellipsis overflow. We can't test that the ellipsis are
|
|
// drawn, but we can test the sizing.
|
|
relayoutWith(maxLines: 1, softWrap: true, overflow: TextOverflow.ellipsis);
|
|
expect(paragraph.size.height, equals(lineHeight));
|
|
|
|
relayoutWith(maxLines: 3, softWrap: true, overflow: TextOverflow.ellipsis);
|
|
expect(paragraph.size.height, equals(3 * lineHeight));
|
|
|
|
// This is the one weird case. If maxLines is null, we would expect to allow
|
|
// infinite wrapping. However, if we did, we'd never know when to append an
|
|
// ellipsis, so this really means "append ellipsis as soon as we exceed the
|
|
// width".
|
|
relayoutWith(maxLines: null, softWrap: true, overflow: TextOverflow.ellipsis);
|
|
expect(paragraph.size.height, equals(2 * lineHeight));
|
|
|
|
// Now with no soft wrapping.
|
|
relayoutWith(maxLines: 1, softWrap: false, overflow: TextOverflow.clip);
|
|
expect(paragraph.size.height, equals(lineHeight));
|
|
|
|
relayoutWith(maxLines: 3, softWrap: false, overflow: TextOverflow.clip);
|
|
expect(paragraph.size.height, equals(2 * lineHeight));
|
|
|
|
relayoutWith(maxLines: null, softWrap: false, overflow: TextOverflow.clip);
|
|
expect(paragraph.size.height, equals(2 * lineHeight));
|
|
|
|
relayoutWith(maxLines: 1, softWrap: false, overflow: TextOverflow.ellipsis);
|
|
expect(paragraph.size.height, equals(lineHeight));
|
|
|
|
relayoutWith(maxLines: 3, softWrap: false, overflow: TextOverflow.ellipsis);
|
|
expect(paragraph.size.height, equals(2 * lineHeight));
|
|
|
|
relayoutWith(maxLines: null, softWrap: false, overflow: TextOverflow.ellipsis);
|
|
expect(paragraph.size.height, equals(2 * lineHeight));
|
|
});
|
|
}
|