TokenTest.php 13 KB

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