Add tests for tween_animation_builder.0.dart API example. (#148902)

This PR contributes to https://github.com/flutter/flutter/issues/130459

### Description
- Adds tests for `examples/api/lib/widgets/tween_animation_builder/tween_animation_builder.0.dart`
This commit is contained in:
Kostia Sokolovskyi 2024-05-30 22:17:04 +02:00 committed by GitHub
parent 5933e99c6c
commit 488fb09582
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 170 additions and 7 deletions

View File

@ -393,7 +393,6 @@ final Set<String> _knownMissingTests = <String>{
'examples/api/test/widgets/notification_listener/notification.0_test.dart',
'examples/api/test/widgets/overscroll_indicator/glowing_overscroll_indicator.1_test.dart',
'examples/api/test/widgets/overscroll_indicator/glowing_overscroll_indicator.0_test.dart',
'examples/api/test/widgets/tween_animation_builder/tween_animation_builder.0_test.dart',
'examples/api/test/widgets/single_child_scroll_view/single_child_scroll_view.1_test.dart',
'examples/api/test/widgets/single_child_scroll_view/single_child_scroll_view.0_test.dart',
'examples/api/test/widgets/restoration/restoration_mixin.0_test.dart',

View File

@ -15,7 +15,9 @@ class TweenAnimationBuilderExampleApp extends StatelessWidget {
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(title: const Text('TweenAnimationBuilder Sample')),
appBar: AppBar(
title: const Text('TweenAnimationBuilder Sample'),
),
body: const Center(
child: TweenAnimationBuilderExample(),
),
@ -28,16 +30,18 @@ class TweenAnimationBuilderExample extends StatefulWidget {
const TweenAnimationBuilderExample({super.key});
@override
State<TweenAnimationBuilderExample> createState() => _TweenAnimationBuilderExampleState();
State<TweenAnimationBuilderExample> createState() =>
_TweenAnimationBuilderExampleState();
}
class _TweenAnimationBuilderExampleState extends State<TweenAnimationBuilderExample> {
double targetValue = 24.0;
class _TweenAnimationBuilderExampleState
extends State<TweenAnimationBuilderExample> {
double _targetValue = 24.0;
@override
Widget build(BuildContext context) {
return TweenAnimationBuilder<double>(
tween: Tween<double>(begin: 0, end: targetValue),
tween: Tween<double>(begin: 0, end: _targetValue),
duration: const Duration(seconds: 1),
builder: (BuildContext context, double size, Widget? child) {
return IconButton(
@ -46,7 +50,7 @@ class _TweenAnimationBuilderExampleState extends State<TweenAnimationBuilderExam
icon: child!,
onPressed: () {
setState(() {
targetValue = targetValue == 24.0 ? 48.0 : 24.0;
_targetValue = _targetValue == 24.0 ? 48.0 : 24.0;
});
},
);

View File

@ -0,0 +1,160 @@
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'dart:ui';
import 'package:flutter/material.dart';
import 'package:flutter_api_samples/widgets/tween_animation_builder/tween_animation_builder.0.dart'
as example;
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Animates icon size on first build', (WidgetTester tester) async {
await tester.pumpWidget(
const example.TweenAnimationBuilderExampleApp(),
);
// The animation duration defined in the example app.
const Duration animationDuration = Duration(seconds: 1);
const double beginSize = 0.0;
const double endSize = 24.0;
final Finder iconButtonFinder = find.byType(IconButton);
IconButton iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(beginSize));
// Advance animation to the middle.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(
iconButton.iconSize,
equals(lerpDouble(beginSize, endSize, 0.5)),
);
// Advance animation to the end.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(endSize));
});
testWidgets('Animates icon size on IconButton tap', (WidgetTester tester) async {
await tester.pumpWidget(
const example.TweenAnimationBuilderExampleApp(),
);
await tester.pumpAndSettle();
// The animation duration defined in the example app.
const Duration animationDuration = Duration(seconds: 1);
const double beginSize = 24.0;
const double endSize = 48.0;
final Finder iconButtonFinder = find.byType(IconButton);
IconButton iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(beginSize));
// Tap on the IconButton to start the forward animation.
await tester.tap(iconButtonFinder);
await tester.pump();
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(beginSize));
// Advance animation to the middle.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(
iconButton.iconSize,
equals(lerpDouble(beginSize, endSize, 0.5)),
);
// Advance animation to the end.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(endSize));
// Tap on the IconButton to start the reverse animation.
await tester.tap(iconButtonFinder);
await tester.pump();
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(endSize));
// Advance animation to the middle.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(
iconButton.iconSize,
equals(lerpDouble(endSize, beginSize, 0.5)),
);
// Advance animation to the end.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(beginSize));
});
testWidgets('Animation target can be updated during the animation', (WidgetTester tester) async {
await tester.pumpWidget(
const example.TweenAnimationBuilderExampleApp(),
);
await tester.pumpAndSettle();
// The animation duration defined in the example app.
const Duration animationDuration = Duration(seconds: 1);
const double beginSize = 24.0;
const double endSize = 48.0;
final double middleSize = lerpDouble(beginSize, endSize, 0.5)!;
final Finder iconButtonFinder = find.byType(IconButton);
IconButton iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(beginSize));
// Tap on the IconButton to start the forward animation.
await tester.tap(iconButtonFinder);
await tester.pump();
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(beginSize));
// Advance animation to the middle.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(middleSize));
// Tap on the IconButton to start the backward animation.
await tester.tap(iconButtonFinder);
await tester.pump();
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(middleSize));
// Advance animation to the middle.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(
iconButton.iconSize,
equals(lerpDouble(middleSize, beginSize, 0.5)),
);
// Advance animation to the end.
await tester.pump(animationDuration ~/ 2);
iconButton = tester.widget(iconButtonFinder);
expect(iconButton.iconSize, equals(beginSize));
});
}