promise-any.js 3.07 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
// Copyright 2020 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.
//
// Flags: --allow-natives-syntax --harmony-promise-any

load('test/mjsunit/test-async.js');

(function() {
  testAsync(assert => {
    assert.plan(1);
    Promise.any([]).then(
      assert.unreachable,
      (x) => { assert.equals(0, x.errors.length); }
    );
  });
})();

(function() {
  const p1 = Promise.resolve(1);
  const p2 = Promise.resolve(2);
  const p3 = Promise.resolve(3);
  testAsync(assert => {
    assert.plan(1);
    Promise.any([p1, p2, p3]).then(
      (x) => { assert.equals(1, x); },
      assert.unreachable);
    });
})();

(function() {
  let outsideResolve;
  let outsideReject;
  let p1 = new Promise(() => {});
  let p2 = new Promise(function(resolve, reject) {
      outsideResolve = resolve;
      outsideReject = reject;
  });
  let p3 = new Promise(() => {});
  testAsync(assert => {
    assert.plan(1);
    Promise.any([p1, p2, p3]).then(
      (x) => { assert.equals(2, x); },
      assert.unreachable
    );
    outsideResolve(2);
    });
})();

(function() {
  const p1 = Promise.reject(1);
  const p2 = Promise.resolve(2);
  const p3 = Promise.resolve(3);
  testAsync(assert => {
    assert.plan(1);
    Promise.any([p1, p2, p3]).then(
      (x) => { assert.equals(2, x); },
      assert.unreachable);
    });
})();

(function() {
  const p1 = Promise.reject(1);
  const p2 = Promise.reject(2);
  const p3 = Promise.reject(3);
  testAsync(assert => {
    assert.plan(4);
    Promise.any([p1, p2, p3]).then(
      assert.unreachable,
      (x) => {
        assert.equals(3, x.errors.length);
        assert.equals(1, x.errors[0]);
        assert.equals(2, x.errors[1]);
        assert.equals(3, x.errors[2]);
      }
    );
  });
})();

(function() {
  testAsync(assert => {
    assert.plan(1);
    (async function() {
      const p1 = Promise.reject(1);
      const p2 = Promise.reject(2);
      const p3 = Promise.reject(3);
      try {
        await Promise.any([p1, p2, p3]);
      } catch (error) {
        assert.equals(1, 1);
      }
    })();
  });
})();
95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118

// Test that we return a proper array even if (custom) "then" invokes the
// reject callbacks right away.
(function() {
  class MyPromise extends Promise {
    constructor(executor, id) {
      super(executor);
      this.id = id;
    }

    then(resolve, reject) {
      if (this.id) return reject(this.id);
      return super.then(resolve, reject)
    }
  };
  const a = new MyPromise(() => {}, 'a');
  const b = new MyPromise(() => {}, 'b');
  testAsync(assert => {
    assert.plan(1);
    MyPromise.any([a, b]).then(
      assert.unreachable,
        (e) => { assert.equals(['a', 'b'], e.errors) });
  });
})();
119 120 121 122 123 124 125 126 127 128 129 130 131

(function TestErrorsProperties() {
  testAsync(assert => {
    assert.plan(3);
    Promise.any([]).catch(
      (error) =>  {
        let desc = Object.getOwnPropertyDescriptor(error, 'errors');
        assert.equals(true, desc.configurable);
        assert.equals(false, desc.enumerable);
        assert.equals(true, desc.writable);
    });
  });
})();