// Copyright (c) 2021, 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:stack_trace/stack_trace.dart';

import 'src/backend/closed_exception.dart';
import 'src/backend/invoker.dart';
import 'src/backend/stack_trace_formatter.dart';

class TestHandle {
  /// Returns handle for the currently running test.
  ///
  /// This must be called from within the zone that the test is running in. If
  /// the current zone is not a test's zone throws [OutsideTestException].
  static TestHandle get current {
    final invoker = Invoker.current;
    if (invoker == null) throw OutsideTestException();
    return TestHandle._(
        invoker, StackTraceFormatter.current ?? _defaultFormatter);
  }

  static final _defaultFormatter = StackTraceFormatter();

  final Invoker _invoker;
  final StackTraceFormatter _stackTraceFormatter;
  TestHandle._(this._invoker, this._stackTraceFormatter);

  String get name => _invoker.liveTest.test.name;

  /// Whether this test has already completed successfully.
  ///
  /// If a callback originating from a test case is invoked after the test has
  /// already passed it may be an indication of a test that fails to wait for
  /// all work to be finished, or of an asynchronous callback that is called
  /// more times or later than expected.
  bool get shouldBeDone => _invoker.liveTest.state.shouldBeDone;

  /// Marks this test as skipped.
  ///
  /// A skipped test may still fail if any exception is thrown, including
  /// uncaught asynchronous errors.
  void markSkipped(String message) {
    if (_invoker.closed) throw ClosedException();
    _invoker.skip(message);
  }

  /// Indicates that this test should not be considered done until [future]
  /// completes.
  ///
  /// The test may time out before [future] completes.
  Future<T> mustWaitFor<T>(Future<T> future) {
    if (_invoker.closed) throw ClosedException();
    _invoker.addOutstandingCallback();
    return future.whenComplete(_invoker.removeOutstandingCallback);
  }

  /// Converts [stackTrace] to a [Chain] according to the current test's
  /// configuration.
  Chain formatStackTrace(StackTrace stackTrace) =>
      _stackTraceFormatter.formatStackTrace(stackTrace);
}

class OutsideTestException implements Exception {}

/// An exception thrown when a test assertion fails.
class TestFailure {
  final String? message;

  TestFailure(this.message);

  @override
  String toString() => message.toString();
}
