improved parser string handling
[phpeclipse.git] / net.sourceforge.phpeclipse.tests / src / net / sourceforge / phpeclipse / tests / parser / PHPManualTestCase.java
1 package net.sourceforge.phpeclipse.tests.parser;
2 /*******************************************************************************
3  * Copyright (c) 2002 Klaus Hartlage - www.eclipseproject.de All rights
4  * reserved. This program and the accompanying materials are made available
5  * under the terms of the Common Public License v1.0 which accompanies this
6  * distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html
7  ******************************************************************************/
8 import net.sourceforge.phpdt.core.tests.util.AbstractCompilerTest;
9 import net.sourceforge.phpdt.internal.compiler.parser.Scanner;
10 /**
11  * Tests the php parser
12  */
13 public class PHPManualTestCase extends AbstractCompilerTest {
14 //  Parser parser;
15   public PHPManualTestCase(String name) {
16     super(name);
17   }
18   /**
19    * Test the PHP Parser with different PHP snippets
20    */
21   public void testPHPParser() {
22     checkPHP("if ((eregi(\"<[^>]*script*\\\"?[^>]*>\", $secvalue)) ||\r\n" + 
23                 "       (eregi(\"<[^>]*object*\\\"?[^>]*>\", $secvalue)) ||\r\n" + 
24                 "       (eregi(\"<[^>]*iframe*\\\"?[^>]*>\", $secvalue)) ||\r\n" + 
25                 "       (eregi(\"<[^>]*applet*\\\"?[^>]*>\", $secvalue)) ||\r\n" + 
26                 "       (eregi(\"<[^>]*meta*\\\"?[^>]*>\", $secvalue)) ||\r\n" + 
27                 "       (eregi(\"<[^>]*style*\\\"?[^>]*>\", $secvalue)) ||\r\n" + 
28                 "       (eregi(\"<[^>]*form*\\\"?[^>]*>\", $secvalue)) ||\r\n" + 
29                 "       (eregi(\"\\([^>]*\\\"?[^)]*\\)\", $secvalue)) ||\r\n" + 
30                 "       (eregi(\"\\\"\", $secvalue))) {\r\n" + 
31                 "   die (\"<center><img src=images/logo.gif><br><br><b>The html tags you attempted to use are not allowed</b><br><br>[ <a href=\\\"javascript:history.go(-1)\\\"><b>Go Back</b></a> ]\");\r\n" + 
32                 "    }");
33     checkPHP("function foo()" + "{" + "    echo \"In foo()<br>\\n\";" + "}"
34         + "" + "function bar($arg = '')" + "{"
35         + "    echo \"In bar(); argument was '$arg'.<br>\\n\";" + "}" + ""
36         + "// This is a wrapper function around echo"
37         + "function echoit($string)" + "{" + "    echo $string;" + "}" + ""
38         + "$func = 'foo';" + "$func();        // This calls foo()" + ""
39         + "$func = 'bar';" + "$func('test');  // This calls bar()" + ""
40         + "$func = 'echoit';" + "$func('test');  // This calls echoit()" + "");
41     checkPHP("class Foo" + "{" + "    function Vari()" + "    {"
42         + "        $name = 'Bar';"
43         + "        $this->$name(); // This calls the Bar() method\n" + "    }"
44         + "    " + "    function Bar()" + "    {"
45         + "        echo \"This is Bar\";" + "    }" + "}" + ""
46         + "$foo = new Foo();" + "$funcname = \"Var\";"
47         + "$foo->$varname();   // This calls $foo->Var()\n" + "");
48     checkPHP("function square ($num)" + "{" + "    return $num * $num;" + "}"
49         + "echo square (4);   // outputs '16'." + "");
50     checkPHP("function small_numbers()" + "{" + "    return array (0, 1, 2);"
51         + "}" + "list ($zero, $one, $two) = small_numbers();" + "");
52     checkPHP("function &returns_reference()" + "{" + "    return $someref;"
53         + "}" + "" + "$newref =& returns_reference();" + " " + "");
54     checkPHP("function add_some_extra(&$string)" + "{"
55         + "    $string .= 'and something extra.';" + "}"
56         + "$str = 'This is a string, ';" + "add_some_extra($str);"
57         + "echo $str;    ");
58     checkPHP("function makecoffee ($type = \"cappuccino\")\n" + "{\n"
59         + "    return \"Making a cup of $type.\\n\";\n" + "}"
60         + "echo makecoffee ();" + "echo makecoffee (\"espresso\");" + "");
61     checkPHP("$makefoo = true;" + "" + "/* We can't call foo() from here "
62         + "   since it doesn't exist yet," + "   but we can call bar() */" + ""
63         + "bar();" + "" + "if ($makefoo) {" + "  function foo ()" + "  {"
64         + "    echo \"I don't exist until program execution reaches me.\\n\";"
65         + "  }" + "}" + "" + "/* Now we can safely call foo()"
66         + "   since $makefoo evaluated to true */" + ""
67         + "if ($makefoo) foo();" + "" + "function bar() " + "{"
68         + "  echo \"I exist immediately upon program start.\\n\";" + "}" + ""
69         + "");
70     checkPHP("function foo() " + "{" + "  function bar() " + "  {"
71         + "    echo \"I don't exist until foo() is called.\\n\";" + "  }" + "}"
72         + "" + "/* We can't call bar() yet" + "   since it doesn't exist. */"
73         + "" + "foo();\n" + "" + "/* Now we can call bar(),"
74         + "   foo()'s processesing has" + "   made it accessable. */" + ""
75         + "bar();" + "");
76     // Bugs item #690938
77     checkPHP("    echo \"This is a test\"; // This is a one-line c++ style comment\n"
78         + "    /* This is a multi line comment\n"
79         + "       yet another line of comment */\n"
80         + "    echo \"This is yet another test\";\n"
81         + "    echo \"One Final Test\"; # This is shell-style style comment \n");
82     checkPHP("$bool = TRUE;   // a boolean\n"
83         + "$str  = \"foo\";  // a string\n" + "$int  = 12;     // an integer\n"
84         + "\n" + "echo gettype($bool); // prints out \"boolean\"\n"
85         + "echo gettype($str);  // prints out \"string\"\n" + ""
86         + "// If this is an integer, increment it by four\n"
87         + "if (is_int($int)) {\n" + "    $int += 4;\n" + "}\n" + "\n"
88         + "// If $bool is a string, print it out\n"
89         + "// (does not print out anything)\n" + "if (is_string($bool)) {\n"
90         + "    echo \"String: $bool\";\n" + "}\n");
91     checkPHP("$foo = True; // assign the value TRUE to $foo");
92     checkPHP("// == is an operator which test\n"
93         + "// equality and returns a boolean\n"
94         + "if ($action == \"show_version\") {\n"
95         + "    echo \"The version is 1.23\";\n" + "}\n" + "\n"
96         + "// this is not necessary...\n" + "if ($show_separators == TRUE) {\n"
97         + "    echo \"<hr>\\n\";\n" + "}\n" + "\n"
98         + "// ...because you can simply type\n" + "if ($show_separators) {\n"
99         + "    echo \"<hr>\\n\";\n" + "}");
100     checkPHP(  // "echo gettype((bool) \"\");        // bool(false)\n"
101         "echo gettype((bool) 1);         // bool(true)\n"
102         + "echo gettype((bool) -2);        // bool(true)\n"
103         + "echo gettype((bool) \"foo\");     // bool(true)\n"
104         + "echo gettype((bool) 2.3e5);     // bool(true)\n"
105         + "echo gettype((bool) array(12)); // bool(true)\n"
106         + "echo gettype((bool) array());   // bool(false)\n");
107     checkPHP("$a = 1234; # decimal number\n"
108         + "$a = -123; # a negative number\n"
109         + "$a = 0123; # octal number (equivalent to 83 decimal)\n"
110         + "$a = 0x1A; # hexadecimal number (equivalent to 26 decimal)\n");
111     checkPHP("$large_number =  2147483647;\n" + "var_dump($large_number);\n"
112         + "// output: int(2147483647)\n" + "\n"
113         + "$large_number =  2147483648;\n" + "var_dump($large_number);\n"
114         + "// output: float(2147483648)\n" + ""
115         + "// this goes also for hexadecimal specified integers:\n"
116         + "var_dump( 0x80000000 );\n" + "// output: float(2147483648)\n" + "\n"
117         + "$million = 1000000;\n" + "$large_number =  50000 * $million;\n"
118         + "var_dump($large_number);\n" + "// output: float(50000000000)\n");
119     checkPHP("var_dump(25/7);         // float(3.5714285714286)\n"
120         + "var_dump((int) (25/7)); // int(3)\n"
121         + "var_dump(round(25/7));  // float(4)");
122     checkPHP("echo (int) ( (0.1+0.7) * 10 ); // echoes 7!");
123     checkPHP("$a = 1.234; " + "$b = 1.2e3; " + "$c = 7E-10;");
124     checkPHP("echo 'this is a simple string';\n" + "\n"
125         + "echo 'You can also have embedded newlines in \n"
126         + "strings this way as it is\n" + "okay to do';\n" + "\n"
127         + "// Outputs: \"I'll be back\"\n"
128         + "echo 'Arnold once said: \"I\\'ll be back\"';\n" + "\n"
129         + "// Outputs: You deleted C:\\*.*?\n"
130         + "echo 'You deleted C:\\\\*.*?';\n" + "\n"
131         + "// Outputs: You deleted C:\\*.*?\n"
132         + "echo 'You deleted C:\\\\*.*?';\n" + "\n"
133         + "// Outputs: This will not expand: \\n a newline\n"
134         + "echo 'This will not expand: \\n a newline';\n" + "\n"
135         + "// Outputs: Variables do not $expand $either\n"
136         + "echo 'Variables do not $expand $either';\n");
137     
138     checkPHP("echo \"This works: \" . $arr['foo'][3];");
139     checkPHP("echo \"\\$foo==$foo; type is \" . gettype ($foo) . \"<br />\\n\";");
140     checkPHP("$arr = array(\"foo\" => \"bar\", 12 => true);\n" + "\n"
141         + "echo $arr[\"foo\"]; // bar\n" + "echo $arr[12];    // 1\n");
142     checkPHP("// This array is the same as ...\n"
143         + "array(5 => 43, 32, 56, \"b\" => 12);\n" + "\n"
144         + "// ...this array\n"
145         + "array(5 => 43, 6 => 32, 7 => 56, \"b\" => 12);\n");
146     checkPHP("$arr = array(5 => 1, 12 => 2);\n" + "\n"
147         + "$arr[] = 56;    // This is the same as $arr[13] = 56;\n"
148         + "                // at this point of the script\n" + "\n"
149         + "$arr[\"x\"] = 42; // This adds a new element to\n"
150         + "                // the array with key \"x\"\n"
151         + "                \n"
152         + "unset($arr[5]); // This removes the element from the array\n" + "\n"
153         + "unset($arr);    // This deletes the whole array\n");
154     checkPHP("$foo[bar] = 'enemy';\n" + "echo $foo[bar];");
155     checkPHP("$a = array( 'color' => 'red',\n"
156         + "            'taste' => 'sweet',\n"
157         + "            'shape' => 'round',\n"
158         + "            'name'  => 'apple',\n"
159         + "                       4        // key will be 0\n"
160         + "          );\n"
161         + "\n"
162         + "// is completely equivalent with\n"
163         + "$a['color'] = 'red';\n"
164         + "$a['taste'] = 'sweet';\n"
165         + "$a['shape'] = 'round';\n"
166         + "$a['name']  = 'apple';\n"
167         + "$a[]        = 4;        // key will be 0\n"
168         + "\n"
169         + "$b[] = 'a';\n"
170         + "$b[] = 'b';\n"
171         + "$b[] = 'c';\n"
172         + "// will result in the array array(0 => 'a' , 1 => 'b' , 2 => 'c'),\n"
173         + "// or simply array('a', 'b', 'c')\n");
174     checkPHP("foreach ($colors as $key => $color) {\n" + "    // won't work:\n"
175         + "    //$color = strtoupper($color);\n" + "    \n" + "    // works:\n"
176         + "    $colors[$key] = strtoupper($color);\n" + "}\n"
177         + "print_r($colors);\n");
178     checkPHP("$fruits = array ( \"fruits\"  => array ( \"a\" => \"orange\",\n"
179         + "                                       \"b\" => \"banana\",\n"
180         + "                                       \"c\" => \"apple\"\n"
181         + "                                     ),\n"
182         + "                  \"numbers\" => array ( 1,\n"
183         + "                                       2,\n"
184         + "                                       3,\n"
185         + "                                       4,\n"
186         + "                                       5,\n"
187         + "                                       6,\n"
188         + "                                     ),\n"
189         + "                  \"holes\"   => array (      \"first\",\n"
190         + "                                       5 => \"second\",\n"
191         + "                                            \"third\"\n"
192         + "                                     )\n" + "                );\n"
193         + "\n" + "// Some examples to address values in the array above \n"
194         + "echo $fruits[\"holes\"][5];    // prints \"second\"\n"
195         + "echo $fruits[\"fruits\"][\"a\"]; // prints \"orange\"\n"
196         + "unset($fruits[\"holes\"][0]);  // remove \"first\"\n" + "\n"
197         + "// Create a new multi-dimensional array\n"
198         + "$juices[\"apple\"][\"green\"] = \"good\"; \n");
199     checkPHP("$arr3 = &$arr1;");
200     checkPHP("class foo\n" + "{\n" + "    function do_foo()\n" + "    {\n"
201         + "        echo \"Doing foo.\"; \n" + "    }\n" + "}\n" + "\n"
202         + "$bar = new foo;\n" + "$bar->do_foo();\n");
203     checkPHP("$obj = (object) 'ciao';\n"
204         + "echo $obj->scalar;  // outputs 'ciao'");
205     checkPHP("$var = NULL;");
206     checkPHP("$var = \"Bob\";\n" + "$Var = \"Joe\";\n"
207         + "echo \"$var, $Var\";      // outputs \"Bob, Joe\"\n" + "\n" + 
208         //      "$4site = 'not yet'; // invalid; starts with a number\n" +
209         "$_4site = 'not yet';    // valid; starts with an underscore\n"
210         + "$täyte = 'mansikka';  \n");
211     checkPHP("");
212     checkPHP("");
213     checkPHP("");
214   }
215   private void checkPHP(String strEval) {
216     if (Scanner.DEBUG) {
217       System.out.println("\n------------------------------------");
218       System.out.println(strEval);
219     }
220     checkParsePHP(
221         strEval.toCharArray(),
222                 "");
223 //    parser.phpParserTester(strEval, 1);
224   }
225 //  private void checkHTML(String strEval) {
226 //    if (Scanner.DEBUG) {
227 //      System.out.println("\n------------------------------------");
228 //      System.out.println(strEval);
229 //    }
230 //    parser.parse(strEval);
231 //  }
232   /**
233    * The JUnit setup method
234    */
235 //  protected void setUp() {
236 //    parser = new Parser(null);
237 //  }
238 }