blob: 834bd845f0af3ff864acd6f0eb0be027b6cb7a70 [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 'dart:async';
import 'package:flutter/rendering.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_test/flutter_test.dart';
void main() {
testWidgets('Positioned constructors', (WidgetTester tester) async {
final Widget child = Container();
final Positioned a = Positioned(
left: 101.0,
right: 201.0,
top: 301.0,
bottom: 401.0,
child: child,
);
expect(a.left, 101.0);
expect(a.right, 201.0);
expect(a.top, 301.0);
expect(a.bottom, 401.0);
expect(a.width, null);
expect(a.height, null);
final Positioned b = Positioned.fromRect(
rect: const Rect.fromLTRB(
102.0,
302.0,
202.0,
502.0,
),
child: child,
);
expect(b.left, 102.0);
expect(b.right, null);
expect(b.top, 302.0);
expect(b.bottom, null);
expect(b.width, 100.0);
expect(b.height, 200.0);
final Positioned c = Positioned.fromRelativeRect(
rect: const RelativeRect.fromLTRB(
103.0,
303.0,
203.0,
403.0,
),
child: child,
);
expect(c.left, 103.0);
expect(c.right, 203.0);
expect(c.top, 303.0);
expect(c.bottom, 403.0);
expect(c.width, null);
expect(c.height, null);
});
testWidgets('Can animate position data', (WidgetTester tester) async {
final RelativeRectTween rect = RelativeRectTween(
begin: RelativeRect.fromRect(
const Rect.fromLTRB(10.0, 20.0, 20.0, 30.0),
const Rect.fromLTRB(0.0, 10.0, 100.0, 110.0),
),
end: RelativeRect.fromRect(
const Rect.fromLTRB(80.0, 90.0, 90.0, 100.0),
const Rect.fromLTRB(0.0, 10.0, 100.0, 110.0),
),
);
final AnimationController controller = AnimationController(
duration: const Duration(seconds: 10),
vsync: tester,
);
final List<Size> sizes = <Size>[];
final List<Offset> positions = <Offset>[];
final GlobalKey key = GlobalKey();
void recordMetrics() {
final RenderBox box = key.currentContext!.findRenderObject()! as RenderBox;
final BoxParentData boxParentData = box.parentData! as BoxParentData;
sizes.add(box.size);
positions.add(boxParentData.offset);
}
await tester.pumpWidget(
Directionality(
textDirection: TextDirection.ltr,
child: Center(
child: SizedBox(
height: 100.0,
width: 100.0,
child: Stack(
children: <Widget>[
PositionedTransition(
rect: rect.animate(controller),
child: Container(
key: key,
),
),
],
),
),
),
),
); // t=0
recordMetrics();
final Completer<void> completer = Completer<void>();
controller.forward().whenComplete(completer.complete);
expect(completer.isCompleted, isFalse);
await tester.pump(); // t=0 again
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 1)); // t=1
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 1)); // t=2
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 3)); // t=5
expect(completer.isCompleted, isFalse);
recordMetrics();
await tester.pump(const Duration(seconds: 5)); // t=10
expect(completer.isCompleted, isFalse);
recordMetrics();
expect(sizes, equals(<Size>[const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0), const Size(10.0, 10.0)]));
expect(positions, equals(<Offset>[const Offset(10.0, 10.0), const Offset(10.0, 10.0), const Offset(17.0, 17.0), const Offset(24.0, 24.0), const Offset(45.0, 45.0), const Offset(80.0, 80.0)]));
controller.stop(canceled: false);
await tester.pump();
expect(completer.isCompleted, isTrue);
});
}