// 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 {
    final String error = await asyncExpectThrows<String>(
        js_util.promiseToFuture(rejectedPromise));
    expect(error, equals('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();
  });
}
