media_query_test.dart 24.8 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
import 'dart:ui' show Brightness;
6

7
import 'package:flutter/gestures.dart';
8
import 'package:flutter/widgets.dart';
9
import 'package:flutter_test/flutter_test.dart';
10 11

void main() {
12 13 14
  testWidgets('MediaQuery does not have a default', (WidgetTester tester) async {
    bool tested = false;
    await tester.pumpWidget(
15
      Builder(
16 17 18
        builder: (BuildContext context) {
          tested = true;
          MediaQuery.of(context); // should throw
19
          return Container();
20 21
        },
      ),
22 23
    );
    expect(tested, isTrue);
24 25 26
    final dynamic exception = tester.takeException();
    expect(exception, isNotNull);
    expect(exception ,isFlutterError);
27
    final FlutterError error = exception as FlutterError;
28 29
    expect(error.diagnostics.length, 5);
    expect(error.diagnostics.last, isA<ErrorHint>());
30 31 32 33
    expect(
      error.toStringDeep(),
      equalsIgnoringHashCodes(
        'FlutterError\n'
34 35 36 37 38 39 40
        '   No MediaQuery widget ancestor found.\n'
        '   Builder widgets require a MediaQuery widget ancestor.\n'
        '   The specific widget that could not find a MediaQuery ancestor\n'
        '   was:\n'
        '     Builder\n'
        '   The ownership chain for the affected widget is: "Builder ←\n'
        '     [root]"\n'
41 42
        '   No MediaQuery ancestor could be found starting from the context\n'
        '   that was passed to MediaQuery.of(). This can happen because you\n'
43 44
        '   have not added a WidgetsApp, CupertinoApp, or MaterialApp widget\n'
        '   (those widgets introduce a MediaQuery), or it can happen if the\n'
45
        '   context you use comes from a widget above those widgets.\n',
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
  testWidgets('MediaQuery.of finds a MediaQueryData when there is one', (WidgetTester tester) async {
    bool tested = false;
    await tester.pumpWidget(
      MediaQuery(
        data: const MediaQueryData(),
        child: Builder(
          builder: (BuildContext context) {
            final MediaQueryData data = MediaQuery.of(context);
            expect(data, isNotNull);
            tested = true;
            return Container();
          },
        ),
      ),
    );
    final dynamic exception = tester.takeException();
    expect(exception, isNull);
    expect(tested, isTrue);
  });

  testWidgets('MediaQuery.maybeOf defaults to null', (WidgetTester tester) async {
71
    bool tested = false;
72
    await tester.pumpWidget(
73
      Builder(
74
        builder: (BuildContext context) {
75
          final MediaQueryData? data = MediaQuery.maybeOf(context);
76 77
          expect(data, isNull);
          tested = true;
78
          return Container();
79 80
        },
      ),
81
    );
82 83
    expect(tested, isTrue);
  });
84

85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103
  testWidgets('MediaQuery.maybeOf finds a MediaQueryData when there is one', (WidgetTester tester) async {
    bool tested = false;
    await tester.pumpWidget(
      MediaQuery(
        data: const MediaQueryData(),
        child: Builder(
          builder: (BuildContext context) {
            final MediaQueryData? data = MediaQuery.maybeOf(context);
            expect(data, isNotNull);
            tested = true;
            return Container();
          },
        ),
      ),
    );
    expect(tested, isTrue);
  });

  testWidgets('MediaQueryData.fromWindow is sane', (WidgetTester tester) async {
104
    final MediaQueryData data = MediaQueryData.fromWindow(WidgetsBinding.instance!.window);
105 106
    expect(data, hasOneLineDescription);
    expect(data.hashCode, equals(data.copyWith().hashCode));
107
    expect(data.size, equals(WidgetsBinding.instance!.window.physicalSize / WidgetsBinding.instance!.window.devicePixelRatio));
108 109 110
    expect(data.accessibleNavigation, false);
    expect(data.invertColors, false);
    expect(data.disableAnimations, false);
111
    expect(data.boldText, false);
112
    expect(data.highContrast, false);
113
    expect(data.platformBrightness, Brightness.light);
114
    expect(data.gestureSettings.touchSlop, null);
115
  });
116 117

  testWidgets('MediaQueryData.copyWith defaults to source', (WidgetTester tester) async {
118
    final MediaQueryData data = MediaQueryData.fromWindow(WidgetsBinding.instance!.window);
119 120 121 122 123
    final MediaQueryData copied = data.copyWith();
    expect(copied.size, data.size);
    expect(copied.devicePixelRatio, data.devicePixelRatio);
    expect(copied.textScaleFactor, data.textScaleFactor);
    expect(copied.padding, data.padding);
124
    expect(copied.viewPadding, data.viewPadding);
125
    expect(copied.viewInsets, data.viewInsets);
126
    expect(copied.systemGestureInsets, data.systemGestureInsets);
127
    expect(copied.alwaysUse24HourFormat, data.alwaysUse24HourFormat);
128 129 130
    expect(copied.accessibleNavigation, data.accessibleNavigation);
    expect(copied.invertColors, data.invertColors);
    expect(copied.disableAnimations, data.disableAnimations);
131
    expect(copied.boldText, data.boldText);
132
    expect(copied.highContrast, data.highContrast);
133
    expect(copied.platformBrightness, data.platformBrightness);
134
    expect(copied.gestureSettings, data.gestureSettings);
135 136 137
  });

  testWidgets('MediaQuery.copyWith copies specified values', (WidgetTester tester) async {
138 139 140 141 142 143 144 145 146
    // Random and unique double values are used to ensure that the correct
    // values are copied over exactly
    const Size customSize = Size(3.14, 2.72);
    const double customDevicePixelRatio = 1.41;
    const double customTextScaleFactor = 1.62;
    const EdgeInsets customPadding = EdgeInsets.all(9.10938);
    const EdgeInsets customViewPadding = EdgeInsets.all(11.24031);
    const EdgeInsets customViewInsets = EdgeInsets.all(1.67262);
    const EdgeInsets customSystemGestureInsets = EdgeInsets.all(1.5556);
147
    const DeviceGestureSettings gestureSettings = DeviceGestureSettings(touchSlop: 8.0);
148

149
    final MediaQueryData data = MediaQueryData.fromWindow(WidgetsBinding.instance!.window);
150
    final MediaQueryData copied = data.copyWith(
151 152 153 154 155 156 157
      size: customSize,
      devicePixelRatio: customDevicePixelRatio,
      textScaleFactor: customTextScaleFactor,
      padding: customPadding,
      viewPadding: customViewPadding,
      viewInsets: customViewInsets,
      systemGestureInsets: customSystemGestureInsets,
158
      alwaysUse24HourFormat: true,
159 160 161
      accessibleNavigation: true,
      invertColors: true,
      disableAnimations: true,
162
      boldText: true,
163
      highContrast: true,
164
      platformBrightness: Brightness.dark,
165
      gestureSettings: gestureSettings,
166
    );
167 168 169 170 171 172 173
    expect(copied.size, customSize);
    expect(copied.devicePixelRatio, customDevicePixelRatio);
    expect(copied.textScaleFactor, customTextScaleFactor);
    expect(copied.padding, customPadding);
    expect(copied.viewPadding, customViewPadding);
    expect(copied.viewInsets, customViewInsets);
    expect(copied.systemGestureInsets, customSystemGestureInsets);
174
    expect(copied.alwaysUse24HourFormat, true);
175 176 177
    expect(copied.accessibleNavigation, true);
    expect(copied.invertColors, true);
    expect(copied.disableAnimations, true);
178
    expect(copied.boldText, true);
179
    expect(copied.highContrast, true);
180
    expect(copied.platformBrightness, Brightness.dark);
181
    expect(copied.gestureSettings, gestureSettings);
182
  });
183

184 185 186 187 188
  testWidgets('MediaQuery.removePadding removes specified padding', (WidgetTester tester) async {
    const Size size = Size(2.0, 4.0);
    const double devicePixelRatio = 2.0;
    const double textScaleFactor = 1.2;
    const EdgeInsets padding = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);
189
    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
190 191
    const EdgeInsets viewInsets = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);

192
    late MediaQueryData unpadded;
193 194 195 196 197 198 199
    await tester.pumpWidget(
      MediaQuery(
        data: const MediaQueryData(
          size: size,
          devicePixelRatio: devicePixelRatio,
          textScaleFactor: textScaleFactor,
          padding: padding,
200
          viewPadding: viewPadding,
201 202 203 204 205 206
          viewInsets: viewInsets,
          alwaysUse24HourFormat: true,
          accessibleNavigation: true,
          invertColors: true,
          disableAnimations: true,
          boldText: true,
207
          highContrast: true,
208 209 210 211 212 213 214 215 216 217 218
        ),
        child: Builder(
          builder: (BuildContext context) {
            return MediaQuery.removePadding(
              context: context,
              removeLeft: true,
              removeTop: true,
              removeRight: true,
              removeBottom: true,
              child: Builder(
                builder: (BuildContext context) {
219
                  unpadded = MediaQuery.of(context);
220
                  return Container();
221
                },
222 223 224 225
              ),
            );
          },
        ),
226
      ),
227 228 229 230 231 232
    );

    expect(unpadded.size, size);
    expect(unpadded.devicePixelRatio, devicePixelRatio);
    expect(unpadded.textScaleFactor, textScaleFactor);
    expect(unpadded.padding, EdgeInsets.zero);
233
    expect(unpadded.viewPadding, viewInsets);
234 235 236 237 238 239
    expect(unpadded.viewInsets, viewInsets);
    expect(unpadded.alwaysUse24HourFormat, true);
    expect(unpadded.accessibleNavigation, true);
    expect(unpadded.invertColors, true);
    expect(unpadded.disableAnimations, true);
    expect(unpadded.boldText, true);
240
    expect(unpadded.highContrast, true);
241
  });
242

243 244 245 246 247 248 249 250
  testWidgets('MediaQuery.removePadding only removes specified padding', (WidgetTester tester) async {
    const Size size = Size(2.0, 4.0);
    const double devicePixelRatio = 2.0;
    const double textScaleFactor = 1.2;
    const EdgeInsets padding = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);
    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
    const EdgeInsets viewInsets = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);

251
    late MediaQueryData unpadded;
252 253 254 255 256 257 258 259 260 261 262 263 264 265
    await tester.pumpWidget(
      MediaQuery(
        data: const MediaQueryData(
          size: size,
          devicePixelRatio: devicePixelRatio,
          textScaleFactor: textScaleFactor,
          padding: padding,
          viewPadding: viewPadding,
          viewInsets: viewInsets,
          alwaysUse24HourFormat: true,
          accessibleNavigation: true,
          invertColors: true,
          disableAnimations: true,
          boldText: true,
266
          highContrast: true,
267 268 269 270 271 272 273 274
        ),
        child: Builder(
          builder: (BuildContext context) {
            return MediaQuery.removePadding(
              removeTop: true,
              context: context,
              child: Builder(
                builder: (BuildContext context) {
275
                  unpadded = MediaQuery.of(context);
276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295
                  return Container();
                },
              ),
            );
          },
        ),
      ),
    );

    expect(unpadded.size, size);
    expect(unpadded.devicePixelRatio, devicePixelRatio);
    expect(unpadded.textScaleFactor, textScaleFactor);
    expect(unpadded.padding, padding.copyWith(top: 0));
    expect(unpadded.viewPadding, viewPadding.copyWith(top: viewInsets.top));
    expect(unpadded.viewInsets, viewInsets);
    expect(unpadded.alwaysUse24HourFormat, true);
    expect(unpadded.accessibleNavigation, true);
    expect(unpadded.invertColors, true);
    expect(unpadded.disableAnimations, true);
    expect(unpadded.boldText, true);
296
    expect(unpadded.highContrast, true);
297 298
  });

299
  testWidgets('MediaQuery.removeViewInsets removes specified viewInsets', (WidgetTester tester) async {
300
    const Size size = Size(2.0, 4.0);
301 302
    const double devicePixelRatio = 2.0;
    const double textScaleFactor = 1.2;
303
    const EdgeInsets padding = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);
304
    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
305
    const EdgeInsets viewInsets = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);
306

307
    late MediaQueryData unpadded;
308
    await tester.pumpWidget(
309
      MediaQuery(
310 311 312 313 314
        data: const MediaQueryData(
          size: size,
          devicePixelRatio: devicePixelRatio,
          textScaleFactor: textScaleFactor,
          padding: padding,
315
          viewPadding: viewPadding,
316 317
          viewInsets: viewInsets,
          alwaysUse24HourFormat: true,
318 319 320
          accessibleNavigation: true,
          invertColors: true,
          disableAnimations: true,
321
          boldText: true,
322
          highContrast: true,
323
        ),
324
        child: Builder(
325
          builder: (BuildContext context) {
326
            return MediaQuery.removeViewInsets(
327 328 329 330 331
              context: context,
              removeLeft: true,
              removeTop: true,
              removeRight: true,
              removeBottom: true,
332
              child: Builder(
333
                builder: (BuildContext context) {
334
                  unpadded = MediaQuery.of(context);
335
                  return Container();
336
                },
337 338 339 340
              ),
            );
          },
        ),
341
      ),
342 343 344 345 346 347
    );

    expect(unpadded.size, size);
    expect(unpadded.devicePixelRatio, devicePixelRatio);
    expect(unpadded.textScaleFactor, textScaleFactor);
    expect(unpadded.padding, padding);
348
    expect(unpadded.viewPadding, padding);
349 350
    expect(unpadded.viewInsets, EdgeInsets.zero);
    expect(unpadded.alwaysUse24HourFormat, true);
351 352 353
    expect(unpadded.accessibleNavigation, true);
    expect(unpadded.invertColors, true);
    expect(unpadded.disableAnimations, true);
354
    expect(unpadded.boldText, true);
355
    expect(unpadded.highContrast, true);
356
  });
