// 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.

// @dart = 2.9

@JS()
library js_util_async_test;

import 'dart:async';

import 'package:js/js.dart';
import 'package:js/js_util.dart' as js_util;
import 'package:expect/minitest.dart';
import 'package:async_helper/async_helper.dart';

@JS()
external void eval(String code);

@JS()
abstract class Promise<T> {}

@JS()
external Promise get resolvedPromise;

@JS()
external Promise get rejectedPromise;

@JS()
external Promise getResolvedPromise();

main() {
  eval(r"""
    var rejectedPromise = new Promise((resolve, reject) => reject('rejected'));
    var resolvedPromise = new Promise(resolve => resolve('resolved'));
    function getResolvedPromise() {
      return resolvedPromise;
    }
    """);

  Future<void> testResolvedPromise() async {
    final String result = await js_util.promiseToFuture(resolvedPromise);
    expect(result, equals('resolved'));
  }

  Future<void> testRejectedPromise() async {
    asyncExpectThrows<String>(() => js_util.promiseToFuture(rejectedPromise),
        (String error) => error == 'rejected');
  }

  Future<void> testReturnResolvedPromise() async {
    final String result = await js_util.promiseToFuture(getResolvedPromise());
    expect(result, equals('resolved'));
  }

  asyncTest(() async {
    await testResolvedPromise();
    await testRejectedPromise();
    await testReturnResolvedPromise();
  });
}
