scheduler_test.dart 2.74 KB
Newer Older
1 2 3 4
// Copyright 2015 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.

5
import 'package:flutter/foundation.dart';
6
import 'package:flutter/scheduler.dart';
7 8
import 'package:test/test.dart';

9
class TestSchedulerBinding extends BindingBase with SchedulerBinding { }
Ian Hickson's avatar
Ian Hickson committed
10

Ian Hickson's avatar
Ian Hickson committed
11
class TestStrategy {
12 13
  int allowedPriority = 10000;

14
  bool shouldRunTaskWithPriority({ int priority, SchedulerBinding scheduler }) {
15 16 17 18 19 20
    return priority >= allowedPriority;
  }
}

void main() {
  test("Tasks are executed in the right order", () {
21
    SchedulerBinding scheduler = new TestSchedulerBinding();
Ian Hickson's avatar
Ian Hickson committed
22
    TestStrategy strategy = new TestStrategy();
Ian Hickson's avatar
Ian Hickson committed
23
    scheduler.schedulingStrategy = strategy.shouldRunTaskWithPriority;
Ian Hickson's avatar
Ian Hickson committed
24 25
    List<int> input = <int>[2, 23, 23, 11, 0, 80, 3];
    List<int> executedTasks = <int>[];
26 27

    void scheduleAddingTask(int x) {
28
      scheduler.scheduleTask(() { executedTasks.add(x); }, Priority.idle + x);
29 30
    }

Ian Hickson's avatar
Ian Hickson committed
31
    for (int x in input)
32
      scheduleAddingTask(x);
Ian Hickson's avatar
Ian Hickson committed
33

34
    strategy.allowedPriority = 100;
Ian Hickson's avatar
Ian Hickson committed
35 36
    for (int i = 0; i < 3; i += 1)
      scheduler.handleEventLoopCallback();
37 38 39
    expect(executedTasks.isEmpty, isTrue);

    strategy.allowedPriority = 50;
Ian Hickson's avatar
Ian Hickson committed
40 41
    for (int i = 0; i < 3; i += 1)
      scheduler.handleEventLoopCallback();
42 43 44 45 46
    expect(executedTasks.length, equals(1));
    expect(executedTasks.single, equals(80));
    executedTasks.clear();

    strategy.allowedPriority = 20;
Ian Hickson's avatar
Ian Hickson committed
47 48
    for (int i = 0; i < 3; i += 1)
      scheduler.handleEventLoopCallback();
49 50 51 52 53 54 55 56 57
    expect(executedTasks.length, equals(2));
    expect(executedTasks[0], equals(23));
    expect(executedTasks[1], equals(23));
    executedTasks.clear();

    scheduleAddingTask(99);
    scheduleAddingTask(19);
    scheduleAddingTask(5);
    scheduleAddingTask(97);
Ian Hickson's avatar
Ian Hickson committed
58 59
    for (int i = 0; i < 3; i += 1)
      scheduler.handleEventLoopCallback();
60 61 62 63 64 65
    expect(executedTasks.length, equals(2));
    expect(executedTasks[0], equals(99));
    expect(executedTasks[1], equals(97));
    executedTasks.clear();

    strategy.allowedPriority = 10;
Ian Hickson's avatar
Ian Hickson committed
66 67
    for (int i = 0; i < 3; i += 1)
      scheduler.handleEventLoopCallback();
68 69 70 71 72 73
    expect(executedTasks.length, equals(2));
    expect(executedTasks[0], equals(19));
    expect(executedTasks[1], equals(11));
    executedTasks.clear();

    strategy.allowedPriority = 1;
Ian Hickson's avatar
Ian Hickson committed
74 75
    for (int i = 0; i < 4; i += 1)
      scheduler.handleEventLoopCallback();
76 77 78 79 80 81 82
    expect(executedTasks.length, equals(3));
    expect(executedTasks[0], equals(5));
    expect(executedTasks[1], equals(3));
    expect(executedTasks[2], equals(2));
    executedTasks.clear();

    strategy.allowedPriority = 0;
83
    scheduler.handleEventLoopCallback();
84 85 86 87
    expect(executedTasks.length, equals(1));
    expect(executedTasks[0], equals(0));
  });
}