FunctionResolveTest.php 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. <?php
  2. namespace React\Promise;
  3. use React\Promise\Internal\FulfilledPromise;
  4. use React\Promise\Internal\RejectedPromise;
  5. use Exception;
  6. class FunctionResolveTest extends TestCase
  7. {
  8. /** @test */
  9. public function shouldResolveAnImmediateValue(): void
  10. {
  11. $expected = 123;
  12. $mock = $this->createCallableMock();
  13. $mock
  14. ->expects(self::once())
  15. ->method('__invoke')
  16. ->with(self::identicalTo($expected));
  17. resolve($expected)
  18. ->then(
  19. $mock,
  20. $this->expectCallableNever()
  21. );
  22. }
  23. /** @test */
  24. public function shouldResolveAFulfilledPromise(): void
  25. {
  26. $expected = 123;
  27. $resolved = new FulfilledPromise($expected);
  28. $mock = $this->createCallableMock();
  29. $mock
  30. ->expects(self::once())
  31. ->method('__invoke')
  32. ->with(self::identicalTo($expected));
  33. resolve($resolved)
  34. ->then(
  35. $mock,
  36. $this->expectCallableNever()
  37. );
  38. }
  39. /** @test */
  40. public function shouldResolveAThenable(): void
  41. {
  42. $thenable = new SimpleFulfilledTestThenable();
  43. $mock = $this->createCallableMock();
  44. $mock
  45. ->expects(self::once())
  46. ->method('__invoke')
  47. ->with(self::identicalTo('foo'));
  48. resolve($thenable)
  49. ->then(
  50. $mock,
  51. $this->expectCallableNever()
  52. );
  53. }
  54. /** @test */
  55. public function shouldResolveACancellableThenable(): void
  56. {
  57. $thenable = new SimpleTestCancellableThenable();
  58. $promise = resolve($thenable);
  59. $promise->cancel();
  60. self::assertTrue($thenable->cancelCalled);
  61. }
  62. /** @test */
  63. public function shouldRejectARejectedPromise(): void
  64. {
  65. $exception = new Exception();
  66. $resolved = new RejectedPromise($exception);
  67. $mock = $this->createCallableMock();
  68. $mock
  69. ->expects(self::once())
  70. ->method('__invoke')
  71. ->with(self::identicalTo($exception));
  72. resolve($resolved)
  73. ->then(
  74. $this->expectCallableNever(),
  75. $mock
  76. );
  77. }
  78. /** @test */
  79. public function shouldSupportDeepNestingInPromiseChains(): void
  80. {
  81. $d = new Deferred();
  82. $d->resolve(false);
  83. $result = resolve(resolve($d->promise()->then(function ($val) {
  84. $d = new Deferred();
  85. $d->resolve($val);
  86. $identity = function ($val) {
  87. return $val;
  88. };
  89. return resolve($d->promise()->then($identity))->then(
  90. function ($val) {
  91. return !$val;
  92. }
  93. );
  94. })));
  95. $mock = $this->createCallableMock();
  96. $mock
  97. ->expects(self::once())
  98. ->method('__invoke')
  99. ->with(self::identicalTo(true));
  100. $result->then($mock);
  101. }
  102. /** @test */
  103. public function shouldSupportVeryDeepNestedPromises(): void
  104. {
  105. if (PHP_VERSION_ID < 70200 && ini_get('xdebug.max_nesting_level') !== false) {
  106. $this->markTestSkipped('Skip unhandled rejection on legacy PHP 7.1');
  107. }
  108. $deferreds = [];
  109. for ($i = 0; $i < 150; $i++) {
  110. $deferreds[] = $d = new Deferred();
  111. $p = $d->promise();
  112. $last = $p;
  113. for ($j = 0; $j < 150; $j++) {
  114. $last = $last->then(function ($result) {
  115. return $result;
  116. });
  117. }
  118. }
  119. $p = null;
  120. foreach ($deferreds as $d) {
  121. if ($p) {
  122. $d->resolve($p);
  123. }
  124. $p = $d->promise();
  125. }
  126. $deferreds[0]->resolve(true);
  127. $mock = $this->createCallableMock();
  128. $mock
  129. ->expects(self::once())
  130. ->method('__invoke')
  131. ->with(self::identicalTo(true));
  132. $deferreds[0]->promise()->then($mock);
  133. }
  134. }