• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright 2015 The Chromium Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5import 'package:flutter/rendering.dart';
6import '../flutter_test_alternative.dart';
7
8import 'rendering_tester.dart';
9
10// before using this, consider using RenderSizedBox from rendering_tester.dart
11class RenderTestBox extends RenderBox {
12  RenderTestBox(this._intrinsicDimensions);
13
14  final BoxConstraints _intrinsicDimensions;
15
16  @override
17  double computeMinIntrinsicWidth(double height) {
18    return _intrinsicDimensions.minWidth;
19  }
20
21  @override
22  double computeMaxIntrinsicWidth(double height) {
23    return _intrinsicDimensions.maxWidth;
24  }
25
26  @override
27  double computeMinIntrinsicHeight(double width) {
28    return _intrinsicDimensions.minHeight;
29  }
30
31  @override
32  double computeMaxIntrinsicHeight(double width) {
33    return _intrinsicDimensions.maxHeight;
34  }
35
36  @override
37  bool get sizedByParent => true;
38
39  @override
40  void performResize() {
41    size = constraints.constrain(Size(_intrinsicDimensions.minWidth + (_intrinsicDimensions.maxWidth-_intrinsicDimensions.minWidth) / 2.0,
42                                          _intrinsicDimensions.minHeight + (_intrinsicDimensions.maxHeight-_intrinsicDimensions.minHeight) / 2.0));
43  }
44}
45
46void main() {
47  test('Shrink-wrapping width', () {
48    final RenderBox child = RenderTestBox(const BoxConstraints(minWidth: 10.0, maxWidth: 100.0, minHeight: 20.0, maxHeight: 200.0));
49    final RenderBox parent = RenderIntrinsicWidth(child: child);
50    layout(parent,
51      constraints: const BoxConstraints(
52        minWidth: 5.0,
53        minHeight: 8.0,
54        maxWidth: 500.0,
55        maxHeight: 800.0,
56      ),
57    );
58    expect(parent.size.width, equals(100.0));
59    expect(parent.size.height, equals(110.0));
60
61    expect(parent.getMinIntrinsicWidth(0.0), equals(100.0));
62    expect(parent.getMaxIntrinsicWidth(0.0), equals(100.0));
63    expect(parent.getMinIntrinsicHeight(0.0), equals(20.0));
64    expect(parent.getMaxIntrinsicHeight(0.0), equals(200.0));
65
66    expect(parent.getMinIntrinsicWidth(10.0), equals(100.0));
67    expect(parent.getMaxIntrinsicWidth(10.0), equals(100.0));
68    expect(parent.getMinIntrinsicHeight(10.0), equals(20.0));
69    expect(parent.getMaxIntrinsicHeight(10.0), equals(200.0));
70
71    expect(parent.getMinIntrinsicWidth(80.0), equals(100.0));
72    expect(parent.getMaxIntrinsicWidth(80.0), equals(100.0));
73    expect(parent.getMinIntrinsicHeight(80.0), equals(20.0));
74    expect(parent.getMaxIntrinsicHeight(80.0), equals(200.0));
75
76    expect(parent.getMinIntrinsicWidth(double.infinity), equals(100.0));
77    expect(parent.getMaxIntrinsicWidth(double.infinity), equals(100.0));
78    expect(parent.getMinIntrinsicHeight(double.infinity), equals(20.0));
79    expect(parent.getMaxIntrinsicHeight(double.infinity), equals(200.0));
80  });
81
82  test('IntrinsicWidth without a child', () {
83    final RenderBox parent = RenderIntrinsicWidth();
84    layout(parent,
85      constraints: const BoxConstraints(
86        minWidth: 5.0,
87        minHeight: 8.0,
88        maxWidth: 500.0,
89        maxHeight: 800.0,
90      ),
91    );
92    expect(parent.size.width, equals(5.0));
93    expect(parent.size.height, equals(8.0));
94
95    expect(parent.getMinIntrinsicWidth(0.0), equals(0.0));
96    expect(parent.getMaxIntrinsicWidth(0.0), equals(0.0));
97    expect(parent.getMinIntrinsicHeight(0.0), equals(0.0));
98    expect(parent.getMaxIntrinsicHeight(0.0), equals(0.0));
99
100    expect(parent.getMinIntrinsicWidth(10.0), equals(0.0));
101    expect(parent.getMaxIntrinsicWidth(10.0), equals(0.0));
102    expect(parent.getMinIntrinsicHeight(10.0), equals(0.0));
103    expect(parent.getMaxIntrinsicHeight(10.0), equals(0.0));
104
105    expect(parent.getMinIntrinsicWidth(80.0), equals(0.0));
106    expect(parent.getMaxIntrinsicWidth(80.0), equals(0.0));
107    expect(parent.getMinIntrinsicHeight(80.0), equals(0.0));
108    expect(parent.getMaxIntrinsicHeight(80.0), equals(0.0));
109
110    expect(parent.getMinIntrinsicWidth(double.infinity), equals(0.0));
111    expect(parent.getMaxIntrinsicWidth(double.infinity), equals(0.0));
112    expect(parent.getMinIntrinsicHeight(double.infinity), equals(0.0));
113    expect(parent.getMaxIntrinsicHeight(double.infinity), equals(0.0));
114  });
115
116  test('Shrink-wrapping width (stepped width)', () {
117    final RenderBox child = RenderTestBox(const BoxConstraints(minWidth: 10.0, maxWidth: 100.0, minHeight: 20.0, maxHeight: 200.0));
118    final RenderBox parent = RenderIntrinsicWidth(child: child, stepWidth: 47.0);
119    layout(parent,
120      constraints: const BoxConstraints(
121        minWidth: 5.0,
122        minHeight: 8.0,
123        maxWidth: 500.0,
124        maxHeight: 800.0,
125      ),
126    );
127    expect(parent.size.width, equals(3.0 * 47.0));
128    expect(parent.size.height, equals(110.0));
129
130    expect(parent.getMinIntrinsicWidth(0.0), equals(3.0 * 47.0));
131    expect(parent.getMaxIntrinsicWidth(0.0), equals(3.0 * 47.0));
132    expect(parent.getMinIntrinsicHeight(0.0), equals(20.0));
133    expect(parent.getMaxIntrinsicHeight(0.0), equals(200.0));
134
135    expect(parent.getMinIntrinsicWidth(10.0), equals(3.0 * 47.0));
136    expect(parent.getMaxIntrinsicWidth(10.0), equals(3.0 * 47.0));
137    expect(parent.getMinIntrinsicHeight(10.0), equals(20.0));
138    expect(parent.getMaxIntrinsicHeight(10.0), equals(200.0));
139
140    expect(parent.getMinIntrinsicWidth(80.0), equals(3.0 * 47.0));
141    expect(parent.getMaxIntrinsicWidth(80.0), equals(3.0 * 47.0));
142    expect(parent.getMinIntrinsicHeight(80.0), equals(20.0));
143    expect(parent.getMaxIntrinsicHeight(80.0), equals(200.0));
144
145    expect(parent.getMinIntrinsicWidth(double.infinity), equals(3.0 * 47.0));
146    expect(parent.getMaxIntrinsicWidth(double.infinity), equals(3.0 * 47.0));
147    expect(parent.getMinIntrinsicHeight(double.infinity), equals(20.0));
148    expect(parent.getMaxIntrinsicHeight(double.infinity), equals(200.0));
149  });
150
151  test('Shrink-wrapping width (stepped height)', () {
152    final RenderBox child = RenderTestBox(const BoxConstraints(minWidth: 10.0, maxWidth: 100.0, minHeight: 20.0, maxHeight: 200.0));
153    final RenderBox parent = RenderIntrinsicWidth(child: child, stepHeight: 47.0);
154    layout(parent,
155      constraints: const BoxConstraints(
156        minWidth: 5.0,
157        minHeight: 8.0,
158        maxWidth: 500.0,
159        maxHeight: 800.0,
160      ),
161    );
162    expect(parent.size.width, equals(100.0));
163    expect(parent.size.height, equals(235.0));
164
165    expect(parent.getMinIntrinsicWidth(0.0), equals(100.0));
166    expect(parent.getMaxIntrinsicWidth(0.0), equals(100.0));
167    expect(parent.getMinIntrinsicHeight(0.0), equals(1.0 * 47.0));
168    expect(parent.getMaxIntrinsicHeight(0.0), equals(5.0 * 47.0));
169
170    expect(parent.getMinIntrinsicWidth(10.0), equals(100.0));
171    expect(parent.getMaxIntrinsicWidth(10.0), equals(100.0));
172    expect(parent.getMinIntrinsicHeight(10.0), equals(1.0 * 47.0));
173    expect(parent.getMaxIntrinsicHeight(10.0), equals(5.0 * 47.0));
174
175    expect(parent.getMinIntrinsicWidth(80.0), equals(100.0));
176    expect(parent.getMaxIntrinsicWidth(80.0), equals(100.0));
177    expect(parent.getMinIntrinsicHeight(80.0), equals(1.0 * 47.0));
178    expect(parent.getMaxIntrinsicHeight(80.0), equals(5.0 * 47.0));
179
180    expect(parent.getMinIntrinsicWidth(double.infinity), equals(100.0));
181    expect(parent.getMaxIntrinsicWidth(double.infinity), equals(100.0));
182    expect(parent.getMinIntrinsicHeight(double.infinity), equals(1.0 * 47.0));
183    expect(parent.getMaxIntrinsicHeight(double.infinity), equals(5.0 * 47.0));
184  });
185
186  test('Shrink-wrapping width (stepped everything)', () {
187    final RenderBox child = RenderTestBox(const BoxConstraints(minWidth: 10.0, maxWidth: 100.0, minHeight: 20.0, maxHeight: 200.0));
188    final RenderBox parent = RenderIntrinsicWidth(child: child, stepHeight: 47.0, stepWidth: 37.0);
189    layout(parent,
190      constraints: const BoxConstraints(
191        minWidth: 5.0,
192        minHeight: 8.0,
193        maxWidth: 500.0,
194        maxHeight: 800.0,
195      ),
196    );
197    expect(parent.size.width, equals(3.0 * 37.0));
198    expect(parent.size.height, equals(235.0));
199
200    expect(parent.getMinIntrinsicWidth(0.0), equals(3.0 * 37.0));
201    expect(parent.getMaxIntrinsicWidth(0.0), equals(3.0 * 37.0));
202    expect(parent.getMinIntrinsicHeight(0.0), equals(1.0 * 47.0));
203    expect(parent.getMaxIntrinsicHeight(0.0), equals(5.0 * 47.0));
204
205    expect(parent.getMinIntrinsicWidth(10.0), equals(3.0 * 37.0));
206    expect(parent.getMaxIntrinsicWidth(10.0), equals(3.0 * 37.0));
207    expect(parent.getMinIntrinsicHeight(10.0), equals(1.0 * 47.0));
208    expect(parent.getMaxIntrinsicHeight(10.0), equals(5.0 * 47.0));
209
210    expect(parent.getMinIntrinsicWidth(80.0), equals(3.0 * 37.0));
211    expect(parent.getMaxIntrinsicWidth(80.0), equals(3.0 * 37.0));
212    expect(parent.getMinIntrinsicHeight(80.0), equals(1.0 * 47.0));
213    expect(parent.getMaxIntrinsicHeight(80.0), equals(5.0 * 47.0));
214
215    expect(parent.getMinIntrinsicWidth(double.infinity), equals(3.0 * 37.0));
216    expect(parent.getMaxIntrinsicWidth(double.infinity), equals(3.0 * 37.0));
217    expect(parent.getMinIntrinsicHeight(double.infinity), equals(1.0 * 47.0));
218    expect(parent.getMaxIntrinsicHeight(double.infinity), equals(5.0 * 47.0));
219  });
220
221  test('Shrink-wrapping height', () {
222    final RenderBox child = RenderTestBox(const BoxConstraints(minWidth: 10.0, maxWidth: 100.0, minHeight: 20.0, maxHeight: 200.0));
223    final RenderBox parent = RenderIntrinsicHeight(child: child);
224    layout(parent,
225      constraints: const BoxConstraints(
226        minWidth: 5.0,
227        minHeight: 8.0,
228        maxWidth: 500.0,
229        maxHeight: 800.0,
230      ),
231    );
232    expect(parent.size.width, equals(55.0));
233    expect(parent.size.height, equals(200.0));
234
235    expect(parent.getMinIntrinsicWidth(0.0), equals(10.0));
236    expect(parent.getMaxIntrinsicWidth(0.0), equals(100.0));
237    expect(parent.getMinIntrinsicHeight(0.0), equals(200.0));
238    expect(parent.getMaxIntrinsicHeight(0.0), equals(200.0));
239
240    expect(parent.getMinIntrinsicWidth(10.0), equals(10.0));
241    expect(parent.getMaxIntrinsicWidth(10.0), equals(100.0));
242    expect(parent.getMinIntrinsicHeight(10.0), equals(200.0));
243    expect(parent.getMaxIntrinsicHeight(10.0), equals(200.0));
244
245    expect(parent.getMinIntrinsicWidth(80.0), equals(10.0));
246    expect(parent.getMaxIntrinsicWidth(80.0), equals(100.0));
247    expect(parent.getMinIntrinsicHeight(80.0), equals(200.0));
248    expect(parent.getMaxIntrinsicHeight(80.0), equals(200.0));
249
250    expect(parent.getMinIntrinsicWidth(double.infinity), equals(10.0));
251    expect(parent.getMaxIntrinsicWidth(double.infinity), equals(100.0));
252    expect(parent.getMinIntrinsicHeight(double.infinity), equals(200.0));
253    expect(parent.getMaxIntrinsicHeight(double.infinity), equals(200.0));
254  });
255
256  test('IntrinsicHeight without a child', () {
257    final RenderBox parent = RenderIntrinsicHeight();
258    layout(parent,
259      constraints: const BoxConstraints(
260        minWidth: 5.0,
261        minHeight: 8.0,
262        maxWidth: 500.0,
263        maxHeight: 800.0,
264      ),
265    );
266    expect(parent.size.width, equals(5.0));
267    expect(parent.size.height, equals(8.0));
268
269    expect(parent.getMinIntrinsicWidth(0.0), equals(0.0));
270    expect(parent.getMaxIntrinsicWidth(0.0), equals(0.0));
271    expect(parent.getMinIntrinsicHeight(0.0), equals(0.0));
272    expect(parent.getMaxIntrinsicHeight(0.0), equals(0.0));
273
274    expect(parent.getMinIntrinsicWidth(10.0), equals(0.0));
275    expect(parent.getMaxIntrinsicWidth(10.0), equals(0.0));
276    expect(parent.getMinIntrinsicHeight(10.0), equals(0.0));
277    expect(parent.getMaxIntrinsicHeight(10.0), equals(0.0));
278
279    expect(parent.getMinIntrinsicWidth(80.0), equals(0.0));
280    expect(parent.getMaxIntrinsicWidth(80.0), equals(0.0));
281    expect(parent.getMinIntrinsicHeight(80.0), equals(0.0));
282    expect(parent.getMaxIntrinsicHeight(80.0), equals(0.0));
283
284    expect(parent.getMinIntrinsicWidth(double.infinity), equals(0.0));
285    expect(parent.getMaxIntrinsicWidth(double.infinity), equals(0.0));
286    expect(parent.getMinIntrinsicHeight(double.infinity), equals(0.0));
287    expect(parent.getMaxIntrinsicHeight(double.infinity), equals(0.0));
288  });
289
290  test('Padding and boring intrinsics', () {
291    final RenderBox box = RenderPadding(
292      padding: const EdgeInsets.all(15.0),
293      child: RenderSizedBox(const Size(20.0, 20.0)),
294    );
295
296    expect(box.getMinIntrinsicWidth(0.0), 50.0);
297    expect(box.getMaxIntrinsicWidth(0.0), 50.0);
298    expect(box.getMinIntrinsicHeight(0.0), 50.0);
299    expect(box.getMaxIntrinsicHeight(0.0), 50.0);
300
301    expect(box.getMinIntrinsicWidth(10.0), 50.0);
302    expect(box.getMaxIntrinsicWidth(10.0), 50.0);
303    expect(box.getMinIntrinsicHeight(10.0), 50.0);
304    expect(box.getMaxIntrinsicHeight(10.0), 50.0);
305
306    expect(box.getMinIntrinsicWidth(80.0), 50.0);
307    expect(box.getMaxIntrinsicWidth(80.0), 50.0);
308    expect(box.getMinIntrinsicHeight(80.0), 50.0);
309    expect(box.getMaxIntrinsicHeight(80.0), 50.0);
310
311    expect(box.getMinIntrinsicWidth(double.infinity), 50.0);
312    expect(box.getMaxIntrinsicWidth(double.infinity), 50.0);
313    expect(box.getMinIntrinsicHeight(double.infinity), 50.0);
314    expect(box.getMaxIntrinsicHeight(double.infinity), 50.0);
315
316    // also a smoke test:
317    layout(
318      box,
319      constraints: const BoxConstraints(
320        minWidth: 10.0,
321        minHeight: 10.0,
322        maxWidth: 10.0,
323        maxHeight: 10.0,
324      ),
325    );
326  });
327
328  test('Padding and interesting intrinsics', () {
329    final RenderBox box = RenderPadding(
330      padding: const EdgeInsets.all(15.0),
331      child: RenderAspectRatio(aspectRatio: 1.0),
332    );
333
334    expect(box.getMinIntrinsicWidth(0.0), 30.0);
335    expect(box.getMaxIntrinsicWidth(0.0), 30.0);
336    expect(box.getMinIntrinsicHeight(0.0), 30.0);
337    expect(box.getMaxIntrinsicHeight(0.0), 30.0);
338
339    expect(box.getMinIntrinsicWidth(10.0), 30.0);
340    expect(box.getMaxIntrinsicWidth(10.0), 30.0);
341    expect(box.getMinIntrinsicHeight(10.0), 30.0);
342    expect(box.getMaxIntrinsicHeight(10.0), 30.0);
343
344    expect(box.getMinIntrinsicWidth(80.0), 80.0);
345    expect(box.getMaxIntrinsicWidth(80.0), 80.0);
346    expect(box.getMinIntrinsicHeight(80.0), 80.0);
347    expect(box.getMaxIntrinsicHeight(80.0), 80.0);
348
349    expect(box.getMinIntrinsicWidth(double.infinity), 30.0);
350    expect(box.getMaxIntrinsicWidth(double.infinity), 30.0);
351    expect(box.getMinIntrinsicHeight(double.infinity), 30.0);
352    expect(box.getMaxIntrinsicHeight(double.infinity), 30.0);
353
354    // also a smoke test:
355    layout(
356      box,
357      constraints: const BoxConstraints(
358        minWidth: 10.0,
359        minHeight: 10.0,
360        maxWidth: 10.0,
361        maxHeight: 10.0,
362      ),
363    );
364  });
365
366  test('Padding and boring intrinsics', () {
367    final RenderBox box = RenderPadding(
368      padding: const EdgeInsets.all(15.0),
369      child: RenderSizedBox(const Size(20.0, 20.0)),
370    );
371
372    expect(box.getMinIntrinsicWidth(0.0), 50.0);
373    expect(box.getMaxIntrinsicWidth(0.0), 50.0);
374    expect(box.getMinIntrinsicHeight(0.0), 50.0);
375    expect(box.getMaxIntrinsicHeight(0.0), 50.0);
376
377    expect(box.getMinIntrinsicWidth(10.0), 50.0);
378    expect(box.getMaxIntrinsicWidth(10.0), 50.0);
379    expect(box.getMinIntrinsicHeight(10.0), 50.0);
380    expect(box.getMaxIntrinsicHeight(10.0), 50.0);
381
382    expect(box.getMinIntrinsicWidth(80.0), 50.0);
383    expect(box.getMaxIntrinsicWidth(80.0), 50.0);
384    expect(box.getMinIntrinsicHeight(80.0), 50.0);
385    expect(box.getMaxIntrinsicHeight(80.0), 50.0);
386
387    expect(box.getMinIntrinsicWidth(double.infinity), 50.0);
388    expect(box.getMaxIntrinsicWidth(double.infinity), 50.0);
389    expect(box.getMinIntrinsicHeight(double.infinity), 50.0);
390    expect(box.getMaxIntrinsicHeight(double.infinity), 50.0);
391
392    // also a smoke test:
393    layout(
394      box,
395      constraints: const BoxConstraints(
396        minWidth: 10.0,
397        minHeight: 10.0,
398        maxWidth: 10.0,
399        maxHeight: 10.0,
400      ),
401    );
402  });
403
404  test('Padding and interesting intrinsics', () {
405    final RenderBox box = RenderPadding(
406      padding: const EdgeInsets.all(15.0),
407      child: RenderAspectRatio(aspectRatio: 1.0),
408    );
409
410    expect(box.getMinIntrinsicWidth(0.0), 30.0);
411    expect(box.getMaxIntrinsicWidth(0.0), 30.0);
412    expect(box.getMinIntrinsicHeight(0.0), 30.0);
413    expect(box.getMaxIntrinsicHeight(0.0), 30.0);
414
415    expect(box.getMinIntrinsicWidth(10.0), 30.0);
416    expect(box.getMaxIntrinsicWidth(10.0), 30.0);
417    expect(box.getMinIntrinsicHeight(10.0), 30.0);
418    expect(box.getMaxIntrinsicHeight(10.0), 30.0);
419
420    expect(box.getMinIntrinsicWidth(80.0), 80.0);
421    expect(box.getMaxIntrinsicWidth(80.0), 80.0);
422    expect(box.getMinIntrinsicHeight(80.0), 80.0);
423    expect(box.getMaxIntrinsicHeight(80.0), 80.0);
424
425    expect(box.getMinIntrinsicWidth(double.infinity), 30.0);
426    expect(box.getMaxIntrinsicWidth(double.infinity), 30.0);
427    expect(box.getMinIntrinsicHeight(double.infinity), 30.0);
428    expect(box.getMaxIntrinsicHeight(double.infinity), 30.0);
429
430    // also a smoke test:
431    layout(
432      box,
433      constraints: const BoxConstraints(
434        minWidth: 10.0,
435        minHeight: 10.0,
436        maxWidth: 10.0,
437        maxHeight: 10.0,
438      ),
439    );
440  });
441}
442