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