357

358 359 360 361 362 363 364 365
  testWidgets('MediaQuery.removeViewInsets removes only specified viewInsets', (WidgetTester tester) async {
    const Size size = Size(2.0, 4.0);
    const double devicePixelRatio = 2.0;
    const double textScaleFactor = 1.2;
    const EdgeInsets padding = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);
    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
    const EdgeInsets viewInsets = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);

366
    late MediaQueryData unpadded;
367 368 369 370 371 372 373 374 375 376 377 378 379 380
    await tester.pumpWidget(
      MediaQuery(
        data: const MediaQueryData(
          size: size,
          devicePixelRatio: devicePixelRatio,
          textScaleFactor: textScaleFactor,
          padding: padding,
          viewPadding: viewPadding,
          viewInsets: viewInsets,
          alwaysUse24HourFormat: true,
          accessibleNavigation: true,
          invertColors: true,
          disableAnimations: true,
          boldText: true,
381
          highContrast: true,
382 383 384 385 386 387 388 389
        ),
        child: Builder(
          builder: (BuildContext context) {
            return MediaQuery.removeViewInsets(
              context: context,
              removeBottom: true,
              child: Builder(
                builder: (BuildContext context) {
390
                  unpadded = MediaQuery.of(context);
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410
                  return Container();
                },
              ),
            );
          },
        ),
      ),
    );

    expect(unpadded.size, size);
    expect(unpadded.devicePixelRatio, devicePixelRatio);
    expect(unpadded.textScaleFactor, textScaleFactor);
    expect(unpadded.padding, padding);
    expect(unpadded.viewPadding, viewPadding.copyWith(bottom: 8));
    expect(unpadded.viewInsets, viewInsets.copyWith(bottom: 0));
    expect(unpadded.alwaysUse24HourFormat, true);
    expect(unpadded.accessibleNavigation, true);
    expect(unpadded.invertColors, true);
    expect(unpadded.disableAnimations, true);
    expect(unpadded.boldText, true);
