FunctionRaceTest.php 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. namespace React\Promise;
  3. use Exception;
  4. class FunctionRaceTest extends TestCase
  5. {
  6. /** @test */
  7. public function shouldReturnForeverPendingPromiseForEmptyInput(): void
  8. {
  9. race(
  10. []
  11. )->then($this->expectCallableNever(), $this->expectCallableNever());
  12. }
  13. /** @test */
  14. public function shouldResolveValuesArray(): void
  15. {
  16. $mock = $this->createCallableMock();
  17. $mock
  18. ->expects(self::once())
  19. ->method('__invoke')
  20. ->with(self::identicalTo(1));
  21. race(
  22. [1, 2, 3]
  23. )->then($mock);
  24. }
  25. /** @test */
  26. public function shouldResolvePromisesArray(): void
  27. {
  28. $mock = $this->createCallableMock();
  29. $mock
  30. ->expects(self::once())
  31. ->method('__invoke')
  32. ->with(self::identicalTo(2));
  33. $d1 = new Deferred();
  34. $d2 = new Deferred();
  35. $d3 = new Deferred();
  36. race(
  37. [$d1->promise(), $d2->promise(), $d3->promise()]
  38. )->then($mock);
  39. $d2->resolve(2);
  40. $d1->resolve(1);
  41. $d3->resolve(3);
  42. }
  43. /** @test */
  44. public function shouldResolveSparseArrayInput(): void
  45. {
  46. $mock = $this->createCallableMock();
  47. $mock
  48. ->expects(self::once())
  49. ->method('__invoke')
  50. ->with(self::identicalTo(null));
  51. race(
  52. [null, 1, null, 2, 3]
  53. )->then($mock);
  54. }
  55. /** @test */
  56. public function shouldResolveValuesGenerator(): void
  57. {
  58. $mock = $this->createCallableMock();
  59. $mock
  60. ->expects(self::once())
  61. ->method('__invoke')
  62. ->with(self::identicalTo(1));
  63. $gen = (function () {
  64. for ($i = 1; $i <= 3; ++$i) {
  65. yield $i;
  66. }
  67. })();
  68. race($gen)->then($mock);
  69. }
  70. /** @test */
  71. public function shouldResolveValuesInfiniteGenerator(): void
  72. {
  73. $mock = $this->createCallableMock();
  74. $mock
  75. ->expects(self::once())
  76. ->method('__invoke')
  77. ->with(self::identicalTo(1));
  78. $gen = (function () {
  79. for ($i = 1; ; ++$i) {
  80. yield $i;
  81. }
  82. })();
  83. race($gen)->then($mock);
  84. }
  85. /** @test */
  86. public function shouldRejectIfFirstSettledPromiseRejects(): void
  87. {
  88. $exception = new Exception();
  89. $mock = $this->createCallableMock();
  90. $mock
  91. ->expects(self::once())
  92. ->method('__invoke')
  93. ->with(self::identicalTo($exception));
  94. $d1 = new Deferred();
  95. $d2 = new Deferred();
  96. $d3 = new Deferred();
  97. race(
  98. [$d1->promise(), $d2->promise(), $d3->promise()]
  99. )->then($this->expectCallableNever(), $mock);
  100. $d2->reject($exception);
  101. $d1->resolve(1);
  102. $d3->resolve(3);
  103. }
  104. /** @test */
  105. public function shouldCancelInputArrayPromises(): void
  106. {
  107. $promise1 = new Promise(function () {}, $this->expectCallableOnce());
  108. $promise2 = new Promise(function () {}, $this->expectCallableOnce());
  109. race([$promise1, $promise2])->cancel();
  110. }
  111. /** @test */
  112. public function shouldNotCancelOtherPendingInputArrayPromisesIfOnePromiseFulfills(): void
  113. {
  114. $deferred = new Deferred($this->expectCallableNever());
  115. $deferred->resolve(null);
  116. $promise2 = new Promise(function () {}, $this->expectCallableNever());
  117. race([$deferred->promise(), $promise2])->cancel();
  118. }
  119. /** @test */
  120. public function shouldNotCancelOtherPendingInputArrayPromisesIfOnePromiseRejects(): void
  121. {
  122. $deferred = new Deferred($this->expectCallableNever());
  123. $deferred->reject(new Exception());
  124. $promise2 = new Promise(function () {}, $this->expectCallableNever());
  125. race([$deferred->promise(), $promise2])->cancel();
  126. }
  127. }