flex_test.dart 4.36 KB
Newer Older
Hixie's avatar
Hixie committed
1 2 3 4
// Copyright 2015 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.

Adam Barth's avatar
Adam Barth committed
5
import 'package:flutter_test/flutter_test.dart';
6
import 'package:flutter/rendering.dart';
7
import 'package:flutter/widgets.dart';
8 9

void main() {
10
  testWidgets('Can hit test flex children of stacks', (WidgetTester tester) async {
11
    bool didReceiveTap = false;
12
    await tester.pumpWidget(
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
      new Directionality(
        textDirection: TextDirection.ltr,
        child: new Container(
          color: const Color(0xFF00FF00),
          child: new Stack(
            children: <Widget>[
              new Positioned(
                top: 10.0,
                left: 10.0,
                child: new Column(
                  children: <Widget>[
                    new GestureDetector(
                      onTap: () {
                        didReceiveTap = true;
                      },
                      child: new Container(
                        color: const Color(0xFF0000FF),
                        width: 100.0,
                        height: 100.0,
                        child: const Center(
33
                          child: Text('X', textDirection: TextDirection.ltr),
34
                        ),
35 36
                      ),
                    ),
37 38
                  ],
                ),
39
              ),
40 41
            ],
          ),
42 43
        ),
      ),
44
    );
45

46
    await tester.tap(find.text('X'));
47
    expect(didReceiveTap, isTrue);
48
  });
49

50 51 52
  testWidgets('Flexible defaults to loose', (WidgetTester tester) async {
    await tester.pumpWidget(
      new Row(
53
        textDirection: TextDirection.ltr,
54
        children: const <Widget>[
55
          Flexible(child: SizedBox(width: 100.0, height: 200.0)),
56 57 58 59
        ],
      ),
    );

60
    final RenderBox box = tester.renderObject(find.byType(SizedBox));
61 62 63
    expect(box.size.width, 100.0);
  });

64 65 66
  testWidgets('Can pass null for flex', (WidgetTester tester) async {
    await tester.pumpWidget(
      new Row(
67
        textDirection: TextDirection.ltr,
68
        children: const <Widget>[
69 70
          Expanded(flex: null, child: Text('one', textDirection: TextDirection.ltr)),
          Flexible(flex: null, child: Text('two', textDirection: TextDirection.ltr)),
71 72 73 74
        ],
      ),
    );
  });
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112

  testWidgets('Doesn\'t overflow because of floating point accumulated error', (WidgetTester tester) async {
    // both of these cases have failed in the past due to floating point issues
    await tester.pumpWidget(
      new Center(
        child: new Container(
          height: 400.0,
          child: new Column(
            children: <Widget>[
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
            ],
          ),
        ),
      ),
    );
    await tester.pumpWidget(
      new Center(
        child: new Container(
          height: 199.0,
          child: new Column(
            children: <Widget>[
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
              new Expanded(child: new Container()),
            ],
          ),
        ),
      ),
    );
  });
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

  testWidgets('Error information is printed correctly', (WidgetTester tester) async {
    // We run this twice, the first time without an error, so that the second time
    // we only get a single exception. Otherwise we'd get two, the one we want and
    // an extra one when we discover we never computed a size.
    await tester.pumpWidget(
      new Column(
        children: <Widget>[
          new Column(),
        ],
      ),
      Duration.zero,
      EnginePhase.layout,
    );
    await tester.pumpWidget(
      new Column(
        children: <Widget>[
          new Column(
            children: <Widget>[
              new Expanded(child: new Container()),
            ],
          ),
        ],
      ),
      Duration.zero,
      EnginePhase.layout,
    );
    final String message = tester.takeException().toString();
    expect(message, contains('\nSee also:'));
  });
143
}