// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
// for details. 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:expect/expect.dart';

import 'package:test_runner/src/dependency_graph.dart';

main() {
  var graph = Graph<int>();
  var numberOfEvents = 0;
  var addEventAssertions = [];
  var changeEventAssertions = [];

  Node<int> newNode(int i, List<Node<int>> deps) {
    var node = graph.add(i, deps);
    Expect.isTrue(node.data == i);
    Expect.isTrue(graph.nodes.contains(node));
    for (var dep in deps) {
      Expect.isTrue(node.dependencies.contains(dep));
      Expect.isTrue(dep.neededFor.contains(node));
    }

    numberOfEvents++;
    addEventAssertions.add((event) {
      Expect.isTrue(event == node);
      Expect.isTrue(event.data == i);
    });

    return node;
  }

  changeState(Node<int> node, NodeState newState) {
    var oldState = node.state;

    graph.changeState(node, newState);
    Expect.isTrue(node.state == newState);

    numberOfEvents++;
    changeEventAssertions.add((event) {
      Expect.isTrue(event is StateChangedEvent);
      Expect.isTrue(event.node == node);
      Expect.isTrue(event.from == oldState);
      Expect.isTrue(event.to == newState);
    });
  }

  Node<int> node1, node2, node3;

  node1 = newNode(1, []);
  changeState(node1, NodeState.processing);
  node2 = newNode(2, [node1]);
  changeState(node1, NodeState.successful);
  node3 = newNode(3, [node1, node2]);
  changeState(node2, NodeState.failed);
  changeState(node3, NodeState.unableToRun);

  graph.added.take(numberOfEvents).toList().then((events) {
    for (var i = 0; i < events.length; i++) {
      addEventAssertions[i](events[i]);
    }
  });

  graph.changed.take(numberOfEvents).toList().then((events) {
    for (var i = 0; i < events.length; i++) {
      changeEventAssertions[i](events[i]);
    }
  });
}
