// Copyright 2016 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/animation.dart'; import 'package:flutter/widgets.dart'; import 'package:test/test.dart'; void main() { test("Can set value during status callback", () { WidgetsFlutterBinding.ensureInitialized(); AnimationController controller = new AnimationController( duration: const Duration(milliseconds: 100) ); bool didComplete = false; bool didDismiss = false; controller.addStatusListener((AnimationStatus status) { if (status == AnimationStatus.completed) { didComplete = true; controller.value = 0.0; controller.forward(); } else if (status == AnimationStatus.dismissed) { didDismiss = true; controller.value = 0.0; controller.forward(); } }); controller.forward(); expect(didComplete, isFalse); expect(didDismiss, isFalse); WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 1)); expect(didComplete, isFalse); expect(didDismiss, isFalse); WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 2)); expect(didComplete, isTrue); expect(didDismiss, isTrue); controller.stop(); }); test("Receives status callbacks for forward and reverse", () { WidgetsFlutterBinding.ensureInitialized(); AnimationController controller = new AnimationController( duration: const Duration(milliseconds: 100) ); List<double> valueLog = <double>[]; List<AnimationStatus> log = <AnimationStatus>[]; controller ..addStatusListener((AnimationStatus status) { log.add(status); }) ..addListener(() { valueLog.add(controller.value); }); expect(log, equals(<AnimationStatus>[])); expect(valueLog, equals(<AnimationStatus>[])); controller.forward(); expect(log, equals(<AnimationStatus>[AnimationStatus.forward])); expect(valueLog, equals(<AnimationStatus>[])); controller.reverse(); expect(log, equals(<AnimationStatus>[AnimationStatus.forward, AnimationStatus.dismissed])); expect(valueLog, equals(<AnimationStatus>[])); controller.reverse(); expect(log, equals(<AnimationStatus>[AnimationStatus.forward, AnimationStatus.dismissed])); expect(valueLog, equals(<AnimationStatus>[])); log.clear(); controller.forward(); expect(log, equals(<AnimationStatus>[AnimationStatus.forward])); expect(valueLog, equals(<AnimationStatus>[])); controller.forward(); expect(log, equals(<AnimationStatus>[AnimationStatus.forward])); expect(valueLog, equals(<AnimationStatus>[])); controller.reverse(); log.clear(); WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 10)); expect(log, equals(<AnimationStatus>[])); expect(valueLog, equals(<AnimationStatus>[])); WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 20)); expect(log, equals(<AnimationStatus>[])); expect(valueLog, equals(<AnimationStatus>[])); WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 30)); expect(log, equals(<AnimationStatus>[])); expect(valueLog, equals(<AnimationStatus>[])); WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 40)); expect(log, equals(<AnimationStatus>[])); expect(valueLog, equals(<AnimationStatus>[])); controller.stop(); }); test("Forward and reverse from values", () { WidgetsFlutterBinding.ensureInitialized(); AnimationController controller = new AnimationController( duration: const Duration(milliseconds: 100) ); List<double> valueLog = <double>[]; List<AnimationStatus> statusLog = <AnimationStatus>[]; controller ..addStatusListener((AnimationStatus status) { statusLog.add(status); }) ..addListener(() { valueLog.add(controller.value); }); controller.reverse(from: 0.2); expect(statusLog, equals(<AnimationStatus>[ AnimationStatus.reverse ])); expect(valueLog, equals(<double>[ 0.2 ])); expect(controller.value, equals(0.2)); statusLog.clear(); valueLog.clear(); controller.forward(from: 0.0); expect(statusLog, equals(<AnimationStatus>[ AnimationStatus.dismissed, AnimationStatus.forward ])); expect(valueLog, equals(<double>[ 0.0 ])); expect(controller.value, equals(0.0)); }); }