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

/// A minimal, dependency-free emulation layer for a subset of the
/// unittest/test API used by the language and core library.
///
/// Compared with `minitest.dart`, this library supports and expects
/// asynchronous tests. It uses a `Zone` per test to collect errors in the
/// correct test.
/// It does not support `setUp` or `tearDown` methods,
/// and matchers are severely restricted.
///
/// A number of our language and core library tests were written against the
/// unittest package, which is now deprecated in favor of the new test package.
/// The latter is much better feature-wise, but is also quite complex and has
/// many dependencies. For low-level language and core library tests, we don't
/// want to have to pull in a large number of dependencies and be able to run
/// them correctly in order to run a test, so we want to test them against
/// something simpler.
///
/// When possible, we just use the tiny expect library. But to avoid rewriting
/// all of the existing tests that use unittest, they can instead use this,
/// which shims the unittest API with as little code as possible and calls into
/// expect.
///
/// Eventually, it would be good to refactor those tests to use the expect
/// package directly and remove this.
import 'dart:async';

import 'package:async_helper/async_helper.dart';
import 'package:expect/expect.dart';

void group(String name, body()) {
  var oldName = _pushName(name);
  try {
    body();
  } finally {
    _popName(oldName);
  }
}

void test(String name, body()) {
  var oldName = _pushName(name);
  var test = new _Test(_currentName)..asyncWait();
  var result =
      runZoned(body, zoneValues: {_testToken: test}, onError: test.fail);
  if (result is Future) {
    result.then((_) {
      test.asyncDone();
    }, onError: test.fail);
  } else {
    // Ensure all tests get to be set up first.
    scheduleMicrotask(test.asyncDone);
  }
  _popName(oldName);
}

void expect(dynamic value, dynamic matcher, {String reason}) {
  Matcher m;
  if (matcher is _Matcher) {
    m = matcher.call;
  } else if (matcher is! Matcher) {
    m = equals(matcher);
  } else {
    m = matcher;
  }
  m(value);
}

R Function() expectAsync0<R>(R Function() f, {int count = 1}) {
  var test = _currentTest..asyncWait(count);
  return () {
    var result = f();
    test.asyncDone();
    return result;
  };
}

R Function(A) expectAsync1<R, A>(R Function(A) f, {int count = 1}) {
  var test = _currentTest..asyncWait(count);
  return (A a) {
    var result = f(a);
    test.asyncDone();
    return result;
  };
}

R Function(A, B) expectAsync2<R, A, B>(R Function(A, B) f, {int count = 1}) {
  var test = _currentTest..asyncWait(count);
  return (A a, B b) {
    var result = f(a, b);
    test.asyncDone();
    return result;
  };
}

dynamic expectAsync(Function f, {int count = 1}) {
  var f2 = f; // Avoid type-promoting f, we want dynamic invocations.
  var test = _currentTest;
  if (f2 is Function(Null, Null, Null, Null, Null)) {
    test.asyncWait(count);
    return ([a, b, c, d, e]) {
      var result = f(a, b, c, d, e);
      test.asyncDone();
      return result;
    };
  }
  if (f2 is Function(Null, Null, Null, Null)) {
    test.asyncWait(count);
    return ([a, b, c, d]) {
      var result = f(a, b, c, d);
      test.asyncDone();
      return result;
    };
  }
  if (f2 is Function(Null, Null, Null)) {
    test.asyncWait(count);
    return ([a, b, c]) {
      var result = f(a, b, c);
      test.asyncDone();
      return result;
    };
  }
  if (f2 is Function(Null, Null)) {
    test.asyncWait(count);
    return ([a, b]) {
      var result = f(a, b);
      test.asyncDone();
      return result;
    };
  }
  if (f2 is Function(Null)) {
    test.asyncWait(count);
    return ([a]) {
      var result = f(a);
      test.asyncDone();
      return result;
    };
  }
  if (f2 is Function()) {
    test.asyncWait(count);
    return () {
      var result = f();
      test.asyncDone();
      return result;
    };
  }
  throw new UnsupportedError(
      "expectAsync only accepts up to five arguemnt functions");
}

// Matchers
typedef Matcher = void Function(Object);

Matcher same(Object o) => (v) {
      Expect.identical(o, v);
    };

Matcher equals(Object o) => (v) {
      Expect.deepEquals(o, v);
    };

Matcher greaterThan(num n) => (Object v) {
      Expect.type<num>(v);
      num value = v;
      if (value > n) return;
      Expect.fail("$v is not greater than $n");
    };

