ContainerTest.php 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. <?php
  2. /**
  3. * Created by PhpStorm.
  4. * User: LinFei
  5. * Created time 2022/12/14 14:00:56
  6. * E-mail: fly@eyabc.cn
  7. */
  8. declare (strict_types=1);
  9. namespace LinFly\Test;
  10. use LinFly\Container;
  11. use LinFly\Example\TestController;
  12. use LinFly\Example\TestInjectSelf;
  13. use LinFly\FacadeContainer;
  14. use PHPUnit\Framework\TestCase;
  15. use stdClass;
  16. class ContainerTest extends TestCase
  17. {
  18. public function testHasInstance()
  19. {
  20. $this->assertFalse(FacadeContainer::hasInstance('test'));
  21. FacadeContainer::definition('test', new stdClass());
  22. $this->assertTrue(FacadeContainer::hasInstance('test'));
  23. }
  24. public function testInvokeClass()
  25. {
  26. $this->assertInstanceOf(stdClass::class, FacadeContainer::invokeClass(stdClass::class));
  27. }
  28. public function testBindCallbackBeforeCall()
  29. {
  30. $instance = null;
  31. FacadeContainer::bindCallbackBeforeCall(stdClass::class, function ($ins) use (&$instance) {
  32. $instance = $ins;
  33. });
  34. $testInstance = FacadeContainer::newInstance(stdClass::class);
  35. $this->assertInstanceOf(stdClass::class, $instance);
  36. $this->assertInstanceOf(stdClass::class, $testInstance);
  37. }
  38. public function testBindCallbackAfterCall()
  39. {
  40. $instance = null;
  41. FacadeContainer::bindCallbackAfterCall(stdClass::class, function ($ins) use (&$instance) {
  42. $instance = $ins;
  43. });
  44. $testInstance = FacadeContainer::newInstance(stdClass::class);
  45. $this->assertInstanceOf(stdClass::class, $instance);
  46. $this->assertInstanceOf(stdClass::class, $testInstance);
  47. }
  48. public function testIsSingle()
  49. {
  50. $this->assertFalse(FacadeContainer::isSingle(TestExample::class));
  51. FacadeContainer::getSingle(TestExample::class);
  52. $this->assertTrue(FacadeContainer::isSingle(TestExample::class));
  53. }
  54. public function testInvokeFunction()
  55. {
  56. $this->assertEquals('test', FacadeContainer::invokeFunction(function () {
  57. return 'test';
  58. }));
  59. }
  60. public function testGet()
  61. {
  62. $this->assertInstanceOf(Container::class, FacadeContainer::get(Container::class));
  63. }
  64. public function testDefinition()
  65. {
  66. FacadeContainer::definition('definitions', 'TestDefinition');
  67. $this->assertEquals('TestDefinition', FacadeContainer::getDefinition('definitions'));
  68. }
  69. public function testGetDefinition()
  70. {
  71. FacadeContainer::definition('get_definitions', 'TestGetDefinition');
  72. $this->assertEquals('TestGetDefinition', FacadeContainer::getDefinition('get_definitions'));
  73. }
  74. public function testHas()
  75. {
  76. $this->assertTrue(FacadeContainer::has(Container::class));
  77. }
  78. public function testMake()
  79. {
  80. $this->assertInstanceOf(Container::class, FacadeContainer::make(Container::class, newInstance: false));
  81. }
  82. public function testGetSingle()
  83. {
  84. $this->assertInstanceOf(TestExample::class, FacadeContainer::getSingle(TestExample::class));
  85. }
  86. public function testInvokeMethod()
  87. {
  88. $this->assertEquals('test', FacadeContainer::invokeMethod([
  89. TestExample::class,
  90. 'testInvokeMethod'
  91. ]));
  92. }
  93. public function testNewInstance()
  94. {
  95. $this->assertEquals(1, FacadeContainer::getSingle(TestExample::class)->getId());
  96. $this->assertEquals(2, FacadeContainer::newInstance(TestExample::class, [2])->getId());
  97. }
  98. public function testInjectSelf()
  99. {
  100. /** @var TestInjectSelf $instance1 */
  101. $instance1 = FacadeContainer::getSingle(TestInjectSelf::class);
  102. /** @var TestInjectSelf $instance2 */
  103. $instance2 = FacadeContainer::newInstance(TestInjectSelf::class, [2]);
  104. $this->assertEquals(1, $instance1->getId());
  105. $this->assertTrue($instance1->getId() === $instance1->getTestInjectSelf()->getId());
  106. $this->assertEquals(2, $instance2->getId());
  107. $this->assertFalse($instance2->getId() === $instance2->getTestInjectSelf()->getId());
  108. }
  109. public function testController()
  110. {
  111. /** @var TestController $instance */
  112. $instance = FacadeContainer::getSingle(TestController::class);
  113. $info = $instance->info();
  114. $this->assertArrayHasKey('user_info', $info);
  115. $this->assertArrayHasKey('user_order', $info);
  116. }
  117. }
  118. class TestExample
  119. {
  120. public function __construct(private int $id = 1)
  121. {
  122. }
  123. public function testInvokeMethod(): string
  124. {
  125. return 'test';
  126. }
  127. /**
  128. * @return int
  129. */
  130. public function getId(): int
  131. {
  132. return $this->id;
  133. }
  134. }