03-code.t 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187
  1. #!perl -T
  2. use 5.006;
  3. use strict;
  4. use warnings;
  5. use Test::More;
  6. plan tests => 311;
  7. use Perl::Tokenizer qw(perl_tokens);
  8. my @tokens = (
  9. [
  10. 'tr{1{{{}}\}\}\{\{\{\{}3}{1{}/2\}\{{}\}}' => 'transliteration',
  11. ],
  12. [
  13. # The first comment is tricky to parse.
  14. 'tr{} # comment 1
  15. // # comment 2' => ('transliteration', 'horizontal_space', 'comment',)
  16. ],
  17. ['1==2' => ('number', 'operator', 'number')],
  18. ['1!=2' => ('number', 'operator', 'number')],
  19. ['1<=2' => ('number', 'operator', 'number')],
  20. ['1>=2' => ('number', 'operator', 'number')],
  21. ['1>>2' => ('number', 'operator', 'number')],
  22. ['1<<2' => ('number', 'operator', 'number')],
  23. ['1%2' => ('number', 'operator', 'number')],
  24. ['1**2' => ('number', 'operator', 'number')],
  25. ['1^2' => ('number', 'operator', 'number')],
  26. ['1|2' => ('number', 'operator', 'number')],
  27. ['1||2' => ('number', 'operator', 'number')],
  28. ['1&2' => ('number', 'operator', 'number')],
  29. ['1&&2' => ('number', 'operator', 'number')],
  30. ['1//2' => ('number', 'operator', 'number')],
  31. ['1/2' => ('number', 'operator', 'number')],
  32. ['~2' => ('operator', 'number')],
  33. ['++2' => ('operator', 'number')],
  34. ['--2' => ('operator', 'number')],
  35. ['-2' => ('operator', 'number')],
  36. ['+2' => ('operator', 'number')],
  37. ['!2' => ('operator', 'number')],
  38. ['!!2' => ('operator', 'operator', 'number')],
  39. ['+!2' => ('operator', 'operator', 'number')],
  40. ['-!2' => ('operator', 'operator', 'number')],
  41. ['!-2' => ('operator', 'operator', 'number')],
  42. ['!+2' => ('operator', 'operator', 'number')],
  43. ['"a"."b"' => ('double_quoted_string', 'operator', 'double_quoted_string')],
  44. ['"a"&."b"' => ('double_quoted_string', 'operator', 'double_quoted_string')],
  45. ['"a"|."b"' => ('double_quoted_string', 'operator', 'double_quoted_string')],
  46. ['"a"^."b"' => ('double_quoted_string', 'operator', 'double_quoted_string')],
  47. ['~."a"' => ('operator', 'double_quoted_string')],
  48. ['$x<<=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  49. ['$x>>=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  50. ['$x||=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  51. ['$x|=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  52. ['$x=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  53. ['$x-=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  54. ['$x//=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  55. ['$x**=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  56. ['$x%=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  57. ['$x.=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  58. ['$x/=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  59. ['$x^=2' => ('scalar_sigil', 'var_name', 'assignment_operator', 'number')],
  60. [
  61. '$x / 3 / 4' => (
  62. 'scalar_sigil', 'var_name', 'horizontal_space', 'operator', 'horizontal_space', 'number',
  63. 'horizontal_space', 'operator', 'horizontal_space', 'number'
  64. )
  65. ],
  66. [
  67. '$x // 3 // 4' => (
  68. 'scalar_sigil', 'var_name', 'horizontal_space', 'operator', 'horizontal_space', 'number',
  69. 'horizontal_space', 'operator', 'horizontal_space', 'number'
  70. )
  71. ],
  72. [
  73. '$x % 3 / 4' => (
  74. 'scalar_sigil', 'var_name', 'horizontal_space', 'operator', 'horizontal_space', 'number',
  75. 'horizontal_space', 'operator', 'horizontal_space', 'number'
  76. )
  77. ],
  78. [
  79. '$x / 3 - 4' => (
  80. 'scalar_sigil', 'var_name', 'horizontal_space', 'operator', 'horizontal_space', 'number',
  81. 'horizontal_space', 'operator', 'horizontal_space', 'number'
  82. )
  83. ],
  84. [
  85. '$s[0]{tr}[-1]-- > ++$m{ y };' => (
  86. 'scalar_sigil', 'var_name',
  87. 'right_bracket_open', 'number',
  88. 'right_bracket_close', 'curly_bracket_open',
  89. 'bare_word', 'curly_bracket_close',
  90. 'right_bracket_open', 'operator',
  91. 'number', 'right_bracket_close',
  92. 'operator', 'horizontal_space',
  93. 'operator', 'horizontal_space',
  94. 'operator', 'scalar_sigil',
  95. 'var_name', 'curly_bracket_open',
  96. 'horizontal_space', 'bare_word',
  97. 'horizontal_space', 'curly_bracket_close',
  98. 'semicolon',
  99. )
  100. ],
  101. [
  102. '$h{s}++ < 3.14159' => (
  103. 'scalar_sigil', 'var_name', 'curly_bracket_open', 'bare_word',
  104. 'curly_bracket_close', 'operator', 'horizontal_space', 'operator',
  105. 'horizontal_space', 'number'
  106. )
  107. ],
  108. [
  109. 'while(<$fh>){print}' => (
  110. 'keyword', 'parenthesis_open', 'glob_readline', 'parenthesis_close',
  111. 'curly_bracket_open', 'keyword', 'curly_bracket_close'
  112. )
  113. ],
  114. [
  115. '-s $foo;' => ('file_test', 'horizontal_space', 'scalar_sigil', 'var_name', 'semicolon')
  116. ],
  117. [
  118. 'print STDERR 42,"bar"' =>
  119. ('keyword', 'horizontal_space', 'special_fh', 'horizontal_space', 'number', 'comma', 'double_quoted_string')
  120. ],
  121. [
  122. <<'CODE'
  123. my @a = (<<'EOT',<<"EOF",<<EOD); # here-docs
  124. foo
  125. EOT
  126. bar
  127. baz
  128. EOF
  129. qux
  130. EOD
  131. CODE
  132. => (
  133. 'keyword', 'horizontal_space', 'array_sigil', 'var_name',
  134. 'horizontal_space', 'assignment_operator', 'horizontal_space', 'parenthesis_open',
  135. 'heredoc_beg', 'comma', 'heredoc_beg', 'comma',
  136. 'heredoc_beg', 'parenthesis_close', 'semicolon', 'horizontal_space',
  137. 'comment', 'vertical_space', 'heredoc', 'vertical_space',
  138. 'heredoc', 'vertical_space', 'heredoc', 'vertical_space'
  139. )
  140. ],
  141. );
  142. foreach my $group (@tokens) {
  143. my ($code, @names) = @{$group};
  144. perl_tokens {
  145. my ($token) = @_;
  146. is($token, shift(@names));
  147. }
  148. $code;
  149. ok(!@names);
  150. }