Promise.any.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. test("length is 1", () => {
  2. expect(Promise.any).toHaveLength(1);
  3. });
  4. describe("normal behavior", () => {
  5. test("returns a Promise", () => {
  6. const promise = Promise.any();
  7. expect(promise).toBeInstanceOf(Promise);
  8. });
  9. test("all resolve", () => {
  10. const promise1 = Promise.resolve(3);
  11. const promise2 = 42;
  12. const promise3 = new Promise((resolve, reject) => {
  13. resolve("foo");
  14. });
  15. let resolvedValues = null;
  16. let wasRejected = false;
  17. Promise.any([promise1, promise2, promise3]).then(
  18. values => {
  19. resolvedValues = values;
  20. },
  21. () => {
  22. wasRejected = true;
  23. }
  24. );
  25. runQueuedPromiseJobs();
  26. expect(resolvedValues).toBe(3);
  27. expect(wasRejected).toBeFalse();
  28. });
  29. test("last resolve", () => {
  30. const promise1 = Promise.reject(3);
  31. const promise2 = new Promise((resolve, reject) => {
  32. resolve("foo");
  33. });
  34. let resolvedValues = null;
  35. let wasRejected = false;
  36. Promise.any([promise1, promise2]).then(
  37. values => {
  38. resolvedValues = values;
  39. },
  40. () => {
  41. wasRejected = true;
  42. }
  43. );
  44. runQueuedPromiseJobs();
  45. expect(resolvedValues).toBe("foo");
  46. expect(wasRejected).toBeFalse();
  47. });
  48. test("reject", () => {
  49. const promise1 = Promise.reject(3);
  50. const promise2 = new Promise((resolve, reject) => {
  51. reject("foo");
  52. });
  53. let rejectionReason = null;
  54. let wasResolved = false;
  55. Promise.any([promise1, promise2]).then(
  56. () => {
  57. wasResolved = true;
  58. },
  59. reason => {
  60. rejectionReason = reason;
  61. }
  62. );
  63. runQueuedPromiseJobs();
  64. expect(rejectionReason).toBeInstanceOf(AggregateError);
  65. expect(wasResolved).toBeFalse();
  66. });
  67. });
  68. describe("exceptional behavior", () => {
  69. test("cannot invoke capabilities executor twice", () => {
  70. function fn() {}
  71. expect(() => {
  72. function promise(executor) {
  73. executor(fn, fn);
  74. executor(fn, fn);
  75. }
  76. Promise.any.call(promise, []);
  77. }).toThrow(TypeError);
  78. expect(() => {
  79. function promise(executor) {
  80. executor(fn, undefined);
  81. executor(fn, fn);
  82. }
  83. Promise.any.call(promise, []);
  84. }).toThrow(TypeError);
  85. expect(() => {
  86. function promise(executor) {
  87. executor(undefined, fn);
  88. executor(fn, fn);
  89. }
  90. Promise.any.call(promise, []);
  91. }).toThrow(TypeError);
  92. });
  93. test("promise without resolve method", () => {
  94. expect(() => {
  95. function promise(executor) {}
  96. Promise.any.call(promise, []);
  97. }).toThrow(TypeError);
  98. });
  99. test("no parameters", () => {
  100. let rejectionReason = null;
  101. Promise.any().catch(reason => {
  102. rejectionReason = reason;
  103. });
  104. runQueuedPromiseJobs();
  105. expect(rejectionReason).toBeInstanceOf(TypeError);
  106. });
  107. test("non-iterable", () => {
  108. let rejectionReason = null;
  109. Promise.any(1).catch(reason => {
  110. rejectionReason = reason;
  111. });
  112. runQueuedPromiseJobs();
  113. expect(rejectionReason).toBeInstanceOf(TypeError);
  114. });
  115. test("empty list", () => {
  116. let rejectionReason = null;
  117. Promise.any([]).catch(reason => {
  118. rejectionReason = reason;
  119. });
  120. runQueuedPromiseJobs();
  121. expect(rejectionReason).toBeInstanceOf(AggregateError);
  122. });
  123. });