// Copyright (c) 2011, 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.

part of unittest;

/**
 * Describes the interface used by the unit test system for communicating the
 * results of a test run.
 */
abstract class Configuration {

  /**
   * Creates an instance of [SimpleConfiguration].
   */
  factory Configuration() => new SimpleConfiguration();

  /**
   * If [true], tests are started automatically. Otherwise [runTests]
   * must be called explicitly after tests are set up.
   */
  bool get autoStart;

  /**
   * Called as soon as the unittest framework becomes initialized. This is done
   * even before tests are added to the test framework. It might be used to
   * determine/debug errors that occur before the test harness starts executing.
   * It is also used to tell the vm or browser that tests are going to be run
   * asynchronously and that the process should wait until they are done.
   */
  void onInit();

  /** Called as soon as the unittest framework starts running. */
  void onStart() {}

  /**
   * Called when each test starts. Useful to show intermediate progress on
   * a test suite.
   */
  void onTestStart(TestCase testCase);

  /**
   * Called when each test is first completed. Useful to show intermediate
   * progress on a test suite.
   */
  void onTestResult(TestCase testCase);

  /**
   * Called when an already completed test changes state. For example: a test
   * that was marked as passing may later be marked as being in error because
   * it still had callbacks being invoked.
   */
  void onTestResultChanged(TestCase testCase);

  /**
   * Handles the logging of messages by a test case.
   */
  void onLogMessage(TestCase testCase, String message);

  /**
   * Called when the unittest framework is done running. [success] indicates
   * whether all tests passed successfully.
   */
  void onDone(bool success);

  /**
   * Called with the result of all test cases. Browser tests commonly override
   * this to reformat the output.
   *
   * When [uncaughtError] is not null, it contains an error that occured outside
   * of tests (e.g. setting up the test).
   */
  void onSummary(int passed, int failed, int errors, List<TestCase> results,
      String uncaughtError);
}

