PageRenderTime 35ms CodeModel.GetById 9ms RepoModel.GetById 0ms app.codeStats 0ms

/hippy/test/test_phpcompiler.py

https://bitbucket.org/farazdagi/hippyvm
Python | 187 lines | 171 code | 16 blank | 0 comment | 1 complexity | f6c27e5e9fcc4c022848217bea6c43e6 MD5 | raw file
  1. import py
  2. from hippy.test.test_interpreter import BaseTestInterpreter, MockInterpreter
  3. from hippy.test.directrunner import run_php_source, DirectInterpreter
  4. from hippy.phpcompiler import compile_php, PHPLexerWrapper
  5. from hippy.objspace import ObjSpace
  6. class LiteralInterpreter(MockInterpreter):
  7. def run_source(self, source, expected_warnings=[]):
  8. output_w = MockInterpreter.run_source(self, source)
  9. space = self.space
  10. output = [space.str_w(space.as_string(v)) for v in output_w]
  11. return ''.join(output)
  12. def compile(self, source):
  13. return compile_php('<input>', source, self.space, self)
  14. class DirectLiteralInterpreter(DirectInterpreter):
  15. def run_source(self, source, expected_warnings=None):
  16. s = run_php_source(source)
  17. return s
  18. class BaseTestPHP(BaseTestInterpreter):
  19. interpreter = LiteralInterpreter
  20. interpreter_direct = DirectLiteralInterpreter
  21. def test_phplexerwrapper():
  22. phplexerwrapper = PHPLexerWrapper(
  23. 'Foo\n<?php echo 5 ?>\nBar\nBaz\n<? echo')
  24. for expected in [('B_LITERAL_BLOCK', 'Foo\n', 1),
  25. ('T_ECHO', 'echo', 2),
  26. ('T_LNUMBER', '5', 2),
  27. (';', ';', 2),
  28. ('B_LITERAL_BLOCK', 'Bar\nBaz\n', 3),
  29. ('T_ECHO', 'echo', 5)]:
  30. tok = phplexerwrapper.next()
  31. assert (tok.name, tok.value, tok.getsourcepos()) == expected
  32. tok = phplexerwrapper.next()
  33. assert tok is None
  34. def test_line_start_offset():
  35. bc = compile_php('<input>', 'Hi there\n', ObjSpace())
  36. assert bc.startlineno == 1
  37. class TestPHPCompiler(BaseTestPHP):
  38. def test_simple(self):
  39. output = self.run('Foo <?php echo 5; ?> Bar')
  40. assert output == 'Foo 5 Bar'
  41. def test_simple_2(self):
  42. output = self.run('Foo <? echo 5; ?> Bar')
  43. assert output == 'Foo 5 Bar'
  44. output = self.run('Foo<?echo 5;?>Bar')
  45. assert output == 'Foo5Bar'
  46. def test_case_insensitive(self):
  47. output = self.run('Foo <?phP echo 5; ?> Bar')
  48. assert output == 'Foo 5 Bar'
  49. def test_no_php_code(self):
  50. output = self.run('Foo\n')
  51. assert output == 'Foo\n'
  52. output = self.run('\nFoo')
  53. assert output == '\nFoo'
  54. def test_eol_after_closing_tag(self):
  55. output = self.run('Foo <?phP echo 5; ?>\nBar')
  56. assert output == 'Foo 5Bar'
  57. output = self.run('Foo <?phP echo 5; ?> \nBar')
  58. assert output == 'Foo 5 \nBar'
  59. output = self.run('Foo <?phP echo 5; ?>\n')
  60. assert output == 'Foo 5'
  61. output = self.run('Foo <?phP echo 5; ?>\n\n')
  62. assert output == 'Foo 5\n'
  63. output = self.run('Foo <?phP echo 5; ?> \n')
  64. assert output == 'Foo 5 \n'
  65. def test_end_in_comment_ignored_1(self):
  66. output = self.run('Foo <? echo 5; /* ?> */ echo 6; ?> Bar')
  67. assert output == 'Foo 56 Bar'
  68. def test_end_in_comment_not_ignored_1(self):
  69. output = self.run('Foo <? echo 5; //?>\necho 6; ?> Bar')
  70. assert output == 'Foo 5echo 6; ?> Bar'
  71. def test_end_in_comment_not_ignored_2(self):
  72. output = self.run('Foo <? echo 5; #?>\necho 6; ?> Bar')
  73. assert output == 'Foo 5echo 6; ?> Bar'
  74. def test_double_end(self):
  75. output = self.run('<?php echo 5; ?> echo 6; ?>\n')
  76. assert output == '5 echo 6; ?>\n'
  77. def test_multiple_blocks(self):
  78. output = self.run('-<?echo 5;?>+<?echo 6;?>*')
  79. assert output == '-5+6*'
  80. def test_non_closing_last_block_of_code(self):
  81. output = self.run('-<?echo 5;?>+<?echo 6;')
  82. assert output == '-5+6'
  83. def test_missing_semicolon_before_end(self):
  84. output = self.run('-<?echo 5?>+')
  85. assert output == '-5+'
  86. def test_reuse_var(self):
  87. output = self.run('<?$x=5?>----<?echo $x;')
  88. assert output == '----5'
  89. def test_multiple_use_of_block_of_text(self):
  90. output = self.run('<?for($x=0; $x<5; $x++){?>-+-+-\n<?}')
  91. assert output == '-+-+-\n' * 5
  92. def test_automatic_echo_1(self):
  93. output = self.run('abc<?=2+3?>def')
  94. assert output == 'abc5def'
  95. def test_automatic_echo_2(self):
  96. output = self.run('abc<?=2+3,7-1?>def')
  97. assert output == 'abc56def'
  98. def test_automatic_echo_3(self):
  99. output = self.run('abc<?=2+3,7-1; echo 8+1;?>def')
  100. assert output == 'abc569def'
  101. def test_automatic_echo_4(self):
  102. output = self.run('abc<?=2+3?><?=6*7?>def')
  103. assert output == 'abc542def'
  104. def test_automatic_echo_5(self):
  105. py.test.raises(Exception, self.run, 'abc<? =2+3?>def')
  106. def test_automatic_echo_6(self):
  107. output = self.run('abc<?=2+3?>\ndef<?=6*7?> \nghi')
  108. assert output == 'abc5def42 \nghi'
  109. def test_automatic_echo_7(self):
  110. output = self.run('abc<?=2+3;')
  111. assert output == 'abc5'
  112. py.test.raises(Exception, self.run, 'abc<?=2+3')
  113. def test_halt_compiler(self):
  114. output = self.run('abc<?php echo 5;__halt_compiler();]]]]]]]]]]?>def')
  115. assert output == 'abc5'
  116. output = self.run('abc<?php echo 5;__halt_compiler()?>def')
  117. assert output == 'abc5'
  118. output = self.run('abc<?php echo __COMPILER_HALT_OFFSET__;\n'
  119. '__halt_compiler() ;]]]]]]]]]]?>def')
  120. assert output == 'abc59'
  121. output = self.run('abc<?php echo __COMPILER_HALT_OFFSET__;\n'
  122. '__halt_compiler() ?> def')
  123. assert output == 'abc62'
  124. output = self.run('abc<?php echo __COMPILER_HALT_OFFSET__;\n'
  125. '__halt_compiler() ?>\n def')
  126. assert output == 'abc63'
  127. def test_heredoc(self):
  128. output = self.run('''<? $x = <<<PHP
  129. Hello World
  130. PHP;
  131. echo $x;
  132. ?>''')
  133. assert output == 'Hello World'
  134. def test_heredoc_2(self):
  135. output = self.run('''<? $x = <<<PHP
  136. Hello World
  137. 12
  138. ;;
  139. "hello"
  140. 19x333
  141. class var
  142. PHP;
  143. echo $x;
  144. ?>''')
  145. assert output == 'Hello World\n12\n;;\n"hello"\n19x333\nclass var'
  146. def test_heredoc_error(self):
  147. input = '''<? $x = <<<PHP
  148. Hello World
  149. PH;
  150. echo $x;
  151. ?>'''
  152. py.test.raises(Exception, self.run, input)