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