/* +----------------------------------------------------------------------+ | HipHop for PHP | +----------------------------------------------------------------------+ | Copyright (c) 2010- Facebook, Inc. (http://www.facebook.com) | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ */ #include #include #include #include #include /////////////////////////////////////////////////////////////////////////////// bool TestParserStmt::RunTests(const std::string &which) { bool ret = true; RUN_TEST(TestFunctionStatement); RUN_TEST(TestClassStatement); RUN_TEST(TestInterfaceStatement); RUN_TEST(TestClassVariable); RUN_TEST(TestClassConstant); RUN_TEST(TestMethodStatement); RUN_TEST(TestStatementList); RUN_TEST(TestBlockStatement); RUN_TEST(TestIfBranchStatement); RUN_TEST(TestIfStatement); RUN_TEST(TestWhileStatement); RUN_TEST(TestDoStatement); RUN_TEST(TestForStatement); RUN_TEST(TestSwitchStatement); RUN_TEST(TestCaseStatement); RUN_TEST(TestBreakStatement); RUN_TEST(TestContinueStatement); RUN_TEST(TestReturnStatement); RUN_TEST(TestGlobalStatement); RUN_TEST(TestStaticStatement); RUN_TEST(TestEchoStatement); RUN_TEST(TestUnsetStatement); RUN_TEST(TestExpStatement); RUN_TEST(TestForEachStatement); RUN_TEST(TestCatchStatement); RUN_TEST(TestTryStatement); RUN_TEST(TestThrowStatement); RUN_TEST(TestGotoStatement); RUN_TEST(TestYieldStatement); RUN_TEST(TestUseTraitStatement); return ret; } /////////////////////////////////////////////////////////////////////////////// bool TestParserStmt::TestFunctionStatement() { V("1);", "if (a > 1) {}\n"); V("1) {}", "if (a > 1) {\n}\n"); V("1) { return;}", "if (a > 1) {\nreturn;\n}\n"); V("1) { return; return 2;}", "if (a > 1) {\nreturn;\nreturn 2;\n}\n"); V("1); else;", "if (a > 1) {}\n"); V("1); else {}", "if (a > 1) {}\nelse {\n}\n"); V("1); else { return;}", "if (a > 1) {}\nelse {\nreturn;\n}\n"); V("1); else { return; return 2;}", "if (a > 1) {}\nelse {\nreturn;\nreturn 2;\n}\n"); V("1); elseif(b>2);", "if (a > 1) {}\nelseif (b > 2) {}\n"); V("1); elseif(b>2){}", "if (a > 1) {}\nelseif (b > 2) {\n}\n"); V("1); elseif(b>2){ return;}", "if (a > 1) {}\nelseif (b > 2) {\nreturn;\n}\n"); V("1); elseif(b>2){ return; return 2;}", "if (a > 1) {}\nelseif (b > 2) {\nreturn;\nreturn 2;\n}\n"); V("1); elseif(b>2); else {$a=2;}", "if (a > 1) {}\nelseif (b > 2) {}\nelse {\n$a = 2;\n}\n"); V("1); elseif(b>2){} else {$a=2;}", "if (a > 1) {}\nelseif (b > 2) {\n}\nelse {\n$a = 2;\n}\n"); V("1); elseif(b>2){ return;} else{$a=2;}", "if (a > 1) {}\nelseif (b > 2) {\nreturn;\n}\nelse {\n$a = 2;\n}\n"); V("1); elseif(b>2){ return; return 2;} else{$a=2;}", "if (a > 1) {}\nelseif (b > 2) {\nreturn;\nreturn 2;\n}\n" "else {\n$a = 2;\n}\n"); // if-endif format V("1): endif;", "if (a > 1) {}\n"); V("1):;endif;", "if (a > 1) {\n}\n"); V("1): {} endif;", "if (a > 1) {\n{\n}\n}\n"); V("1): return; endif;", "if (a > 1) {\nreturn;\n}\n"); V("1): return; return 2; endif;", "if (a > 1) {\nreturn;\nreturn 2;\n}\n"); V("1):; else: endif;", "if (a > 1) {\n}\n"); V("1):; else:; endif;", "if (a > 1) {\n}\nelse {\n}\n"); V("1):; else: {} endif;", "if (a > 1) {\n}\nelse {\n{\n}\n}\n"); V("1):; else: return; endif;", "if (a > 1) {\n}\nelse {\nreturn;\n}\n"); V("1):; else: return; return 2; endif;", "if (a > 1) {\n}\nelse {\nreturn;\nreturn 2;\n}\n"); V("1):; elseif(b>2): endif;", "if (a > 1) {\n}\nelseif (b > 2) {}\n"); V("1):; elseif(b>2):; endif;", "if (a > 1) {\n}\nelseif (b > 2) {\n}\n"); V("1):; elseif(b>2):{} endif;", "if (a > 1) {\n}\nelseif (b > 2) {\n{\n}\n}\n"); V("1):; elseif(b>2): return; endif;", "if (a > 1) {\n}\nelseif (b > 2) {\nreturn;\n}\n"); V("1):; elseif(b>2): return; return 2; endif;", "if (a > 1) {\n}\nelseif (b > 2) {\nreturn;\nreturn 2;\n}\n"); V("1):; elseif(b>2):; else: $a=2; endif;", "if (a > 1) {\n}\nelseif (b > 2) {\n}\nelse {\n$a = 2;\n}\n"); V("1):; elseif(b>2):{} else: $a=2; endif;", "if (a > 1) {\n}\nelseif (b > 2) {\n{\n}\n}\nelse {\n$a = 2;\n}\n"); V("1):; elseif(b>2): return; else:$a=2; endif;", "if (a > 1) {\n}\nelseif (b > 2) {\nreturn;\n}\nelse {\n$a = 2;\n}\n"); V("1):; elseif(b>2): return; return 2; else:$a=2; endif;", "if (a > 1) {\n}\nelseif (b > 2) {\nreturn;\nreturn 2;\n}\n" "else {\n$a = 2;\n}\n"); return true; } bool TestParserStmt::TestWhileStatement() { V(" $c) ;", "foreach ($a + $b as $b => $c) {}\n"); V(" $c) : $a = 1; $b = 2; endforeach;", "foreach ($a + $b as $b => $c) {\n$a = 1;\n$b = 2;\n}\n"); V(" &$b) ;", "foreach ($a as $name => &$b) {}\n"); V(" $b) ;", "foreach ($a as $name => $b) {}\n"); return true; } bool TestParserStmt::TestCatchStatement() { V("