411
    expect(unpadded.highContrast, true);
412 413
  });

414 415 416 417 418 419 420 421
  testWidgets('MediaQuery.removeViewPadding removes specified viewPadding', (WidgetTester tester) async {
    const Size size = Size(2.0, 4.0);
    const double devicePixelRatio = 2.0;
    const double textScaleFactor = 1.2;
    const EdgeInsets padding = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);
    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
    const EdgeInsets viewInsets = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);

422
    late MediaQueryData unpadded;
423 424 425 426 427 428 429
    await tester.pumpWidget(
      MediaQuery(
        data: const MediaQueryData(
          size: size,
          devicePixelRatio: devicePixelRatio,
          textScaleFactor: textScaleFactor,
          padding: padding,
430
          viewPadding: viewPadding,
431 432 433 434 435 436
          viewInsets: viewInsets,
          alwaysUse24HourFormat: true,
          accessibleNavigation: true,
          invertColors: true,
          disableAnimations: true,
          boldText: true,
437
          highContrast: true,
438 439 440 441 442 443 444 445 446 447 448
        ),
        child: Builder(
          builder: (BuildContext context) {
            return MediaQuery.removeViewPadding(
              context: context,
              removeLeft: true,
              removeTop: true,
              removeRight: true,
              removeBottom: true,
              child: Builder(
                builder: (BuildContext context) {
449
                  unpadded = MediaQuery.of(context);
450
                  return Container();
451
                },
452 453 454 455
              ),
            );
          },
        ),
456
      ),
457 458 459 460 461 462 463 464 465 466 467 468 469
    );

    expect(unpadded.size, size);
    expect(unpadded.devicePixelRatio, devicePixelRatio);
    expect(unpadded.textScaleFactor, textScaleFactor);
    expect(unpadded.padding, EdgeInsets.zero);
    expect(unpadded.viewPadding, EdgeInsets.zero);
    expect(unpadded.viewInsets, viewInsets);
    expect(unpadded.alwaysUse24HourFormat, true);
    expect(unpadded.accessibleNavigation, true);
    expect(unpadded.invertColors, true);
    expect(unpadded.disableAnimations, true);
    expect(unpadded.boldText, true);
