TokenTest.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431
  1. <?php
  2. /*
  3. * This file is part of PHP CS Fixer.
  4. *
  5. * (c) Fabien Potencier <fabien@symfony.com>
  6. * Dariusz Rumiński <dariusz.ruminski@gmail.com>
  7. *
  8. * This source file is subject to the MIT license that is bundled
  9. * with this source code in the file LICENSE.
  10. */
  11. namespace PhpCsFixer\Tests\Tokenizer;
  12. use PhpCsFixer\Tokenizer\Token;
  13. /**
  14. * @author Dariusz Rumiński <dariusz.ruminski@gmail.com>
  15. *
  16. * @internal
  17. */
  18. final class TokenTest extends \PHPUnit_Framework_TestCase
  19. {
  20. public function getBraceToken()
  21. {
  22. return new Token($this->getBraceTokenPrototype());
  23. }
  24. public function getBraceTokenPrototype()
  25. {
  26. return '(';
  27. }
  28. public function getForeachToken()
  29. {
  30. return new Token($this->getForeachTokenPrototype());
  31. }
  32. public function getForeachTokenPrototype()
  33. {
  34. static $prototype = array(T_FOREACH, 'foreach');
  35. return $prototype;
  36. }
  37. public function testClear()
  38. {
  39. $token = $this->getForeachToken();
  40. $token->clear();
  41. $this->assertSame('', $token->getContent());
  42. $this->assertNull($token->getId());
  43. $this->assertFalse($token->isArray());
  44. }
  45. public function testGetPrototype()
  46. {
  47. $this->assertSame($this->getBraceTokenPrototype(), $this->getBraceToken()->getPrototype());
  48. $this->assertSame($this->getForeachTokenPrototype(), $this->getForeachToken()->getPrototype());
  49. }
  50. public function testIsArray()
  51. {
  52. $this->assertFalse($this->getBraceToken()->isArray());
  53. $this->assertTrue($this->getForeachToken()->isArray());
  54. }
  55. /**
  56. * @param Token $token
  57. * @param bool $isCast
  58. *
  59. * @dataProvider provideIsCastCases
  60. */
  61. public function testIsCast(Token $token, $isCast)
  62. {
  63. $this->assertSame($isCast, $token->isCast());
  64. }
  65. public function provideIsCastCases()
  66. {
  67. return array(
  68. array($this->getBraceToken(), false),
  69. array($this->getForeachToken(), false),
  70. array(new Token(array(T_ARRAY_CAST, '(array)', 1)), true),
  71. array(new Token(array(T_BOOL_CAST, '(bool)', 1)), true),
  72. array(new Token(array(T_DOUBLE_CAST, '(double)', 1)), true),
  73. array(new Token(array(T_INT_CAST, '(int)', 1)), true),
  74. array(new Token(array(T_OBJECT_CAST, '(object)', 1)), true),
  75. array(new Token(array(T_STRING_CAST, '(string)', 1)), true),
  76. array(new Token(array(T_UNSET_CAST, '(unset)', 1)), true),
  77. );
  78. }
  79. /**
  80. * @param Token $token
  81. * @param bool $isClassy
  82. *
  83. * @dataProvider provideIsClassyCases
  84. */
  85. public function testIsClassy(Token $token, $isClassy)
  86. {
  87. $this->assertSame($isClassy, $token->isClassy());
  88. }
  89. public function provideIsClassyCases()
  90. {
  91. $cases = array(
  92. array($this->getBraceToken(), false),
  93. array($this->getForeachToken(), false),
  94. array(new Token(array(T_CLASS, 'class', 1)), true),
  95. array(new Token(array(T_INTERFACE, 'interface', 1)), true),
  96. );
  97. if (defined('T_TRAIT')) {
  98. $cases[] = array(new Token(array(T_TRAIT, 'trait', 1)), true);
  99. }
  100. return $cases;
  101. }
  102. /**
  103. * @param Token $token
  104. * @param bool $isComment
  105. *
  106. * @dataProvider provideIsCommentCases
  107. */
  108. public function testIsComment(Token $token, $isComment)
  109. {
  110. $this->assertSame($isComment, $token->isComment());
  111. }
  112. public function provideIsCommentCases()
  113. {
  114. return array(
  115. array($this->getBraceToken(), false),
  116. array($this->getForeachToken(), false),
  117. array(new Token(array(T_COMMENT, '/* comment */', 1)), true),
  118. array(new Token(array(T_DOC_COMMENT, '/** docs */', 1)), true),
  119. );
  120. }
  121. public function testIsEmpty()
  122. {
  123. $braceToken = $this->getBraceToken();
  124. $this->assertFalse($braceToken->isEmpty());
  125. $braceToken->setContent('');
  126. $this->assertTrue($braceToken->isEmpty());
  127. $whitespaceToken = new Token(array(T_WHITESPACE, ' '));
  128. $this->assertFalse($whitespaceToken->isEmpty());
  129. $whitespaceToken->setContent('');
  130. $this->assertTrue($whitespaceToken->isEmpty());
  131. $whitespaceToken->override(array(null, ''));
  132. $this->assertTrue($whitespaceToken->isEmpty());
  133. $whitespaceToken = new Token(array(T_WHITESPACE, ' '));
  134. $whitespaceToken->clear();
  135. $this->assertTrue($whitespaceToken->isEmpty());
  136. }
  137. public function testIsGivenKind()
  138. {
  139. $braceToken = $this->getBraceToken();
  140. $foreachToken = $this->getForeachToken();
  141. $this->assertFalse($braceToken->isGivenKind(T_FOR));
  142. $this->assertFalse($braceToken->isGivenKind(T_FOREACH));
  143. $this->assertFalse($braceToken->isGivenKind(array(T_FOR)));
  144. $this->assertFalse($braceToken->isGivenKind(array(T_FOREACH)));
  145. $this->assertFalse($braceToken->isGivenKind(array(T_FOR, T_FOREACH)));
  146. $this->assertFalse($foreachToken->isGivenKind(T_FOR));
  147. $this->assertTrue($foreachToken->isGivenKind(T_FOREACH));
  148. $this->assertFalse($foreachToken->isGivenKind(array(T_FOR)));
  149. $this->assertTrue($foreachToken->isGivenKind(array(T_FOREACH)));
  150. $this->assertTrue($foreachToken->isGivenKind(array(T_FOR, T_FOREACH)));
  151. }
  152. public function testIsKeywords()
  153. {
  154. $this->assertTrue($this->getForeachToken()->isKeyword());
  155. $this->assertFalse($this->getBraceToken()->isKeyword());
  156. }
  157. /**
  158. * @param int $tokenId
  159. * @param string $content
  160. * @param bool $isConstant
  161. *
  162. * @dataProvider provideMagicConstantCases
  163. */
  164. public function testIsMagicConstant($tokenId, $content, $isConstant = true)
  165. {
  166. $token = new Token(array($tokenId, $content));
  167. $this->assertSame($isConstant, $token->isMagicConstant());
  168. }
  169. public function provideMagicConstantCases()
  170. {
  171. $cases = array(
  172. array(T_CLASS_C, '__CLASS__'),
  173. array(T_DIR, '__DIR__'),
  174. array(T_FILE, '__FILE__'),
  175. array(T_FUNC_C, '__FUNCTION__'),
  176. array(T_LINE, '__LINE__'),
  177. array(T_METHOD_C, '__METHOD__'),
  178. array(T_NS_C, '__NAMESPACE__'),
  179. );
  180. if (defined('T_TRAIT_C')) {
  181. $cases[] = array(T_TRAIT_C, '__TRAIT__');
  182. }
  183. foreach ($cases as $case) {
  184. $cases[] = array($case[0], strtolower($case[1]));
  185. }
  186. foreach (array($this->getForeachToken(), $this->getBraceToken()) as $token) {
  187. $cases[] = array($token->getId(), $token->getContent(), false);
  188. $cases[] = array($token->getId(), strtolower($token->getContent()), false);
  189. }
  190. return $cases;
  191. }
  192. /**
  193. * @param Token $token
  194. * @param bool $isNativeConstant
  195. *
  196. * @dataProvider provideIsNativeConstantCases
  197. */
  198. public function testIsNativeConstant(Token $token, $isNativeConstant)
  199. {
  200. $this->assertSame($isNativeConstant, $token->isNativeConstant());
  201. }
  202. public function provideIsNativeConstantCases()
  203. {
  204. return array(
  205. array($this->getBraceToken(), false),
  206. array($this->getForeachToken(), false),
  207. array(new Token(array(T_STRING, 'null', 1)), true),
  208. array(new Token(array(T_STRING, 'false', 1)), true),
  209. array(new Token(array(T_STRING, 'true', 1)), true),
  210. array(new Token(array(T_STRING, 'tRuE', 1)), true),
  211. array(new Token(array(T_STRING, 'TRUE', 1)), true),
  212. );
  213. }
  214. /**
  215. * @param Token $token
  216. * @param bool $isWhitespace
  217. * @param null|string $whitespaces
  218. *
  219. * @dataProvider provideIsWhitespaceCases
  220. */
  221. public function testIsWhitespace(Token $token, $isWhitespace, $whitespaces = null)
  222. {
  223. if (null !== $whitespaces) {
  224. $this->assertSame($isWhitespace, $token->isWhitespace($whitespaces));
  225. } else {
  226. $this->assertSame($isWhitespace, $token->isWhitespace());
  227. }
  228. }
  229. public function provideIsWhitespaceCases()
  230. {
  231. return array(
  232. array($this->getBraceToken(), false),
  233. array($this->getForeachToken(), false),
  234. array(new Token(' '), true),
  235. array(new Token("\t "), true),
  236. array(new Token("\t "), false, ' '),
  237. array(new Token(array(T_WHITESPACE, "\r", 1)), true),
  238. array(new Token(array(T_WHITESPACE, "\0", 1)), true),
  239. array(new Token(array(T_WHITESPACE, "\x0B", 1)), true),
  240. array(new Token(array(T_WHITESPACE, "\n", 1)), true),
  241. array(new Token(array(T_WHITESPACE, "\n", 1)), false, " \t"),
  242. );
  243. }
  244. public function testPropertiesOfArrayToken()
  245. {
  246. $prototype = $this->getForeachTokenPrototype();
  247. $token = $this->getForeachToken();
  248. $this->assertSame($prototype[0], $token->getId());
  249. $this->assertSame($prototype[1], $token->getContent());
  250. $this->assertTrue($token->isArray());
  251. }
  252. public function testPropertiesOfNonArrayToken()
  253. {
  254. $prototype = $this->getBraceTokenPrototype();
  255. $token = $this->getBraceToken();
  256. $this->assertSame($prototype, $token->getContent());
  257. $this->assertNull($token->getId());
  258. $this->assertFalse($token->isArray());
  259. }
  260. public function testEqualsDefaultIsCaseSensitive()
  261. {
  262. $token = new Token(array(T_FUNCTION, 'function', 1));
  263. $this->assertTrue($token->equals(array(T_FUNCTION, 'function')));
  264. $this->assertFalse($token->equals(array(T_FUNCTION, 'Function')));
  265. }
  266. /**
  267. * @param Token $token
  268. * @param string $equals
  269. * @param Token|array|string $other
  270. * @param bool $caseSensitive
  271. *
  272. * @dataProvider provideEquals
  273. */
  274. public function testEquals(Token $token, $equals, $other, $caseSensitive = true)
  275. {
  276. $this->assertSame($equals, $token->equals($other, $caseSensitive));
  277. }
  278. public function provideEquals()
  279. {
  280. $brace = $this->getBraceToken();
  281. $function = new Token(array(T_FUNCTION, 'function', 1));
  282. return array(
  283. array($brace, false, '!'),
  284. array($brace, false, '!', false),
  285. array($brace, true, '('),
  286. array($brace, true, '(', false),
  287. array($function, false, '('),
  288. array($function, false, '(', false),
  289. array($function, false, array(T_NAMESPACE)),
  290. array($function, false, array(T_NAMESPACE), false),
  291. array($function, false, array(T_VARIABLE, 'function')),
  292. array($function, false, array(T_VARIABLE, 'function'), false),
  293. array($function, false, array(T_VARIABLE, 'Function')),
  294. array($function, false, array(T_VARIABLE, 'Function'), false),
  295. array($function, true, array(T_FUNCTION)),
  296. array($function, true, array(T_FUNCTION), false),
  297. array($function, true, array(T_FUNCTION, 'function')),
  298. array($function, true, array(T_FUNCTION, 'function'), false),
  299. array($function, false, array(T_FUNCTION, 'Function')),
  300. array($function, true, array(T_FUNCTION, 'Function'), false),
  301. array($function, false, array(T_FUNCTION, 'junction'), false),
  302. array($function, true, new Token(array(T_FUNCTION, 'function'))),
  303. array($function, false, new Token(array(T_FUNCTION, 'Function'))),
  304. array($function, true, new Token(array(T_FUNCTION, 'Function')), false),
  305. // if it is an array any additional field is checked too
  306. array($function, false, array(T_FUNCTION, 'function', 'unexpected')),
  307. );
  308. }
  309. public function testEqualsAnyDefaultIsCaseSensitive()
  310. {
  311. $token = new Token(array(T_FUNCTION, 'function', 1));
  312. $this->assertTrue($token->equalsAny(array(array(T_FUNCTION, 'function'))));
  313. $this->assertFalse($token->equalsAny(array(array(T_FUNCTION, 'Function'))));
  314. }
  315. /**
  316. * @param bool $equalsAny
  317. * @param array $other
  318. * @param bool $caseSensitive
  319. *
  320. * @dataProvider provideEqualsAny
  321. */
  322. public function testEqualsAny($equalsAny, array $other, $caseSensitive = true)
  323. {
  324. $token = new Token(array(T_FUNCTION, 'function', 1));
  325. $this->assertSame($equalsAny, $token->equalsAny($other, $caseSensitive));
  326. }
  327. public function provideEqualsAny()
  328. {
  329. $brace = $this->getBraceToken();
  330. $foreach = $this->getForeachToken();
  331. return array(
  332. array(false, array()),
  333. array(false, array($brace)),
  334. array(false, array($brace, $foreach)),
  335. array(true, array($brace, $foreach, array(T_FUNCTION))),
  336. array(true, array($brace, $foreach, array(T_FUNCTION, 'function'))),
  337. array(false, array($brace, $foreach, array(T_FUNCTION, 'Function'))),
  338. array(true, array($brace, $foreach, array(T_FUNCTION, 'Function')), false),
  339. array(false, array(array(T_VARIABLE, 'junction'), array(T_FUNCTION, 'junction')), false),
  340. );
  341. }
  342. /**
  343. * @param bool $isKeyCaseSensitive
  344. * @param bool|array $caseSensitive
  345. * @param int $key
  346. *
  347. * @dataProvider provideIsKeyCaseSensitive
  348. */
  349. public function testIsKeyCaseSensitive($isKeyCaseSensitive, $caseSensitive, $key)
  350. {
  351. $this->assertSame($isKeyCaseSensitive, Token::isKeyCaseSensitive($caseSensitive, $key));
  352. }
  353. public function provideIsKeyCaseSensitive()
  354. {
  355. return array(
  356. array(true, true, 0),
  357. array(true, true, 1),
  358. array(true, array(), 0),
  359. array(true, array(true), 0),
  360. array(true, array(false, true), 1),
  361. array(true, array(false, true, false), 1),
  362. array(true, array(false), 10),
  363. array(false, false, 10),
  364. array(false, array(false), 0),
  365. array(false, array(true, false), 1),
  366. array(false, array(true, false, true), 1),
  367. array(false, array(1 => false), 1),
  368. );
  369. }
  370. }