Matcher greaterThanOrEqualTo(num n) => (Object v) {
      Expect.type<num>(v);
      num value = v;
      if (value >= n) return;
      Expect.fail("$v is not greater than $n");
    };

Matcher lessThan(num n) => (Object v) {
      Expect.type<num>(v);
      num value = v;
      if (value < n) return;
      Expect.fail("$v is not less than $n");
    };

Matcher lessThanOrEqualTo(num n) => (Object v) {
      Expect.type<num>(v);
      num value = v;
      if (value <= n) return;
      Expect.fail("$v is not less than $n");
    };

void isTrue(Object v) {
  Expect.isTrue(v);
}

void isFalse(Object v) {
  Expect.isFalse(v);
}

void isNull(Object o) {
  Expect.isNull(o);
}

bool isStateError(Object o) {
  Expect.type<StateError>(o);
}

void _checkThrow<T>(Object v, void onError(error)) {
  if (v is Future) {
    var test = _currentTest..asyncWait();
    v.then((_) {
      Expect.fail("Did not throw");
    }, onError: (e, s) {
      if (e is! T) throw e;
      if (onError != null) onError(e);
      test.asyncDone();
    });
    return;
  }
  Expect.throws<T>(v, (e) {
    onError(e);
    return true;
  });
}

void throws(Object v) {
  _checkThrow<Object>(v, null);
}

Matcher throwsA(matcher) => (Object o) {
      _checkThrow<Object>(o, (Object error) {
        expect(error, matcher);
      });
    };

Matcher completion(matcher) => (Object o) {
      Expect.type<Future>(o);
      Future future = o;
      _currentTest.asyncWait();
      future.then((value) {
        expect(value, matcher);
        _currentTest.asyncDone();
      });
    };

void completes(Object o) {
  Expect.type<Future>(o);
  Future future = o;
  _currentTest.asyncWait();
  future.then((_) {
    _currentTest.asyncDone();
  });
}

void isMap(Object o) {
  Expect.type<Map>(o);
}

void isList(Object o) {
  Expect.type<List>(o);
}

void isNotNull(Object o) {
  Expect.isNotNull(o);
}

abstract class _Matcher {
  void call(Object o);
}

class isInstanceOf<T> implements _Matcher {
  void call(Object o) {
    Expect.type<T>(o);
  }
}

void throwsArgumentError(Object v) {
  _checkThrow<ArgumentError>(v, null);
}

String fail(String message) {
  Expect.fail("$message");
}

// Internal helpers.

// The current combined name of the nesting [group] or [test].
String _currentName = null;

String _pushName(String newName) {
  var oldName = _currentName;
  if (oldName == null) {
    _currentName = newName;
  } else {
    _currentName = "$oldName $newName";
  }
  return oldName;
}

void _popName(String oldName) {
  _currentName = oldName;
}

// Key for zone value holding current test object.
final Object _testToken = new Object();

_Test get _currentTest =>
    Zone.current[_testToken] ?? (throw new StateError("Not inside test!"));

class _Test {
  static int activeTests = 0;
  static int failedTests = 0;

  final String name;
  bool completed = false;
  bool failed = false;
  int asyncExpected = 0;
  _Test(this.name) {
    activeTests++;
  }

  void asyncWait([int n = 1]) {
    if (completed) {
      print("ERROR: $name: New operations started after completion."
          "${StackTrace.current}");
    } else if (asyncExpected == 0) {
      asyncStart(); // Matched by asyncEnd in [_complete];
    }
    asyncExpected += n;
  }

  void asyncDone() {
    if (asyncExpected == 0) {
      print("ERROR: $name: More asyncEnds than asyncStarts.\n"
          "${StackTrace.current}");
    } else {
      asyncExpected--;
      if (asyncExpected == 0 && !completed) {
        print("SUCCESS: $name");
        _complete();
      }
    }
  }

  void fail(Object error, StackTrace stack) {
    if (!completed) {
      failed = true;
      failedTests++;
      print("FAILURE: $name: $error\n$stack");
      _complete();
    } else {
      if (!failed) {
        failed = true;
        failedTests++;
      }
      print("FAILURE: $name: (after completion) $error\n$stack");
    }
  }

  void _complete() {
    assert(!completed);
    completed = true;
    activeTests--;
    if (failedTests == 0) {
      asyncEnd();
    } else if (activeTests == 0) {
      Zone.root.scheduleMicrotask(() {
        Expect.fail("$failedTests tests failed");
      });
    }
  }
}