470
    expect(unpadded.highContrast, true);
471 472
  });

473 474 475 476 477 478 479 480
  testWidgets('MediaQuery.removeViewPadding removes only specified viewPadding', (WidgetTester tester) async {
    const Size size = Size(2.0, 4.0);
    const double devicePixelRatio = 2.0;
    const double textScaleFactor = 1.2;
    const EdgeInsets padding = EdgeInsets.only(top: 5.0, right: 6.0, left: 7.0, bottom: 8.0);
    const EdgeInsets viewPadding = EdgeInsets.only(top: 6.0, right: 8.0, left: 10.0, bottom: 12.0);
    const EdgeInsets viewInsets = EdgeInsets.only(top: 1.0, right: 2.0, left: 3.0, bottom: 4.0);

481
    late MediaQueryData unpadded;
482 483 484 485 486 487 488 489 490 491 492 493 494 495
    await tester.pumpWidget(
      MediaQuery(
        data: const MediaQueryData(
          size: size,
          devicePixelRatio: devicePixelRatio,
          textScaleFactor: textScaleFactor,
          padding: padding,
          viewPadding: viewPadding,
          viewInsets: viewInsets,
          alwaysUse24HourFormat: true,
          accessibleNavigation: true,
          invertColors: true,
          disableAnimations: true,
          boldText: true,
496
          highContrast: true,
497 498 499 500 501 502 503 504
        ),
        child: Builder(
          builder: (BuildContext context) {
            return MediaQuery.removeViewPadding(
              context: context,
              removeLeft: true,
              child: Builder(
                builder: (BuildContext context) {
505
                  unpadded = MediaQuery.of(context);
506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525
                  return Container();
                },
              ),
            );
          },
        ),
      ),
    );

    expect(unpadded.size, size);
    expect(unpadded.devicePixelRatio, devicePixelRatio);
    expect(unpadded.textScaleFactor, textScaleFactor);
    expect(unpadded.padding, padding.copyWith(left: 0));
    expect(unpadded.viewPadding, viewPadding.copyWith(left: 0));
    expect(unpadded.viewInsets, viewInsets);
    expect(unpadded.alwaysUse24HourFormat, true);
    expect(unpadded.accessibleNavigation, true);
    expect(unpadded.invertColors, true);
    expect(unpadded.disableAnimations, true);
    expect(unpadded.boldText, true);
526
    expect(unpadded.highContrast, true);
527 528
  });

