animation_controller_test.dart 4.39 KB
Newer Older
1 2 3 4 5 6 7 8 9 10
// 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", () {
11
    WidgetsFlutterBinding.ensureInitialized();
12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
    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);
32
    WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 1));
33 34
    expect(didComplete, isFalse);
    expect(didDismiss, isFalse);
35
    WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 2));
36 37
    expect(didComplete, isTrue);
    expect(didDismiss, isTrue);
38 39 40 41 42

    controller.stop();
  });

  test("Receives status callbacks for forward and reverse", () {
43
    WidgetsFlutterBinding.ensureInitialized();
44 45 46 47 48 49 50 51 52 53 54 55 56
    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);
      });

57 58
    expect(log, equals(<AnimationStatus>[]));
    expect(valueLog, equals(<AnimationStatus>[]));
59 60 61

    controller.forward();

62 63
    expect(log, equals(<AnimationStatus>[AnimationStatus.forward]));
    expect(valueLog, equals(<AnimationStatus>[]));
64 65 66

    controller.reverse();

67 68
    expect(log, equals(<AnimationStatus>[AnimationStatus.forward, AnimationStatus.dismissed]));
    expect(valueLog, equals(<AnimationStatus>[]));
69 70 71

    controller.reverse();

72 73
    expect(log, equals(<AnimationStatus>[AnimationStatus.forward, AnimationStatus.dismissed]));
    expect(valueLog, equals(<AnimationStatus>[]));
74 75 76 77

    log.clear();
    controller.forward();

78 79
    expect(log, equals(<AnimationStatus>[AnimationStatus.forward]));
    expect(valueLog, equals(<AnimationStatus>[]));
80 81 82

    controller.forward();

83 84
    expect(log, equals(<AnimationStatus>[AnimationStatus.forward]));
    expect(valueLog, equals(<AnimationStatus>[]));
85 86 87 88

    controller.reverse();
    log.clear();

89
    WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 10));
90 91
    expect(log, equals(<AnimationStatus>[]));
    expect(valueLog, equals(<AnimationStatus>[]));
92
    WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 20));
93 94
    expect(log, equals(<AnimationStatus>[]));
    expect(valueLog, equals(<AnimationStatus>[]));
95
    WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 30));
96 97
    expect(log, equals(<AnimationStatus>[]));
    expect(valueLog, equals(<AnimationStatus>[]));
98
    WidgetsBinding.instance.handleBeginFrame(const Duration(seconds: 40));
99 100
    expect(log, equals(<AnimationStatus>[]));
    expect(valueLog, equals(<AnimationStatus>[]));
101 102

    controller.stop();
103
  });
104 105

  test("Forward and reverse from values", () {
106
    WidgetsFlutterBinding.ensureInitialized();
107 108 109 110 111 112 113 114 115 116 117 118 119 120
    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);
121 122
    expect(statusLog, equals(<AnimationStatus>[ AnimationStatus.reverse ]));
    expect(valueLog, equals(<double>[ 0.2 ]));
123 124 125 126 127
    expect(controller.value, equals(0.2));
    statusLog.clear();
    valueLog.clear();

    controller.forward(from: 0.0);
128 129
    expect(statusLog, equals(<AnimationStatus>[ AnimationStatus.dismissed, AnimationStatus.forward ]));
    expect(valueLog, equals(<double>[ 0.0 ]));
130 131
    expect(controller.value, equals(0.0));
  });
132
}