race.js 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. var failIfThrows = function (done) {
  2. 'use strict';
  3. return function (e) {
  4. done(e || new Error());
  5. };
  6. };
  7. var delayPromise = function (value, ms) {
  8. 'use strict';
  9. return new Promise(function (resolve) {
  10. setTimeout(function () {
  11. resolve(value);
  12. }, ms);
  13. });
  14. };
  15. describe('Promise.race', function () {
  16. 'use strict';
  17. it('should not be enumerable', function () {
  18. expect(Promise).ownPropertyDescriptor('race').to.have.property('enumerable', false);
  19. });
  20. it('should fulfill if all promises are settled and the ordinally-first is fulfilled', function (done) {
  21. var iterable = [Promise.resolve(1), Promise.reject(2), Promise.resolve(3)];
  22. Promise.race(iterable).then(function (value) {
  23. assert.strictEqual(value, 1);
  24. }).then(done, failIfThrows(done));
  25. });
  26. it('should reject if all promises are settled and the ordinally-first is rejected', function (done) {
  27. var iterable = [Promise.reject(1), Promise.reject(2), Promise.resolve(3)];
  28. Promise.race(iterable).then(
  29. function () {
  30. assert(false, 'should never get here');
  31. },
  32. function (reason) {
  33. assert.strictEqual(reason, 1);
  34. }
  35. ).then(done, failIfThrows(done));
  36. });
  37. it('should settle in the same way as the first promise to settle', function (done) {
  38. // ensure that even if timeouts are delayed an all execute together,
  39. // p2 will settle first.
  40. var p2 = delayPromise(2, 200);
  41. var p1 = delayPromise(1, 1000);
  42. var p3 = delayPromise(3, 500);
  43. var iterable = [p1, p2, p3];
  44. Promise.race(iterable).then(function (value) {
  45. assert.strictEqual(value, 2);
  46. }).then(done, failIfThrows(done));
  47. });
  48. // see https://github.com/domenic/promises-unwrapping/issues/75
  49. it('should never settle when given an empty iterable', function (done) {
  50. var iterable = [];
  51. var settled = false;
  52. Promise.race(iterable).then(
  53. function () { settled = true; },
  54. function () { settled = true; }
  55. );
  56. setTimeout(function () {
  57. assert.strictEqual(settled, false);
  58. done();
  59. }, 300);
  60. });
  61. it('should reject with a TypeError if given a non-iterable', function (done) {
  62. var notIterable = {};
  63. Promise.race(notIterable).then(
  64. function () {
  65. assert(false, 'should never get here');
  66. },
  67. function (reason) {
  68. assert(reason instanceof TypeError);
  69. }
  70. ).then(done, failIfThrows(done));
  71. });
  72. });