529
  testWidgets('MediaQuery.textScaleFactorOf', (WidgetTester tester) async {
530 531
    late double outsideTextScaleFactor;
    late double insideTextScaleFactor;
532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554

    await tester.pumpWidget(
      Builder(
        builder: (BuildContext context) {
          outsideTextScaleFactor = MediaQuery.textScaleFactorOf(context);
          return MediaQuery(
            data: const MediaQueryData(
              textScaleFactor: 4.0,
            ),
            child: Builder(
              builder: (BuildContext context) {
                insideTextScaleFactor = MediaQuery.textScaleFactorOf(context);
                return Container();
              },
            ),
          );
        },
      ),
    );

    expect(outsideTextScaleFactor, 1.0);
    expect(insideTextScaleFactor, 4.0);
  });
555

556
  testWidgets('MediaQuery.platformBrightnessOf', (WidgetTester tester) async {
557 558
    late Brightness outsideBrightness;
    late Brightness insideBrightness;
559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582

    await tester.pumpWidget(
      Builder(
        builder: (BuildContext context) {
          outsideBrightness = MediaQuery.platformBrightnessOf(context);
          return MediaQuery(
            data: const MediaQueryData(
              platformBrightness: Brightness.dark,
            ),
            child: Builder(
              builder: (BuildContext context) {
                insideBrightness = MediaQuery.platformBrightnessOf(context);
                return Container();
              },
            ),
          );
        },
      ),
    );

    expect(outsideBrightness, Brightness.light);
    expect(insideBrightness, Brightness.dark);
  });

