1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
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
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
150
151
152
153
154
// 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.
// @dart = 2.8
import 'package:flutter_test/flutter_test.dart';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
void main() {
testWidgets('Can hit test flex children of stacks', (WidgetTester tester) async {
bool didReceiveTap = false;
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: Container(
color: const Color(0xFF00FF00),
child: Stack(
children: <Widget>[
Positioned(
top: 10.0,
left: 10.0,
child: Column(
children: <Widget>[
GestureDetector(
onTap: () {
didReceiveTap = true;
},
child: Container(
color: const Color(0xFF0000FF),
width: 100.0,
height: 100.0,
child: const Center(
child: Text('X', textDirection: TextDirection.ltr),
),
),
),
],
),
),
],
),
),
),
);
await tester.tap(find.text('X'));
expect(didReceiveTap, isTrue);
});
testWidgets('Flexible defaults to loose', (WidgetTester tester) async {
await tester.pumpWidget(
Row(
textDirection: TextDirection.ltr,
children: const <Widget>[
Flexible(child: SizedBox(width: 100.0, height: 200.0)),
],
),
);
final RenderBox box = tester.renderObject(find.byType(SizedBox));
expect(box.size.width, 100.0);
});
testWidgets('Can pass null for flex', (WidgetTester tester) async {
await tester.pumpWidget(
Row(
textDirection: TextDirection.ltr,
children: const <Widget>[
Expanded(flex: null, child: Text('one', textDirection: TextDirection.ltr)),
Flexible(flex: null, child: Text('two', textDirection: TextDirection.ltr)),
],
),
);
});
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(
Center(
child: Container(
height: 400.0,
child: Column(
children: <Widget>[
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
],
),
),
),
);
await tester.pumpWidget(
Center(
child: Container(
height: 199.0,
child: Column(
children: <Widget>[
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
Expanded(child: Container()),
],
),
),
),
);
});
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(
Column(
children: <Widget>[
Column(),
],
),
Duration.zero,
EnginePhase.layout,
);
await tester.pumpWidget(
Column(
children: <Widget>[
Column(
children: <Widget>[
Expanded(child: Container()),
],
),
],
),
Duration.zero,
EnginePhase.layout,
);
final String message = tester.takeException().toString();
expect(message, contains('\nSee also:'));
});
testWidgets('Can set and update clipBehavior', (WidgetTester tester) async {
await tester.pumpWidget(Flex(direction: Axis.vertical));
final RenderFlex renderObject = tester.allRenderObjects.whereType<RenderFlex>().first;
expect(renderObject.clipBehavior, equals(Clip.none));
await tester.pumpWidget(Flex(direction: Axis.vertical, clipBehavior: Clip.antiAlias));
expect(renderObject.clipBehavior, equals(Clip.antiAlias));
});
}