Promise.race.js 3.0 KB

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