583
  testWidgets('MediaQuery.highContrastOf', (WidgetTester tester) async {
584 585
    late bool outsideHighContrast;
    late bool insideHighContrast;
586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609

    await tester.pumpWidget(
      Builder(
        builder: (BuildContext context) {
          outsideHighContrast = MediaQuery.highContrastOf(context);
          return MediaQuery(
            data: const MediaQueryData(
              highContrast: true,
            ),
            child: Builder(
              builder: (BuildContext context) {
                insideHighContrast = MediaQuery.highContrastOf(context);
                return Container();
              },
            ),
          );
        },
      ),
    );

    expect(outsideHighContrast, false);
    expect(insideHighContrast, true);
  });

610
  testWidgets('MediaQuery.boldTextOverride', (WidgetTester tester) async {
611 612
    late bool outsideBoldTextOverride;
    late bool insideBoldTextOverride;
613 614

    await tester.pumpWidget(
615
      Builder(
616 617
        builder: (BuildContext context) {
          outsideBoldTextOverride = MediaQuery.boldTextOverride(context);
618
          return MediaQuery(
619 620 621
            data: const MediaQueryData(
              boldText: true,
            ),
622
            child: Builder(
623 624
              builder: (BuildContext context) {
                insideBoldTextOverride = MediaQuery.boldTextOverride(context);
625
                return Container();
626 627 628 629 630 631 632 633 634 635
              },
            ),
          );
        },
      ),
    );

    expect(outsideBoldTextOverride, false);
    expect(insideBoldTextOverride, true);
  });
636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662

  testWidgets('MediaQuery.fromWindow creates a MediaQuery', (WidgetTester tester) async {
    bool hasMediaQueryAsParentOutside = false;
    bool hasMediaQueryAsParentInside = false;

    await tester.pumpWidget(
      Builder(
        builder: (BuildContext context) {
          hasMediaQueryAsParentOutside =
              context.findAncestorWidgetOfExactType<MediaQuery>() != null;
          return MediaQuery.fromWindow(
            child: Builder(
              builder: (BuildContext context) {
                hasMediaQueryAsParentInside =
                    context.findAncestorWidgetOfExactType<MediaQuery>() != null;
                return const SizedBox();
              },
            ),
          );
        },
      ),
    );

    expect(hasMediaQueryAsParentOutside, false);
    expect(hasMediaQueryAsParentInside, true);
  });

663
  testWidgets('MediaQueryData.fromWindow is created using window values', (WidgetTester tester) async {
664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679
    final MediaQueryData windowData = MediaQueryData.fromWindow(WidgetsBinding.instance!.window);
    late MediaQueryData fromWindowData;

    await tester.pumpWidget(
      MediaQuery.fromWindow(
        child: Builder(
          builder: (BuildContext context) {
            fromWindowData = MediaQuery.of(context);
            return const SizedBox();
          },
        ),
      ),
    );

    expect(windowData, equals(fromWindowData));
  });
680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697

  test('DeviceGestureSettings has reasonable hashCode', () {
    final DeviceGestureSettings settingsA = DeviceGestureSettings(touchSlop: nonconst(16));
    final DeviceGestureSettings settingsB = DeviceGestureSettings(touchSlop: nonconst(8));
    final DeviceGestureSettings settingsC = DeviceGestureSettings(touchSlop: nonconst(16));

    expect(settingsA.hashCode, settingsC.hashCode);
    expect(settingsA.hashCode, isNot(settingsB.hashCode));
  });

  test('DeviceGestureSettings has reasonable equality', () {
    final DeviceGestureSettings settingsA = DeviceGestureSettings(touchSlop: nonconst(16));
    final DeviceGestureSettings settingsB = DeviceGestureSettings(touchSlop: nonconst(8));
    final DeviceGestureSettings settingsC = DeviceGestureSettings(touchSlop: nonconst(16));

    expect(settingsA, equals(settingsC));
    expect(settingsA, isNot(settingsB));
  });
698
}