ArgumentsReaderTest.php 9.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Framework\Code\Test\Unit\Reader;
  8. require_once __DIR__ . '/_files/ClassesForArgumentsReader.php';
  9. class ArgumentsReaderTest extends \PHPUnit\Framework\TestCase
  10. {
  11. /**
  12. * @var \Magento\Framework\Code\Reader\ArgumentsReader
  13. */
  14. protected $_model;
  15. protected function setUp()
  16. {
  17. $this->_model = new \Magento\Framework\Code\Reader\ArgumentsReader();
  18. }
  19. public function testGetConstructorArgumentsClassWithAllArgumentsType()
  20. {
  21. $expectedResult = [
  22. 'stdClassObject' => [
  23. 'name' => 'stdClassObject',
  24. 'position' => 0,
  25. 'type' => '\stdClass',
  26. 'isOptional' => false,
  27. 'default' => null,
  28. ],
  29. 'withoutConstructorClassObject' => [
  30. 'name' => 'withoutConstructorClassObject',
  31. 'position' => 1,
  32. 'type' => '\ClassWithoutConstruct',
  33. 'isOptional' => false,
  34. 'default' => null,
  35. ],
  36. 'someVariable' => [
  37. 'name' => 'someVariable',
  38. 'position' => 2,
  39. 'type' => 'mixed',
  40. 'isOptional' => false,
  41. 'default' => null,
  42. ],
  43. 'const' => [
  44. 'name' => 'const',
  45. 'position' => 3,
  46. 'type' => 'string',
  47. 'isOptional' => true,
  48. 'default' => 'Const Value',
  49. ],
  50. 'optionalNumValue' => [
  51. 'name' => 'optionalNumValue',
  52. 'position' => 4,
  53. 'type' => 'int',
  54. 'isOptional' => true,
  55. 'default' => 9807,
  56. ],
  57. 'optionalStringValue' => [
  58. 'name' => 'optionalStringValue',
  59. 'position' => 5,
  60. 'type' => 'string',
  61. 'isOptional' => true,
  62. 'default' => 'optional string',
  63. ],
  64. 'optionalArrayValue' => [
  65. 'name' => 'optionalArrayValue',
  66. 'position' => 6,
  67. 'type' => 'array',
  68. 'isOptional' => true,
  69. 'default' => "array('optionalKey' => 'optionalValue')",
  70. ],
  71. ];
  72. $class = new \ReflectionClass('ClassWithAllArgumentTypes');
  73. $actualResult = $this->_model->getConstructorArguments($class);
  74. $this->assertEquals($expectedResult, $actualResult);
  75. }
  76. public function testGetConstructorArgumentsClassWithoutOwnConstructorInheritedFalse()
  77. {
  78. $class = new \ReflectionClass('classWithoutOwnConstruct');
  79. $actualResult = $this->_model->getConstructorArguments($class);
  80. $this->assertEquals([], $actualResult);
  81. }
  82. public function testGetConstructorArgumentsClassWithoutOwnConstructorInheritedTrue()
  83. {
  84. $expectedResult = [
  85. 'stdClassObject' => [
  86. 'name' => 'stdClassObject',
  87. 'position' => 0,
  88. 'type' => '\stdClass',
  89. 'isOptional' => false,
  90. 'default' => null,
  91. ],
  92. 'withoutConstructorClassObject' => [
  93. 'name' => 'withoutConstructorClassObject',
  94. 'position' => 1,
  95. 'type' => '\ClassWithoutConstruct',
  96. 'isOptional' => false,
  97. 'default' => null,
  98. ],
  99. 'someVariable' => [
  100. 'name' => 'someVariable',
  101. 'position' => 2,
  102. 'type' => 'mixed',
  103. 'isOptional' => false,
  104. 'default' => null,
  105. ],
  106. 'const' => [
  107. 'name' => 'const',
  108. 'position' => 3,
  109. 'type' => 'string',
  110. 'isOptional' => true,
  111. 'default' => 'Const Value',
  112. ],
  113. 'optionalNumValue' => [
  114. 'name' => 'optionalNumValue',
  115. 'position' => 4,
  116. 'type' => 'int',
  117. 'isOptional' => true,
  118. 'default' => 9807,
  119. ],
  120. 'optionalStringValue' => [
  121. 'name' => 'optionalStringValue',
  122. 'position' => 5,
  123. 'type' => 'string',
  124. 'isOptional' => true,
  125. 'default' => 'optional string',
  126. ],
  127. 'optionalArrayValue' => [
  128. 'name' => 'optionalArrayValue',
  129. 'position' => 6,
  130. 'type' => 'array',
  131. 'isOptional' => true,
  132. 'default' => "array('optionalKey' => 'optionalValue')",
  133. ],
  134. ];
  135. $class = new \ReflectionClass('ClassWithoutOwnConstruct');
  136. $actualResult = $this->_model->getConstructorArguments($class, false, true);
  137. $this->assertEquals($expectedResult, $actualResult);
  138. }
  139. public function testGetConstructorArgumentsClassWithoutConstructInheridetFalse()
  140. {
  141. $class = new \ReflectionClass('ClassWithoutConstruct');
  142. $actualResult = $this->_model->getConstructorArguments($class);
  143. $this->assertEquals([], $actualResult);
  144. }
  145. public function testGetConstructorArgumentsClassWithoutConstructInheridetTrue()
  146. {
  147. $class = new \ReflectionClass('ClassWithoutConstruct');
  148. $actualResult = $this->_model->getConstructorArguments($class, false, true);
  149. $this->assertEquals([], $actualResult);
  150. }
  151. public function testGetConstructorArgumentsClassExtendsDefaultPhpTypeInheridetFalse()
  152. {
  153. $class = new \ReflectionClass('ClassExtendsDefaultPhpType');
  154. $actualResult = $this->_model->getConstructorArguments($class);
  155. $this->assertEquals([], $actualResult);
  156. }
  157. public function testGetConstructorArgumentsClassExtendsDefaultPhpTypeInheridetTrue()
  158. {
  159. $expectedResult = [
  160. 'message' => [
  161. 'name' => 'message',
  162. 'position' => 0,
  163. 'type' => 'string',
  164. 'isOptional' => true,
  165. 'default' => '',
  166. ],
  167. 'code' => [
  168. 'name' => 'code',
  169. 'position' => 1,
  170. 'type' => 'int',
  171. 'isOptional' => true,
  172. 'default' => 0,
  173. ],
  174. 'previous' => [
  175. 'name' => 'previous',
  176. 'position' => 2,
  177. 'type' => '\Exception',
  178. 'isOptional' => true,
  179. 'default' => null,
  180. ],
  181. ];
  182. $class = new \ReflectionClass('ClassExtendsDefaultPhpTypeWithIOverrideConstructor');
  183. $actualResult = $this->_model->getConstructorArguments($class, false, true);
  184. $this->assertEquals($expectedResult, $actualResult);
  185. }
  186. public function testGetParentCallWithRightArgumentsOrder()
  187. {
  188. $class = new \ReflectionClass('ThirdClassForParentCall');
  189. $actualResult = $this->_model->getParentCall(
  190. $class,
  191. [
  192. 'stdClassObject' => ['type' => '\stdClass'],
  193. 'secondClass' => ['type' => '\ClassExtendsDefaultPhpType']
  194. ]
  195. );
  196. $expectedResult = [
  197. ['name' => 'stdClassObject', 'position' => 0, 'type' => '\stdClass'],
  198. ['name' => 'secondClass', 'position' => 1, 'type' => '\ClassExtendsDefaultPhpType'],
  199. ];
  200. $this->assertEquals($expectedResult, $actualResult);
  201. }
  202. public function testGetParentCallWithWrongArgumentsOrder()
  203. {
  204. $class = new \ReflectionClass('WrongArgumentsOrder');
  205. $actualResult = $this->_model->getParentCall(
  206. $class,
  207. [
  208. 'stdClassObject' => ['type' => '\stdClass'],
  209. 'secondClass' => ['type' => '\ClassExtendsDefaultPhpType']
  210. ]
  211. );
  212. $expectedResult = [
  213. ['name' => 'secondClass', 'position' => 0, 'type' => '\ClassExtendsDefaultPhpType'],
  214. ['name' => 'stdClassObject', 'position' => 1, 'type' => '\stdClass'],
  215. ];
  216. $this->assertEquals($expectedResult, $actualResult);
  217. }
  218. public function testGetParentCallWithSeparateLineFormat()
  219. {
  220. $class = new \ReflectionClass('ThirdClassForParentCall');
  221. $actualResult = $this->_model->getParentCall(
  222. $class,
  223. [
  224. 'stdClassObject' => ['type' => '\stdClass'],
  225. 'secondClass' => ['type' => '\ClassExtendsDefaultPhpType']
  226. ]
  227. );
  228. $expectedResult = [
  229. ['name' => 'stdClassObject', 'position' => 0, 'type' => '\stdClass'],
  230. ['name' => 'secondClass', 'position' => 1, 'type' => '\ClassExtendsDefaultPhpType'],
  231. ];
  232. $this->assertEquals($expectedResult, $actualResult);
  233. }
  234. /**
  235. * @param string $requiredType
  236. * @param string $actualType
  237. * @param bool $expectedResult
  238. * @dataProvider testIsCompatibleTypeDataProvider
  239. */
  240. public function testIsCompatibleType($requiredType, $actualType, $expectedResult)
  241. {
  242. $actualResult = $this->_model->isCompatibleType($requiredType, $actualType);
  243. $this->assertEquals($expectedResult, $actualResult);
  244. }
  245. /**
  246. * @return array
  247. */
  248. public function testIsCompatibleTypeDataProvider()
  249. {
  250. return [
  251. ['array', 10, false],
  252. ['array', 'array', true],
  253. [null, null, true],
  254. [null, 'array', true],
  255. ['\ClassWithAllArgumentTypes', '\ClassWithoutOwnConstruct', true],
  256. ['\ClassWithoutOwnConstruct', '\ClassWithAllArgumentTypes', false]
  257. ];
  258. }
  259. public function testGetAnnotations()
  260. {
  261. $class = new \ReflectionClass('\ClassWithSuppressWarnings');
  262. $expected = ['SuppressWarnings' => 'Magento.TypeDuplication'];
  263. $this->assertEquals($expected, $this->_model->getAnnotations($class));
  264. }
  265. }