blob: 476df620e56e2a40fd644d74b9bb2e15931a6efc [file] [log] [blame]
// 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 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('AnimatedContainer.debugFillProperties', (WidgetTester tester) async {
final AnimatedContainer container = AnimatedContainer(
constraints: const BoxConstraints.tightFor(width: 17.0, height: 23.0),
decoration: const BoxDecoration(color: Color(0xFF00FF00)),
foregroundDecoration: const BoxDecoration(color: Color(0x7F0000FF)),
margin: const EdgeInsets.all(10.0),
padding: const EdgeInsets.all(7.0),
transform: Matrix4.translationValues(4.0, 3.0, 0.0),
width: 50.0,
height: 75.0,
curve: Curves.ease,
duration: const Duration(milliseconds: 200),
);
expect(container, hasOneLineDescription);
});
testWidgets('AnimatedContainer control test', (WidgetTester tester) async {
final GlobalKey key = GlobalKey();
const BoxDecoration decorationA = BoxDecoration(
color: Color(0xFF00FF00),
);
const BoxDecoration decorationB = BoxDecoration(
color: Color(0xFF0000FF),
);
BoxDecoration actualDecoration;
await tester.pumpWidget(
AnimatedContainer(
key: key,
duration: const Duration(milliseconds: 200),
decoration: decorationA,
),
);
final RenderDecoratedBox box = key.currentContext!.findRenderObject()! as RenderDecoratedBox;
actualDecoration = box.decoration as BoxDecoration;
expect(actualDecoration.color, equals(decorationA.color));
await tester.pumpWidget(
AnimatedContainer(
key: key,
duration: const Duration(milliseconds: 200),
decoration: decorationB,
),
);
expect(key.currentContext!.findRenderObject(), equals(box));
actualDecoration = box.decoration as BoxDecoration;
expect(actualDecoration.color, equals(decorationA.color));
await tester.pump(const Duration(seconds: 1));
actualDecoration = box.decoration as BoxDecoration;
expect(actualDecoration.color, equals(decorationB.color));
expect(box, hasAGoodToStringDeep);
expect(
box.toStringDeep(minLevel: DiagnosticLevel.info),
equalsIgnoringHashCodes(
'RenderDecoratedBox#00000\n'
' │ parentData: <none>\n'
' │ constraints: BoxConstraints(w=800.0, h=600.0)\n'
' │ size: Size(800.0, 600.0)\n'
' │ decoration: BoxDecoration:\n'
' │ color: Color(0xff0000ff)\n'
' │ configuration: ImageConfiguration(bundle:\n'
' │ PlatformAssetBundle#00000(), devicePixelRatio: 1.0, platform:\n'
' │ android)\n'
' │\n'
' └─child: RenderLimitedBox#00000\n'
' │ parentData: <none> (can use size)\n'
' │ constraints: BoxConstraints(w=800.0, h=600.0)\n'
' │ size: Size(800.0, 600.0)\n'
' │ maxWidth: 0.0\n'
' │ maxHeight: 0.0\n'
' │\n'
' └─child: RenderConstrainedBox#00000\n'
' parentData: <none> (can use size)\n'
' constraints: BoxConstraints(w=800.0, h=600.0)\n'
' size: Size(800.0, 600.0)\n'
' additionalConstraints: BoxConstraints(biggest)\n',
),
);
});
testWidgets('AnimatedContainer overanimate test', (WidgetTester tester) async {
await tester.pumpWidget(
AnimatedContainer(
duration: const Duration(milliseconds: 200),
color: const Color(0xFF00FF00),
),
);
expect(tester.binding.transientCallbackCount, 0);
await tester.pump(const Duration(seconds: 1));
expect(tester.binding.transientCallbackCount, 0);
await tester.pumpWidget(
AnimatedContainer(
duration: const Duration(milliseconds: 200),
color: const Color(0xFF00FF00),
),
);
expect(tester.binding.transientCallbackCount, 0);
await tester.pump(const Duration(seconds: 1));
expect(tester.binding.transientCallbackCount, 0);
await tester.pumpWidget(
AnimatedContainer(
duration: const Duration(milliseconds: 200),
color: const Color(0xFF0000FF),
),
);
expect(tester.binding.transientCallbackCount, 1); // this is the only time an animation should have started!
await tester.pump(const Duration(seconds: 1));
expect(tester.binding.transientCallbackCount, 0);
await tester.pumpWidget(
AnimatedContainer(
duration: const Duration(milliseconds: 200),
color: const Color(0xFF0000FF),
),
);
expect(tester.binding.transientCallbackCount, 0);
});
testWidgets('AnimatedContainer padding visual-to-directional animation', (WidgetTester tester) async {
final Key target = UniqueKey();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.rtl,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
padding: const EdgeInsets.only(right: 50.0),
child: SizedBox.expand(key: target),
),
),
);
expect(tester.getSize(find.byKey(target)), const Size(750.0, 600.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(750.0, 0.0));
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.rtl,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
padding: const EdgeInsetsDirectional.only(start: 100.0),
child: SizedBox.expand(key: target),
),
),
);
expect(tester.getSize(find.byKey(target)), const Size(750.0, 600.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(750.0, 0.0));
await tester.pump(const Duration(milliseconds: 100));
expect(tester.getSize(find.byKey(target)), const Size(725.0, 600.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(725.0, 0.0));
await tester.pump(const Duration(milliseconds: 500));
expect(tester.getSize(find.byKey(target)), const Size(700.0, 600.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(700.0, 0.0));
});
testWidgets('AnimatedContainer alignment visual-to-directional animation', (WidgetTester tester) async {
final Key target = UniqueKey();
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.rtl,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
alignment: Alignment.topRight,
child: SizedBox(key: target, width: 100.0, height: 200.0),
),
),
);
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(800.0, 0.0));
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.rtl,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
alignment: AlignmentDirectional.bottomStart,
child: SizedBox(key: target, width: 100.0, height: 200.0),
),
),
);
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(800.0, 0.0));
await tester.pump(const Duration(milliseconds: 100));
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(800.0, 200.0));
await tester.pump(const Duration(milliseconds: 500));
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopRight(find.byKey(target)), const Offset(800.0, 400.0));
});
testWidgets('Animation rerun', (WidgetTester tester) async {
await tester.pumpWidget(
Center(
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
width: 100.0,
height: 100.0,
child: const Text('X', textDirection: TextDirection.ltr),
),
),
);
await tester.pump();
await tester.pump(const Duration(milliseconds: 100));
RenderBox text = tester.renderObject(find.text('X'));
expect(text.size.width, equals(100.0));
expect(text.size.height, equals(100.0));
await tester.pump(const Duration(milliseconds: 1000));
await tester.pumpWidget(
Center(
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
width: 200.0,
height: 200.0,
child: const Text('X', textDirection: TextDirection.ltr),
),
),
);
await tester.pump();
await tester.pump(const Duration(milliseconds: 100));
text = tester.renderObject(find.text('X'));
expect(text.size.width, greaterThan(110.0));
expect(text.size.width, lessThan(190.0));
expect(text.size.height, greaterThan(110.0));
expect(text.size.height, lessThan(190.0));
await tester.pump(const Duration(milliseconds: 1000));
expect(text.size.width, equals(200.0));
expect(text.size.height, equals(200.0));
await tester.pumpWidget(
Center(
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
width: 200.0,
height: 100.0,
child: const Text('X', textDirection: TextDirection.ltr),
),
),
);
await tester.pump();
await tester.pump(const Duration(milliseconds: 100));
expect(text.size.width, equals(200.0));
expect(text.size.height, greaterThan(110.0));
expect(text.size.height, lessThan(190.0));
await tester.pump(const Duration(milliseconds: 1000));
expect(text.size.width, equals(200.0));
expect(text.size.height, equals(100.0));
});
testWidgets('AnimatedContainer sets transformAlignment', (WidgetTester tester) async {
final Key target = UniqueKey();
await tester.pumpWidget(
Center(
child: Directionality(
textDirection: TextDirection.ltr,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
transform: Matrix4.diagonal3Values(0.5, 0.5, 1),
transformAlignment: Alignment.topLeft,
child: SizedBox(key: target, width: 100.0, height: 200.0),
),
),
),
);
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopLeft(find.byKey(target)), const Offset(350.0, 200.0));
await tester.pumpWidget(
Center(
child: Directionality(
textDirection: TextDirection.ltr,
child: AnimatedContainer(
duration: const Duration(milliseconds: 200),
transform: Matrix4.diagonal3Values(0.5, 0.5, 1),
transformAlignment: Alignment.bottomRight,
child: SizedBox(key: target, width: 100.0, height: 200.0),
),
),
),
);
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopLeft(find.byKey(target)), const Offset(350.0, 200.0));
await tester.pump(const Duration(milliseconds: 100));
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopLeft(find.byKey(target)), const Offset(375.0, 250.0));
await tester.pump(const Duration(milliseconds: 500));
expect(tester.getSize(find.byKey(target)), const Size(100.0, 200.0));
expect(tester.getTopLeft(find.byKey(target)), const Offset(400.0, 300.0));
});
testWidgets('AnimatedContainer sets clipBehavior', (WidgetTester tester) async {
await tester.pumpWidget(
AnimatedContainer(
decoration: const BoxDecoration(
color: Color(0xFFED1D7F),
),
duration: const Duration(milliseconds: 200),
),
);
expect(tester.firstWidget<Container>(find.byType(Container)).clipBehavior, Clip.none);
await tester.pumpWidget(
AnimatedContainer(
decoration: const BoxDecoration(
color: Color(0xFFED1D7F),
),
duration: const Duration(milliseconds: 200),
clipBehavior: Clip.antiAlias,
),
);
expect(tester.firstWidget<Container>(find.byType(Container)).clipBehavior, Clip.antiAlias);
});
}