// 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/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; void main() { /* * Here lies tests for packages/flutter_test/lib/src/animation_sheet.dart * because [matchesGoldenFile] does not use Skia Gold in its native package. */ testWidgets('correctly records frames', (WidgetTester tester) async { final AnimationSheetBuilder builder = AnimationSheetBuilder(frameSize: _DecuplePixels.size); await tester.pumpFrames( builder.record( const _DecuplePixels(Duration(seconds: 1)), ), const Duration(milliseconds: 200), const Duration(milliseconds: 100), ); await tester.pumpFrames( builder.record( const _DecuplePixels(Duration(seconds: 1)), recording: false, ), const Duration(milliseconds: 200), const Duration(milliseconds: 100), ); await tester.pumpFrames( builder.record( const _DecuplePixels(Duration(seconds: 1)), recording: true, ), const Duration(milliseconds: 400), const Duration(milliseconds: 100), ); final Widget display = await builder.display(); await tester.binding.setSurfaceSize(builder.sheetSize()); await tester.pumpWidget(display); await expectLater(find.byWidget(display), matchesGoldenFile('test.animation_sheet_builder.records.png')); }, skip: isBrowser); // https://github.com/flutter/flutter/issues/42767 testWidgets('correctly wraps a row', (WidgetTester tester) async { final AnimationSheetBuilder builder = AnimationSheetBuilder(frameSize: _DecuplePixels.size); const Duration duration = Duration(seconds: 2); await tester.pumpFrames( builder.record(const _DecuplePixels(duration)), duration, const Duration(milliseconds: 200), ); final Widget display = await builder.display(); await tester.binding.setSurfaceSize(builder.sheetSize(maxWidth: 80)); await tester.pumpWidget(display); await expectLater(find.byWidget(display), matchesGoldenFile('test.animation_sheet_builder.wraps.png')); }, skip: isBrowser); // https://github.com/flutter/flutter/issues/42767 } // An animation of a yellow pixel moving from left to right, in a container of // (10, 1) with a 1-pixel-wide black border. class _DecuplePixels extends StatefulWidget { const _DecuplePixels(this.duration); static const Size size = Size(12, 3); final Duration duration; @override State<StatefulWidget> createState() => _DecuplePixelsState(); } class _DecuplePixelsState extends State<_DecuplePixels> with SingleTickerProviderStateMixin<_DecuplePixels> { late AnimationController _controller; @override void initState() { super.initState(); _controller = AnimationController( duration: widget.duration, vsync: this, ); _controller.repeat(); } @override void dispose() { _controller.dispose(); super.dispose(); } @override Widget build(BuildContext context) { return AnimatedBuilder( animation: _controller.view, builder: (BuildContext context, Widget? child) { return CustomPaint( painter: _PaintDecuplePixels(_controller.value), ); }, ); } } class _PaintDecuplePixels extends CustomPainter { _PaintDecuplePixels(this.value); final double value; @override bool shouldRepaint(_PaintDecuplePixels oldDelegate) { return oldDelegate.value != value; } @override void paint(Canvas canvas, Size size) { canvas.save(); final Rect rect = RectTween( begin: const Rect.fromLTWH(1, 1, 1, 1), end: const Rect.fromLTWH(11, 1, 1, 1), ).transform(value)!; canvas.drawRect(rect, Paint()..color = Colors.yellow); final Paint black = Paint()..color = Colors.black; canvas // Top border ..drawRect(const Rect.fromLTRB(0, 0, 12, 1), black) // Bottom border ..drawRect(const Rect.fromLTRB(0, 2, 12, 3), black) // Left border ..drawRect(const Rect.fromLTRB(0, 0, 1, 3), black) // Right border ..drawRect(const Rect.fromLTRB(11, 0, 12, 3), black); canvas.restore(); } }