test: Fix memory leak in transitions test (#146747)

This commit is contained in:
Valentin Vignal 2024-04-15 23:52:18 +08:00 committed by GitHub
parent 63634c25ad
commit 0099d1a96a
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -5,6 +5,7 @@
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart'; import 'package:flutter/rendering.dart';
import 'package:flutter_test/flutter_test.dart'; import 'package:flutter_test/flutter_test.dart';
import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart';
void main() { void main() {
testWidgets('toString control test', (WidgetTester tester) async { testWidgets('toString control test', (WidgetTester tester) async {
@ -95,53 +96,60 @@ void main() {
expect(actualDecoration.boxShadow, null); expect(actualDecoration.boxShadow, null);
}); });
testWidgets('animations work with curves test', (WidgetTester tester) async { testWidgets(
final Animation<Decoration> curvedDecorationAnimation = 'animations work with curves test',
decorationTween.animate(CurvedAnimation( // TODO(polina-c): remove when fixed https://github.com/flutter/flutter/issues/145600 [leak-tracking-opt-in]
parent: controller, experimentalLeakTesting: LeakTesting.settings.withTracked(classes: const <String>['CurvedAnimation']),
curve: Curves.easeOut, (WidgetTester tester) async {
)); final CurvedAnimation animation = CurvedAnimation(
parent: controller,
curve: Curves.easeOut,
);
addTearDown(animation.dispose);
final Animation<Decoration> curvedDecorationAnimation =
decorationTween.animate(animation);
final DecoratedBoxTransition transitionUnderTest = DecoratedBoxTransition( final DecoratedBoxTransition transitionUnderTest = DecoratedBoxTransition(
decoration: curvedDecorationAnimation, decoration: curvedDecorationAnimation,
position: DecorationPosition.foreground, position: DecorationPosition.foreground,
child: const Text( child: const Text(
"Doesn't matter", "Doesn't matter",
textDirection: TextDirection.ltr, textDirection: TextDirection.ltr,
), ),
); );
await tester.pumpWidget(transitionUnderTest); await tester.pumpWidget(transitionUnderTest);
RenderDecoratedBox actualBox = tester.renderObject(find.byType(DecoratedBox)); RenderDecoratedBox actualBox = tester.renderObject(find.byType(DecoratedBox));
BoxDecoration actualDecoration = actualBox.decoration as BoxDecoration; BoxDecoration actualDecoration = actualBox.decoration as BoxDecoration;
expect(actualDecoration.color, const Color(0xFFFFFFFF)); expect(actualDecoration.color, const Color(0xFFFFFFFF));
expect(actualDecoration.boxShadow![0].blurRadius, 10.0); expect(actualDecoration.boxShadow![0].blurRadius, 10.0);
expect(actualDecoration.boxShadow![0].spreadRadius, 4.0); expect(actualDecoration.boxShadow![0].spreadRadius, 4.0);
expect(actualDecoration.boxShadow![0].color, const Color(0x66000000)); expect(actualDecoration.boxShadow![0].color, const Color(0x66000000));
controller.value = 0.5; controller.value = 0.5;
await tester.pump(); await tester.pump();
actualBox = tester.renderObject(find.byType(DecoratedBox)); actualBox = tester.renderObject(find.byType(DecoratedBox));
actualDecoration = actualBox.decoration as BoxDecoration; actualDecoration = actualBox.decoration as BoxDecoration;
// Same as the test above but the values should be much closer to the // Same as the test above but the values should be much closer to the
// tween's end values given the easeOut curve. // tween's end values given the easeOut curve.
expect(actualDecoration.color, const Color(0xFF505050)); expect(actualDecoration.color, const Color(0xFF505050));
expect(actualDecoration.border, isA<Border>()); expect(actualDecoration.border, isA<Border>());
final Border border = actualDecoration.border! as Border; final Border border = actualDecoration.border! as Border;
expect(border.left.width, moreOrLessEquals(1.9, epsilon: 0.1)); expect(border.left.width, moreOrLessEquals(1.9, epsilon: 0.1));
expect(border.left.style, BorderStyle.solid); expect(border.left.style, BorderStyle.solid);
expect(border.left.color, const Color(0xFF151515)); expect(border.left.color, const Color(0xFF151515));
expect(actualDecoration.borderRadius!.resolve(TextDirection.ltr).topLeft.x, moreOrLessEquals(6.8, epsilon: 0.1)); expect(actualDecoration.borderRadius!.resolve(TextDirection.ltr).topLeft.x, moreOrLessEquals(6.8, epsilon: 0.1));
expect(actualDecoration.shape, BoxShape.rectangle); expect(actualDecoration.shape, BoxShape.rectangle);
expect(actualDecoration.boxShadow![0].blurRadius, moreOrLessEquals(3.1, epsilon: 0.1)); expect(actualDecoration.boxShadow![0].blurRadius, moreOrLessEquals(3.1, epsilon: 0.1));
expect(actualDecoration.boxShadow![0].spreadRadius, moreOrLessEquals(1.2, epsilon: 0.1)); expect(actualDecoration.boxShadow![0].spreadRadius, moreOrLessEquals(1.2, epsilon: 0.1));
// Scaling a shadow doesn't change the color. // Scaling a shadow doesn't change the color.
expect(actualDecoration.boxShadow![0].color, const Color(0x66000000)); expect(actualDecoration.boxShadow![0].color, const Color(0x66000000));
}); },
);
}); });
testWidgets('AlignTransition animates', (WidgetTester tester) async { testWidgets('AlignTransition animates', (WidgetTester tester) async {