blob: b14436f50f15819010f57705930e0660132a2a85 [file] [log] [blame]
// Copyright 2018 The Chromium 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 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('AnimatedChildSwitcher fades in a new child.', (WidgetTester tester) async {
final UniqueKey containerOne = new UniqueKey();
final UniqueKey containerTwo = new UniqueKey();
final UniqueKey containerThree = new UniqueKey();
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(key: containerOne, color: const Color(0x00000000)),
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
FadeTransition transition = tester.firstWidget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(1.0));
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(key: containerTwo, color: const Color(0xff000000)),
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
await tester.pump(const Duration(milliseconds: 50));
transition = tester.firstWidget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(0.5));
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(key: containerThree, color: const Color(0xffff0000)),
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
await tester.pump(const Duration(milliseconds: 10));
transition = tester.widget(find.byType(FadeTransition).at(0));
expect(transition.opacity.value, closeTo(0.4, 0.01));
transition = tester.widget(find.byType(FadeTransition).at(1));
expect(transition.opacity.value, closeTo(0.4, 0.01));
transition = tester.widget(find.byType(FadeTransition).at(2));
expect(transition.opacity.value, closeTo(0.1, 0.01));
await tester.pumpAndSettle();
});
testWidgets("AnimatedChildSwitcher doesn't transition in a new child of the same type.", (WidgetTester tester) async {
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(color: const Color(0x00000000)),
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
FadeTransition transition = tester.firstWidget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(1.0));
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(color: const Color(0xff000000)),
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
await tester.pump(const Duration(milliseconds: 50));
transition = tester.widget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(1.0));
await tester.pumpAndSettle();
});
testWidgets('AnimatedChildSwitcher handles null children.', (WidgetTester tester) async {
await tester.pumpWidget(
const AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: null,
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
expect(find.byType(FadeTransition), findsNothing);
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(color: const Color(0xff000000)),
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
await tester.pump(const Duration(milliseconds: 50));
FadeTransition transition = tester.firstWidget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(0.5));
await tester.pumpAndSettle();
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(color: const Color(0x00000000)),
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
transition = tester.firstWidget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(1.0));
await tester.pumpWidget(
const AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: null,
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
await tester.pump(const Duration(milliseconds: 50));
transition = tester.firstWidget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(0.5));
await tester.pumpWidget(
const AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: null,
switchInCurve: Curves.linear,
switchOutCurve: Curves.linear,
),
);
await tester.pump(const Duration(milliseconds: 50));
transition = tester.firstWidget(find.byType(FadeTransition));
expect(transition.opacity.value, equals(0.0));
await tester.pumpAndSettle();
});
testWidgets("AnimatedChildSwitcher doesn't start any animations after dispose.", (WidgetTester tester) async {
await tester.pumpWidget(new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(color: const Color(0xff000000)),
switchInCurve: Curves.linear,
));
await tester.pump(const Duration(milliseconds: 50));
// Change the widget tree in the middle of the animation.
await tester.pumpWidget(new Container(color: const Color(0xffff0000)));
expect(await tester.pumpAndSettle(const Duration(milliseconds: 100)), equals(1));
});
testWidgets('AnimatedChildSwitcher uses custom layout.', (WidgetTester tester) async {
Widget newLayoutBuilder(List<Widget> children) {
return new Column(
children: children,
);
}
await tester.pumpWidget(
new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(color: const Color(0x00000000)),
switchInCurve: Curves.linear,
layoutBuilder: newLayoutBuilder,
),
);
expect(find.byType(Column), findsOneWidget);
});
testWidgets('AnimatedChildSwitcher uses custom transitions.', (WidgetTester tester) async {
final List<Widget> transitions = <Widget>[];
Widget newLayoutBuilder(List<Widget> children) {
transitions.clear();
transitions.addAll(children);
return new Column(
children: children,
);
}
Widget newTransitionBuilder(Widget child, Animation<double> animation) {
return new SizeTransition(
sizeFactor: animation,
child: child,
);
}
await tester.pumpWidget(
new Directionality(
textDirection: TextDirection.rtl,
child: new AnimatedChildSwitcher(
duration: const Duration(milliseconds: 100),
child: new Container(color: const Color(0x00000000)),
switchInCurve: Curves.linear,
layoutBuilder: newLayoutBuilder,
transitionBuilder: newTransitionBuilder,
),
),
);
expect(find.byType(Column), findsOneWidget);
for (Widget transition in transitions) {
expect(transition, const isInstanceOf<KeyedSubtree>());
expect(
find.descendant(of: find.byWidget(transition), matching: find.byType(SizeTransition)),
findsOneWidget,
);
}
});
}