baseline_test.dart 3.85 KB
Newer Older
Ian Hickson's avatar
Ian Hickson committed
1
// Copyright 2014 The Flutter Authors. All rights reserved.
2 3 4
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

5 6
// @dart = 2.8

7
import 'package:flutter_test/flutter_test.dart';
8
import 'package:flutter/material.dart';
9 10 11 12

void main() {
  testWidgets('Baseline - control test', (WidgetTester tester) async {
    await tester.pumpWidget(
13
      const Center(
14 15
        child: DefaultTextStyle(
          style: TextStyle(
16 17 18
            fontFamily: 'Ahem',
            fontSize: 100.0,
          ),
19
          child: Text('X', textDirection: TextDirection.ltr),
20 21 22 23
        ),
      ),
    );
    expect(tester.renderObject<RenderBox>(find.text('X')).size, const Size(100.0, 100.0));
24
  });
25 26 27

  testWidgets('Baseline - position test', (WidgetTester tester) async {
    await tester.pumpWidget(
28
      const Center(
29
        child: Baseline(
30 31
          baseline: 180.0,
          baselineType: TextBaseline.alphabetic,
32 33
          child: DefaultTextStyle(
            style: TextStyle(
34 35 36
              fontFamily: 'Ahem',
              fontSize: 100.0,
            ),
37
            child: Text('X', textDirection: TextDirection.ltr),
38 39 40 41 42
          ),
        ),
      ),
    );
    expect(tester.renderObject<RenderBox>(find.text('X')).size, const Size(100.0, 100.0));
43 44
    expect(tester.renderObject<RenderBox>(find.byType(Baseline)).size,
           within<Size>(from: const Size(100.0, 200.0), distance: 0.001));
45
  });
46 47 48 49

  testWidgets('Chip caches baseline', (WidgetTester tester) async {
    int calls = 0;
    await tester.pumpWidget(
50 51 52
      MaterialApp(
        home: Material(
          child: Baseline(
53 54
            baseline: 100.0,
            baselineType: TextBaseline.alphabetic,
55 56
            child: Chip(
              label: BaselineDetector(() {
57 58 59 60 61 62 63 64 65 66 67 68 69
                calls += 1;
              }),
            ),
          ),
        ),
      ),
    );
    expect(calls, 1);
    await tester.pump();
    expect(calls, 1);
    tester.renderObject<RenderBaselineDetector>(find.byType(BaselineDetector)).dirty();
    await tester.pump();
    expect(calls, 2);
70
  });
71 72 73 74

  testWidgets('ListTile caches baseline', (WidgetTester tester) async {
    int calls = 0;
    await tester.pumpWidget(
75 76 77
      MaterialApp(
        home: Material(
          child: Baseline(
78 79
            baseline: 100.0,
            baselineType: TextBaseline.alphabetic,
80 81
            child: ListTile(
              title: BaselineDetector(() {
82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98
                calls += 1;
              }),
            ),
          ),
        ),
      ),
    );
    expect(calls, 1);
    await tester.pump();
    expect(calls, 1);
    tester.renderObject<RenderBaselineDetector>(find.byType(BaselineDetector)).dirty();
    await tester.pump();
    expect(calls, 2);
  });
}

class BaselineDetector extends LeafRenderObjectWidget {
99
  const BaselineDetector(this.callback, { Key key }) : super(key: key);
100 101 102 103

  final VoidCallback callback;

  @override
104
  RenderBaselineDetector createRenderObject(BuildContext context) => RenderBaselineDetector(callback);
105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149

  @override
  void updateRenderObject(BuildContext context, RenderBaselineDetector renderObject) {
    renderObject.callback = callback;
  }
}

class RenderBaselineDetector extends RenderBox {
  RenderBaselineDetector(this.callback);

  VoidCallback callback;

  @override
  bool get sizedByParent => true;

  @override
  double computeMinIntrinsicWidth(double height) => 0.0;

  @override
  double computeMaxIntrinsicWidth(double height) => 0.0;

  @override
  double computeMinIntrinsicHeight(double width) => 0.0;

  @override
  double computeMaxIntrinsicHeight(double width) => 0.0;

  @override
  double computeDistanceToActualBaseline(TextBaseline baseline) {
    if (callback != null)
      callback();
    return 0.0;
  }

  void dirty() {
    markNeedsLayout();
  }

  @override
  void performResize() {
    size = constraints.smallest;
  }

  @override
  void paint(PaintingContext context, Offset offset) { }
150
}