// Copyright 2018 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

(function() {
  let resolve;
  let onFulfilledValue;
  const p = new Promise(r => resolve = r);
  resolve(Promise.resolve(1));
  p.then(
      v => {
        onFulfilledValue = v;
      },
      e => {
        assertUnreachable();
      });
  setTimeout(_ => assertEquals(1, onFulfilledValue));
})();

(function() {
  let resolve;
  let onRejectedReason;
  const p = new Promise(r => resolve = r);
  resolve(Promise.reject(1));
  p.then(
      v => {
        assertUnreachable();
      },
      e => {
        onRejectedReason = e;
      });
  setTimeout(_ => assertEquals(1, onRejectedReason));
})();

(function() {
  let onFulfilledValue;
  (async () => Promise.resolve(1))().then(
      v => {
        onFulfilledValue = v;
      },
      e => {
        assertUnreachable();
      });
  setTimeout(_ => assertEquals(1, onFulfilledValue));
})();

(function() {
  let onRejectedReason;
  (async () => Promise.reject(1))().then(
      v => {
        assertUnreachable();
      },
      e => {
        onRejectedReason = e;
      });
  setTimeout(_ => assertEquals(1, onRejectedReason));
})();

(function() {
  let resolve;
  let onFulfilledValue;
  const p = new Promise(r => resolve = r);
  resolve({
    then(onFulfilled, onRejected) {
      onFulfilled(1);
    }
  });
  p.then(
      v => {
        onFulfilledValue = v;
      },
      e => {
        assertUnreachable();
      });
  setTimeout(_ => assertEquals(1, onFulfilledValue));
})();

(function() {
  let resolve;
  let onRejectedReason;
  const p = new Promise(r => resolve = r);
  resolve({
    then(onFulfilled, onRejected) {
      onRejected(1);
    }
  });
  p.then(
      v => {
        assertUnreachable();
      },
      e => {
        onRejectedReason = e;
      });
  setTimeout(_ => assertEquals(1, onRejectedReason));
})();

(function() {
  let onFulfilledValue;
  (async () => ({
    then(onFulfilled, onRejected) {
      onFulfilled(1);
    }
  }))().then(
      v => {
        onFulfilledValue = v;
      },
      e => {
        assertUnreachable();
      });
  setTimeout(_ => assertEquals(1, onFulfilledValue));
})();

(function() {
  let onRejectedReason;
  (async () => ({
    then(onFulfilled, onRejected) {
      onRejected(1);
    }
  }))().then(
      v => {
        assertUnreachable();
      },
      e => {
        onRejectedReason = e;
      });
  setTimeout(_ => assertEquals(1, onRejectedReason));
})();