@@ -338,6 +338,153 @@ void main() {
338338 ]);
339339 });
340340
341+ testWidgets ('Transform with nan value short-circuits rendering' , (WidgetTester tester) async {
342+ await tester.pumpWidget (
343+ Transform (
344+ transform: Matrix4 .identity ()
345+ ..storage[0 ] = double .nan,
346+ child: RepaintBoundary (child: Container ()),
347+ ),
348+ );
349+
350+ expect (tester.layers, hasLength (1 ));
351+ });
352+
353+ testWidgets ('Transform with inf value short-circuits rendering' , (WidgetTester tester) async {
354+ await tester.pumpWidget (
355+ Transform (
356+ transform: Matrix4 .identity ()
357+ ..storage[0 ] = double .infinity,
358+ child: RepaintBoundary (child: Container ()),
359+ ),
360+ );
361+
362+ expect (tester.layers, hasLength (1 ));
363+ });
364+
365+ testWidgets ('Transform with -inf value short-circuits rendering' , (WidgetTester tester) async {
366+ await tester.pumpWidget (
367+ Transform (
368+ transform: Matrix4 .identity ()
369+ ..storage[0 ] = double .negativeInfinity,
370+ child: RepaintBoundary (child: Container ()),
371+ ),
372+ );
373+
374+ expect (tester.layers, hasLength (1 ));
375+ });
376+
377+ testWidgets ('Transform.rotate does not remove layers due to singular short-circuit' , (WidgetTester tester) async {
378+ await tester.pumpWidget (
379+ Transform .rotate (
380+ angle: math.pi / 2 ,
381+ child: RepaintBoundary (child: Container ()),
382+ ),
383+ );
384+
385+ expect (tester.layers, hasLength (3 ));
386+ });
387+
388+ testWidgets ('Transform.rotate creates nice rotation matrices for 0, 90, 180, 270 degrees' , (WidgetTester tester) async {
389+ await tester.pumpWidget (
390+ Transform .rotate (
391+ angle: math.pi / 2 ,
392+ child: RepaintBoundary (child: Container ()),
393+ ),
394+ );
395+
396+ expect (tester.layers[1 ], isA <TransformLayer >()
397+ .having ((TransformLayer layer) => layer.transform, 'transform' , equals (Matrix4 .fromList (< double > [
398+ 0.0 , - 1.0 , 0.0 , 700.0 ,
399+ 1.0 , 0.0 , 0.0 , - 100.0 ,
400+ 0.0 , 0.0 , 1.0 , 0.0 ,
401+ 0.0 , 0.0 , 0.0 , 1.0 ,
402+ ])..transpose ()))
403+ );
404+
405+ await tester.pumpWidget (
406+ Transform .rotate (
407+ angle: math.pi,
408+ child: RepaintBoundary (child: Container ()),
409+ ),
410+ );
411+
412+ expect (tester.layers[1 ], isA <TransformLayer >()
413+ .having ((TransformLayer layer) => layer.transform, 'transform' , equals (Matrix4 .fromList (< double > [
414+ - 1.0 , 0.0 , 0.0 , 800.0 ,
415+ 0.0 , - 1.0 , 0.0 , 600.0 ,
416+ 0.0 , 0.0 , 1.0 , 0.0 ,
417+ 0.0 , 0.0 , 0.0 , 1.0 ,
418+ ])..transpose ()))
419+ );
420+
421+ await tester.pumpWidget (
422+ Transform .rotate (
423+ angle: 3 * math.pi / 2 ,
424+ child: RepaintBoundary (child: Container ()),
425+ ),
426+ );
427+
428+ expect (tester.layers[1 ], isA <TransformLayer >()
429+ .having ((TransformLayer layer) => layer.transform, 'transform' , equals (Matrix4 .fromList (< double > [
430+ 0.0 , 1.0 , 0.0 , 100.0 ,
431+ - 1.0 , 0.0 , 0.0 , 700.0 ,
432+ 0.0 , 0.0 , 1.0 , 0.0 ,
433+ 0.0 , 0.0 , 0.0 , 1.0 ,
434+ ])..transpose ()))
435+ );
436+
437+ await tester.pumpWidget (
438+ Transform .rotate (
439+ angle: 0 ,
440+ child: RepaintBoundary (child: Container ()),
441+ ),
442+ );
443+
444+ // No transform layer created
445+ expect (tester.layers[1 ], isA <OffsetLayer >());
446+ expect (tester.layers, hasLength (2 ));
447+ });
448+
449+ testWidgets ('Transform.scale with 0.0 does not paint child layers' , (WidgetTester tester) async {
450+ await tester.pumpWidget (
451+ Transform .scale (
452+ scale: 0.0 ,
453+ child: RepaintBoundary (child: Container ()),
454+ ),
455+ );
456+
457+ expect (tester.layers, hasLength (1 )); // root transform layer
458+
459+ await tester.pumpWidget (
460+ Transform .scale (
461+ scaleX: 0.0 ,
462+ child: RepaintBoundary (child: Container ()),
463+ ),
464+ );
465+
466+ expect (tester.layers, hasLength (1 ));
467+
468+ await tester.pumpWidget (
469+ Transform .scale (
470+ scaleY: 0.0 ,
471+ child: RepaintBoundary (child: Container ()),
472+ ),
473+ );
474+
475+ expect (tester.layers, hasLength (1 ));
476+
477+ await tester.pumpWidget (
478+ Transform .scale (
479+ scale: 0.01 , // small but non-zero
480+ child: RepaintBoundary (child: Container ()),
481+ ),
482+ );
483+
484+ expect (tester.layers, hasLength (3 ));
485+ });
486+
487+
341488 testWidgets ('Translated child into translated box - hit test' , (WidgetTester tester) async {
342489 final GlobalKey key1 = GlobalKey ();
343490 bool pointerDown = false ;
0 commit comments