• 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 'dart:ui' show Brightness;
6import 'package:flutter_test/flutter_test.dart';
7import 'package:flutter/widgets.dart';
8
9void main() {
10  testWidgets('MediaQuery does not have a default', (WidgetTester tester) async {
11    bool tested = false;
12    await tester.pumpWidget(
13      Builder(
14        builder: (BuildContext context) {
15          tested = true;
16          MediaQuery.of(context); // should throw
17          return Container();
18        }
19      )
20    );
21    expect(tested, isTrue);
22    expect(tester.takeException(), isFlutterError);
23  });
24
25  testWidgets('MediaQuery defaults to null', (WidgetTester tester) async {
26    bool tested = false;
27    await tester.pumpWidget(
28      Builder(
29        builder: (BuildContext context) {
30          final MediaQueryData data = MediaQuery.of(context, nullOk: true);
31          expect(data, isNull);
32          tested = true;
33          return Container();
34        }
35      )
36    );
37    expect(tested, isTrue);
38  });
39
40  testWidgets('MediaQueryData is sane', (WidgetTester tester) async {
41    final MediaQueryData data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
42    expect(data, hasOneLineDescription);
43    expect(data.hashCode, equals(data.copyWith().hashCode));
44    expect(data.size, equals(WidgetsBinding.instance.window.physicalSize / WidgetsBinding.instance.window.devicePixelRatio));
45    expect(data.accessibleNavigation, false);
46    expect(data.invertColors, false);
47    expect(data.disableAnimations, false);
48    expect(data.boldText, false);
49    expect(data.platformBrightness, Brightness.light);
50    expect(data.physicalDepth, equals(WidgetsBinding.instance.window.physicalDepth));
51  });
52
53  testWidgets('MediaQueryData.copyWith defaults to source', (WidgetTester tester) async {
54    final MediaQueryData data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
55    final MediaQueryData copied = data.copyWith();
56    expect(copied.size, data.size);
57    expect(copied.devicePixelRatio, data.devicePixelRatio);
58    expect(copied.textScaleFactor, data.textScaleFactor);
59    expect(copied.padding, data.padding);
60    expect(copied.viewPadding, data.viewPadding);
61    expect(copied.viewInsets, data.viewInsets);
62    expect(copied.physicalDepth, data.physicalDepth);
63    expect(copied.alwaysUse24HourFormat, data.alwaysUse24HourFormat);
64    expect(copied.accessibleNavigation, data.accessibleNavigation);
65    expect(copied.invertColors, data.invertColors);
66    expect(copied.disableAnimations, data.disableAnimations);
67    expect(copied.boldText, data.boldText);
68    expect(copied.platformBrightness, data.platformBrightness);
69  });
70
71  testWidgets('MediaQuery.copyWith copies specified values', (WidgetTester tester) async {
72    final MediaQueryData data = MediaQueryData.fromWindow(WidgetsBinding.instance.window);
73    final MediaQueryData copied = data.copyWith(
74      size: const Size(3.14, 2.72),
75      devicePixelRatio: 1.41,
76      textScaleFactor: 1.62,
77      padding: const EdgeInsets.all(9.10938),
78      viewPadding: const EdgeInsets.all(11.24031),
79      viewInsets: const EdgeInsets.all(1.67262),
80      physicalDepth: 120.0,
81      alwaysUse24HourFormat: true,
82      accessibleNavigation: true,
83      invertColors: true,
84      disableAnimations: true,
85      boldText: true,
86      platformBrightness: Brightness.dark,
87    );
88    expect(copied.size, const Size(3.14, 2.72));
89    expect(copied.devicePixelRatio, 1.41);
90    expect(copied.textScaleFactor, 1.62);
91    expect(copied.padding, const EdgeInsets.all(9.10938));
92    expect(copied.viewPadding, const EdgeInsets.all(11.24031));
93    expect(copied.viewInsets, const EdgeInsets.all(1.67262));
94    expect(copied.physicalDepth, 120.0);
95    expect(copied.alwaysUse24HourFormat, true);
96    expect(copied.accessibleNavigation, true);
97    expect(copied.invertColors, true);
98    expect(copied.disableAnimations, true);
99    expect(copied.boldText, true);
100    expect(copied.platformBrightness, Brightness.dark);
101  });
102
103  testWidgets('MediaQuery.removePadding removes specified padding', (WidgetTester tester) async {
104    const Size size = Size(2.0, 4.0);
105    const double devicePixelRatio = 2.0;
106    const double textScaleFactor = 1.2;
107    const EdgeInsets padding = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);
108    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
109    const EdgeInsets viewInsets = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);
110
111    MediaQueryData unpadded;
112    await tester.pumpWidget(
113      MediaQuery(
114        data: const MediaQueryData(
115          size: size,
116          devicePixelRatio: devicePixelRatio,
117          textScaleFactor: textScaleFactor,
118          padding: padding,
119          viewPadding: viewPadding,
120          viewInsets: viewInsets,
121          alwaysUse24HourFormat: true,
122          accessibleNavigation: true,
123          invertColors: true,
124          disableAnimations: true,
125          boldText: true,
126        ),
127        child: Builder(
128          builder: (BuildContext context) {
129            return MediaQuery.removePadding(
130              context: context,
131              removeLeft: true,
132              removeTop: true,
133              removeRight: true,
134              removeBottom: true,
135              child: Builder(
136                builder: (BuildContext context) {
137                  unpadded = MediaQuery.of(context);
138                  return Container();
139                }
140              ),
141            );
142          },
143        ),
144      )
145    );
146
147    expect(unpadded.size, size);
148    expect(unpadded.devicePixelRatio, devicePixelRatio);
149    expect(unpadded.textScaleFactor, textScaleFactor);
150    expect(unpadded.padding, EdgeInsets.zero);
151    expect(unpadded.viewPadding, viewInsets);
152    expect(unpadded.viewInsets, viewInsets);
153    expect(unpadded.alwaysUse24HourFormat, true);
154    expect(unpadded.accessibleNavigation, true);
155    expect(unpadded.invertColors, true);
156    expect(unpadded.disableAnimations, true);
157    expect(unpadded.boldText, true);
158  });
159
160  testWidgets('MediaQuery.removeViewInsets removes specified viewInsets', (WidgetTester tester) async {
161    const Size size = Size(2.0, 4.0);
162    const double devicePixelRatio = 2.0;
163    const double textScaleFactor = 1.2;
164    const EdgeInsets padding = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);
165    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
166    const EdgeInsets viewInsets = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);
167
168    MediaQueryData unpadded;
169    await tester.pumpWidget(
170      MediaQuery(
171        data: const MediaQueryData(
172          size: size,
173          devicePixelRatio: devicePixelRatio,
174          textScaleFactor: textScaleFactor,
175          padding: padding,
176          viewPadding : viewPadding,
177          viewInsets: viewInsets,
178          alwaysUse24HourFormat: true,
179          accessibleNavigation: true,
180          invertColors: true,
181          disableAnimations: true,
182          boldText: true,
183        ),
184        child: Builder(
185          builder: (BuildContext context) {
186            return MediaQuery.removeViewInsets(
187              context: context,
188              removeLeft: true,
189              removeTop: true,
190              removeRight: true,
191              removeBottom: true,
192              child: Builder(
193                builder: (BuildContext context) {
194                  unpadded = MediaQuery.of(context);
195                  return Container();
196                }
197              ),
198            );
199          },
200        ),
201      )
202    );
203
204    expect(unpadded.size, size);
205    expect(unpadded.devicePixelRatio, devicePixelRatio);
206    expect(unpadded.textScaleFactor, textScaleFactor);
207    expect(unpadded.padding, padding);
208    expect(unpadded.viewPadding, padding);
209    expect(unpadded.viewInsets, EdgeInsets.zero);
210    expect(unpadded.alwaysUse24HourFormat, true);
211    expect(unpadded.accessibleNavigation, true);
212    expect(unpadded.invertColors, true);
213    expect(unpadded.disableAnimations, true);
214    expect(unpadded.boldText, true);
215  });
216
217  testWidgets('MediaQuery.removeViewPadding removes specified viewPadding', (WidgetTester tester) async {
218    const Size size = Size(2.0, 4.0);
219    const double devicePixelRatio = 2.0;
220    const double textScaleFactor = 1.2;
221    const EdgeInsets padding = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);
222    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
223    const EdgeInsets viewInsets = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);
224
225    MediaQueryData unpadded;
226    await tester.pumpWidget(
227      MediaQuery(
228        data: const MediaQueryData(
229          size: size,
230          devicePixelRatio: devicePixelRatio,
231          textScaleFactor: textScaleFactor,
232          padding: padding,
233          viewPadding : viewPadding,
234          viewInsets: viewInsets,
235          alwaysUse24HourFormat: true,
236          accessibleNavigation: true,
237          invertColors: true,
238          disableAnimations: true,
239          boldText: true,
240        ),
241        child: Builder(
242          builder: (BuildContext context) {
243            return MediaQuery.removeViewPadding(
244              context: context,
245              removeLeft: true,
246              removeTop: true,
247              removeRight: true,
248              removeBottom: true,
249              child: Builder(
250                builder: (BuildContext context) {
251                  unpadded = MediaQuery.of(context);
252                  return Container();
253                }
254              ),
255            );
256          },
257        ),
258      )
259    );
260
261    expect(unpadded.size, size);
262    expect(unpadded.devicePixelRatio, devicePixelRatio);
263    expect(unpadded.textScaleFactor, textScaleFactor);
264    expect(unpadded.padding, EdgeInsets.zero);
265    expect(unpadded.viewPadding, EdgeInsets.zero);
266    expect(unpadded.viewInsets, viewInsets);
267    expect(unpadded.alwaysUse24HourFormat, true);
268    expect(unpadded.accessibleNavigation, true);
269    expect(unpadded.invertColors, true);
270    expect(unpadded.disableAnimations, true);
271    expect(unpadded.boldText, true);
272  });
273
274  testWidgets('MediaQuery.textScaleFactorOf', (WidgetTester tester) async {
275    double outsideTextScaleFactor;
276    double insideTextScaleFactor;
277
278    await tester.pumpWidget(
279      Builder(
280        builder: (BuildContext context) {
281          outsideTextScaleFactor = MediaQuery.textScaleFactorOf(context);
282          return MediaQuery(
283            data: const MediaQueryData(
284              textScaleFactor: 4.0,
285            ),
286            child: Builder(
287              builder: (BuildContext context) {
288                insideTextScaleFactor = MediaQuery.textScaleFactorOf(context);
289                return Container();
290              },
291            ),
292          );
293        },
294      ),
295    );
296
297    expect(outsideTextScaleFactor, 1.0);
298    expect(insideTextScaleFactor, 4.0);
299  });
300
301  testWidgets('MediaQuery.platformBrightnessOf', (WidgetTester tester) async {
302    Brightness outsideBrightness;
303    Brightness insideBrightness;
304
305    await tester.pumpWidget(
306      Builder(
307        builder: (BuildContext context) {
308          outsideBrightness = MediaQuery.platformBrightnessOf(context);
309          return MediaQuery(
310            data: const MediaQueryData(
311              platformBrightness: Brightness.dark,
312            ),
313            child: Builder(
314              builder: (BuildContext context) {
315                insideBrightness = MediaQuery.platformBrightnessOf(context);
316                return Container();
317              },
318            ),
319          );
320        },
321      ),
322    );
323
324    expect(outsideBrightness, Brightness.light);
325    expect(insideBrightness, Brightness.dark);
326  });
327
328  testWidgets('MediaQuery.boldTextOverride', (WidgetTester tester) async {
329    bool outsideBoldTextOverride;
330    bool insideBoldTextOverride;
331
332    await tester.pumpWidget(
333      Builder(
334        builder: (BuildContext context) {
335          outsideBoldTextOverride = MediaQuery.boldTextOverride(context);
336          return MediaQuery(
337            data: const MediaQueryData(
338              boldText: true,
339            ),
340            child: Builder(
341              builder: (BuildContext context) {
342                insideBoldTextOverride = MediaQuery.boldTextOverride(context);
343                return Container();
344              },
345            ),
346          );
347        },
348      ),
349    );
350
351    expect(outsideBoldTextOverride, false);
352    expect(insideBoldTextOverride, true);
353  });
354}
355