X-Git-Url: http://secure.phpeclipse.com
diff --git a/net.sourceforge.phpeclipse.tests/src/net/sourceforge/phpeclipse/tests/parser/PHPManualTestCase.java b/net.sourceforge.phpeclipse.tests/src/net/sourceforge/phpeclipse/tests/parser/PHPManualTestCase.java
index 6ab02e7..4233c80 100644
--- a/net.sourceforge.phpeclipse.tests/src/net/sourceforge/phpeclipse/tests/parser/PHPManualTestCase.java
+++ b/net.sourceforge.phpeclipse.tests/src/net/sourceforge/phpeclipse/tests/parser/PHPManualTestCase.java
@@ -1,332 +1,244 @@
package net.sourceforge.phpeclipse.tests.parser;
-/**********************************************************************
-Copyright (c) 2002 Klaus Hartlage - www.eclipseproject.de
-All rights reserved. This program and the accompanying materials
-are made available under the terms of the Common Public License v1.0
-which accompanies this distribution, and is available at
-http://www.eclipse.org/legal/cpl-v10.html
-**********************************************************************/
-import net.sourceforge.phpdt.internal.compiler.parser.Parser;
-import net.sourceforge.phpdt.internal.compiler.parser.Scanner;
-
-import org.eclipse.core.runtime.CoreException;
-import junit.framework.TestCase;
+/*******************************************************************************
+ * Copyright (c) 2002 www.phpeclipse.de All rights
+ * reserved. This program and the accompanying materials are made available
+ * under the terms of the Common Public License v1.0 which accompanies this
+ * distribution, and is available at http://www.eclipse.org/legal/cpl-v10.html
+ ******************************************************************************/
+import net.sourceforge.phpdt.core.tests.util.AbstractCompilerTest;
/**
- * Tests the php parser
+ * Tests the php parser
*/
-public class PHPManualTestCase extends TestCase {
-
- Parser parser;
-
- public PHPManualTestCase(String name) {
- super(name);
- }
-
- /**
- * Test the PHP Parser with different PHP snippets
- */
- public void testPHPParser() {
- checkPHP("function foo()" +
"{" +
" echo \"In foo()
\\n\";" +
"}" +
"" +
"function bar($arg = '')" +
"{" +
" echo \"In bar(); argument was '$arg'.
\\n\";" +
"}" +
"" +
"// This is a wrapper function around echo" +
"function echoit($string)" +
"{" +
" echo $string;" +
"}" +
"" +
"$func = 'foo';" +
"$func(); // This calls foo()" +
"" +
"$func = 'bar';" +
"$func('test'); // This calls bar()" +
"" +
"$func = 'echoit';" +
"$func('test'); // This calls echoit()" +
"");
- checkPHP("class Foo" +
"{" +
" function Vari()" +
" {" +
" $name = 'Bar';" +
" $this->$name(); // This calls the Bar() method\n" +
" }" +
" " +
" function Bar()" +
" {" +
" echo \"This is Bar\";" +
" }" +
"}" +
"" +
"$foo = new Foo();" +
"$funcname = \"Var\";" +
"$foo->$varname(); // This calls $foo->Var()\n" +
"");
- checkPHP("function square ($num)" +
"{" +
" return $num * $num;" +
"}" +
"echo square (4); // outputs '16'." +
"");
- checkPHP("function small_numbers()" +
"{" +
" return array (0, 1, 2);" +
"}" +
"list ($zero, $one, $two) = small_numbers();" +
"");
- checkPHP("function &returns_reference()" +
"{" +
" return $someref;" +
"}" +
"" +
"$newref =& returns_reference();" +
" " +
"");
- checkPHP("function add_some_extra(&$string)" +
"{" +
" $string .= 'and something extra.';" +
"}" +
"$str = 'This is a string, ';" +
"add_some_extra($str);" +
"echo $str; ");
- checkPHP("function makecoffee ($type = \"cappuccino\")\n" +
"{\n" +
" return \"Making a cup of $type.\\n\";\n" +
"}" +
"echo makecoffee ();" +
"echo makecoffee (\"espresso\");" +
"");
- checkPHP("$makefoo = true;" +
"" +
"/* We can't call foo() from here " +
" since it doesn't exist yet," +
" but we can call bar() */" +
"" +
"bar();" +
"" +
"if ($makefoo) {" +
" function foo ()" +
" {" +
" echo \"I don't exist until program execution reaches me.\\n\";" +
" }" +
"}" +
"" +
"/* Now we can safely call foo()" +
" since $makefoo evaluated to true */" +
"" +
"if ($makefoo) foo();" +
"" +
"function bar() " +
"{" +
" echo \"I exist immediately upon program start.\\n\";" +
"}" +
"" +
"");
- checkPHP(
- "function foo() " +
"{" +
" function bar() " +
" {" +
" echo \"I don't exist until foo() is called.\\n\";" +
" }" +
"}" +
"" +
"/* We can't call bar() yet" +
" since it doesn't exist. */" +
"" +
"foo();\n" +
"" +
"/* Now we can call bar()," +
" foo()'s processesing has" +
" made it accessable. */" +
"" +
"bar();" +
"");
- // Bugs item #690938
- checkPHP(
- " echo \"This is a test\"; // This is a one-line c++ style comment\n"
- + " /* This is a multi line comment\n"
- + " yet another line of comment */\n"
- + " echo \"This is yet another test\";\n"
- + " echo \"One Final Test\"; # This is shell-style style comment \n");
- checkPHP(
- "$bool = TRUE; // a boolean\n"
- + "$str = \"foo\"; // a string\n"
- + "$int = 12; // an integer\n"
- + "\n"
- + "echo gettype($bool); // prints out \"boolean\"\n"
- + "echo gettype($str); // prints out \"string\"\n"
- + ""
- + "// If this is an integer, increment it by four\n"
- + "if (is_int($int)) {\n"
- + " $int += 4;\n"
- + "}\n"
- + "\n"
- + "// If $bool is a string, print it out\n"
- + "// (does not print out anything)\n"
- + "if (is_string($bool)) {\n"
- + " echo \"String: $bool\";\n"
- + "}\n");
-
- checkPHP("$foo = True; // assign the value TRUE to $foo");
-
- checkPHP(
- "// == is an operator which test\n"
- + "// equality and returns a boolean\n"
- + "if ($action == \"show_version\") {\n"
- + " echo \"The version is 1.23\";\n"
- + "}\n"
- + "\n"
- + "// this is not necessary...\n"
- + "if ($show_separators == TRUE) {\n"
- + " echo \"
\\n\";\n"
- + "}\n"
- + "\n"
- + "// ...because you can simply type\n"
- + "if ($show_separators) {\n"
- + " echo \"
\\n\";\n"
- + "}");
-
- checkPHP(
- "echo gettype((bool) \"\"); // bool(false)\n"
- + "echo gettype((bool) 1); // bool(true)\n"
- + "echo gettype((bool) -2); // bool(true)\n"
- + "echo gettype((bool) \"foo\"); // bool(true)\n"
- + "echo gettype((bool) 2.3e5); // bool(true)\n"
- + "echo gettype((bool) array(12)); // bool(true)\n"
- + "echo gettype((bool) array()); // bool(false)\n");
-
- checkPHP(
- "$a = 1234; # decimal number\n"
- + "$a = -123; # a negative number\n"
- + "$a = 0123; # octal number (equivalent to 83 decimal)\n"
- + "$a = 0x1A; # hexadecimal number (equivalent to 26 decimal)\n");
-
- checkPHP(
- "$large_number = 2147483647;\n"
- + "var_dump($large_number);\n"
- + "// output: int(2147483647)\n"
- + "\n"
- + "$large_number = 2147483648;\n"
- + "var_dump($large_number);\n"
- + "// output: float(2147483648)\n"
- + ""
- + "// this goes also for hexadecimal specified integers:\n"
- + "var_dump( 0x80000000 );\n"
- + "// output: float(2147483648)\n"
- + "\n"
- + "$million = 1000000;\n"
- + "$large_number = 50000 * $million;\n"
- + "var_dump($large_number);\n"
- + "// output: float(50000000000)\n");
-
- checkPHP(
- "var_dump(25/7); // float(3.5714285714286)\n"
- + "var_dump((int) (25/7)); // int(3)\n"
- + "var_dump(round(25/7)); // float(4)");
-
- checkPHP("echo (int) ( (0.1+0.7) * 10 ); // echoes 7!");
-
- checkPHP("$a = 1.234; " + "$b = 1.2e3; " + "$c = 7E-10;");
-
- checkPHP(
- "echo 'this is a simple string';\n"
- + "\n"
- + "echo 'You can also have embedded newlines in \n"
- + "strings this way as it is\n"
- + "okay to do';\n"
- + "\n"
- + "// Outputs: \"I'll be back\"\n"
- + "echo 'Arnold once said: \"I\\'ll be back\"';\n"
- + "\n"
- + "// Outputs: You deleted C:\\*.*?\n"
- + "echo 'You deleted C:\\\\*.*?';\n"
- + "\n"
- + "// Outputs: You deleted C:\\*.*?\n"
- + "echo 'You deleted C:\\\\*.*?';\n"
- + "\n"
- + "// Outputs: This will not expand: \\n a newline\n"
- + "echo 'This will not expand: \\n a newline';\n"
- + "\n"
- + "// Outputs: Variables do not $expand $either\n"
- + "echo 'Variables do not $expand $either';\n");
-
- checkPHP(
- "$str = <<foo = 'Foo';\n"
- + " $this->bar = array('Bar1', 'Bar2', 'Bar3');\n"
- + " }\n"
- + "}\n"
- + "\n"
- + "$foo = new foo();\n"
- + "$name = 'MyName';\n"
- + "\n"
- + "echo <<foo.\n"
- + "Now, I am printing some {$foo->bar[1]}.\n"
- + "This should print a capital 'A': \\x41\n"
- + "EOT;\n");
-
- checkPHP("echo \"This works: \" . $arr['foo'][3];");
-
- checkPHP("echo \"\\$foo==$foo; type is \" . gettype ($foo) . \"
\\n\";");
-
- checkPHP(
- "$arr = array(\"foo\" => \"bar\", 12 => true);\n"
- + "\n"
- + "echo $arr[\"foo\"]; // bar\n"
- + "echo $arr[12]; // 1\n");
-
- checkPHP(
- "// This array is the same as ...\n"
- + "array(5 => 43, 32, 56, \"b\" => 12);\n"
- + "\n"
- + "// ...this array\n"
- + "array(5 => 43, 6 => 32, 7 => 56, \"b\" => 12);\n");
-
- checkPHP(
- "$arr = array(5 => 1, 12 => 2);\n"
- + "\n"
- + "$arr[] = 56; // This is the same as $arr[13] = 56;\n"
- + " // at this point of the script\n"
- + "\n"
- + "$arr[\"x\"] = 42; // This adds a new element to\n"
- + " // the array with key \"x\"\n"
- + " \n"
- + "unset($arr[5]); // This removes the element from the array\n"
- + "\n"
- + "unset($arr); // This deletes the whole array\n");
-
- checkPHP("$foo[bar] = 'enemy';\n" + "echo $foo[bar];");
-
- checkPHP(
- "$a = array( 'color' => 'red',\n"
- + " 'taste' => 'sweet',\n"
- + " 'shape' => 'round',\n"
- + " 'name' => 'apple',\n"
- + " 4 // key will be 0\n"
- + " );\n"
- + "\n"
- + "// is completely equivalent with\n"
- + "$a['color'] = 'red';\n"
- + "$a['taste'] = 'sweet';\n"
- + "$a['shape'] = 'round';\n"
- + "$a['name'] = 'apple';\n"
- + "$a[] = 4; // key will be 0\n"
- + "\n"
- + "$b[] = 'a';\n"
- + "$b[] = 'b';\n"
- + "$b[] = 'c';\n"
- + "// will result in the array array(0 => 'a' , 1 => 'b' , 2 => 'c'),\n"
- + "// or simply array('a', 'b', 'c')\n");
-
- checkPHP(
- "foreach ($colors as $key => $color) {\n"
- + " // won't work:\n"
- + " //$color = strtoupper($color);\n"
- + " \n"
- + " // works:\n"
- + " $colors[$key] = strtoupper($color);\n"
- + "}\n"
- + "print_r($colors);\n");
-
- checkPHP(
- "$fruits = array ( \"fruits\" => array ( \"a\" => \"orange\",\n"
- + " \"b\" => \"banana\",\n"
- + " \"c\" => \"apple\"\n"
- + " ),\n"
- + " \"numbers\" => array ( 1,\n"
- + " 2,\n"
- + " 3,\n"
- + " 4,\n"
- + " 5,\n"
- + " 6,\n"
- + " ),\n"
- + " \"holes\" => array ( \"first\",\n"
- + " 5 => \"second\",\n"
- + " \"third\"\n"
- + " )\n"
- + " );\n"
- + "\n"
- + "// Some examples to address values in the array above \n"
- + "echo $fruits[\"holes\"][5]; // prints \"second\"\n"
- + "echo $fruits[\"fruits\"][\"a\"]; // prints \"orange\"\n"
- + "unset($fruits[\"holes\"][0]); // remove \"first\"\n"
- + "\n"
- + "// Create a new multi-dimensional array\n"
- + "$juices[\"apple\"][\"green\"] = \"good\"; \n");
-
- checkPHP("$arr3 = &$arr1;");
-
- checkPHP(
- "class foo\n"
- + "{\n"
- + " function do_foo()\n"
- + " {\n"
- + " echo \"Doing foo.\"; \n"
- + " }\n"
- + "}\n"
- + "\n"
- + "$bar = new foo;\n"
- + "$bar->do_foo();\n");
-
- checkPHP(
- "$obj = (object) 'ciao';\n" +
- "echo $obj->scalar; // outputs 'ciao'");
-
- checkPHP("$var = NULL;");
-
- checkPHP("$var = \"Bob\";\n" +
- "$Var = \"Joe\";\n" +
- "echo \"$var, $Var\"; // outputs \"Bob, Joe\"\n" +
- "\n" +
- // "$4site = 'not yet'; // invalid; starts with a number\n" +
- "$_4site = 'not yet'; // valid; starts with an underscore\n" +
- "$täyte = 'mansikka'; \n");
-
- checkPHP("");
-
- checkPHP("");
-
- checkPHP("");
- }
-
- private void checkPHP(String strEval) {
- try {
- if (Scanner.DEBUG) {
- System.out.println("\n------------------------------------");
- System.out.println(strEval);
- }
- parser.phpParserTester(strEval, 1);
- } catch (CoreException e) {
- }
- }
-
- private void checkHTML(String strEval) {
- try {
- if (Scanner.DEBUG) {
- System.out.println("\n------------------------------------");
- System.out.println(strEval);
- }
- parser.parse(strEval);
- } catch (CoreException e) {
- }
- }
-
- /**
- * The JUnit setup method
- */
- protected void setUp() {
- parser = new Parser(null);
- }
-
+public class PHPManualTestCase extends AbstractCompilerTest {
+ // Parser parser;
+ public PHPManualTestCase(String name) {
+ super(name);
+ }
+
+ /**
+ * Test the PHP Parser with different PHP snippets
+ */
+ public void testPHPParser() {
+ checkPHP("self::$instance = new Singleton();");
+ checkPHP("if ((eregi(\"<[^>]*script*\\\"?[^>]*>\", $secvalue)) ||\r\n"
+ + " (eregi(\"<[^>]*object*\\\"?[^>]*>\", $secvalue)) ||\r\n"
+ + " (eregi(\"<[^>]*iframe*\\\"?[^>]*>\", $secvalue)) ||\r\n"
+ + " (eregi(\"<[^>]*applet*\\\"?[^>]*>\", $secvalue)) ||\r\n"
+ + " (eregi(\"<[^>]*meta*\\\"?[^>]*>\", $secvalue)) ||\r\n"
+ + " (eregi(\"<[^>]*style*\\\"?[^>]*>\", $secvalue)) ||\r\n"
+ + " (eregi(\"<[^>]*form*\\\"?[^>]*>\", $secvalue)) ||\r\n"
+ + " (eregi(\"\\([^>]*\\\"?[^)]*\\)\", $secvalue)) ||\r\n"
+ + " (eregi(\"\\\"\", $secvalue))) {\r\n"
+ + " die (\"
The html tags you attempted to use are not allowed
[ Go Back ]\");\r\n"
+ + " }");
+ checkPHP("function foo()" + "{" + " echo \"In foo()
\\n\";" + "}"
+ + "" + "function bar($arg = '')" + "{"
+ + " echo \"In bar(); argument was '$arg'.
\\n\";" + "}"
+ + "" + "// This is a wrapper function around echo"
+ + "function echoit($string)" + "{" + " echo $string;" + "}"
+ + "" + "$func = 'foo';" + "$func(); // This calls foo()"
+ + "" + "$func = 'bar';" + "$func('test'); // This calls bar()"
+ + "" + "$func = 'echoit';"
+ + "$func('test'); // This calls echoit()" + "");
+ checkPHP("class Foo" + "{" + " function Vari()" + " {"
+ + " $name = 'Bar';"
+ + " $this->$name(); // This calls the Bar() method\n"
+ + " }" + " " + " function Bar()" + " {"
+ + " echo \"This is Bar\";" + " }" + "}" + ""
+ + "$foo = new Foo();" + "$funcname = \"Var\";"
+ + "$foo->$varname(); // This calls $foo->Var()\n" + "");
+ checkPHP("function square ($num)" + "{" + " return $num * $num;"
+ + "}" + "echo square (4); // outputs '16'." + "");
+ checkPHP("function small_numbers()" + "{"
+ + " return array (0, 1, 2);" + "}"
+ + "list ($zero, $one, $two) = small_numbers();" + "");
+ checkPHP("function &returns_reference()" + "{" + " return $someref;"
+ + "}" + "" + "$newref =& returns_reference();" + " " + "");
+ checkPHP("function add_some_extra(&$string)" + "{"
+ + " $string .= 'and something extra.';" + "}"
+ + "$str = 'This is a string, ';" + "add_some_extra($str);"
+ + "echo $str; ");
+ checkPHP("function makecoffee ($type = \"cappuccino\")\n" + "{\n"
+ + " return \"Making a cup of $type.\\n\";\n" + "}"
+ + "echo makecoffee ();" + "echo makecoffee (\"espresso\");"
+ + "");
+ checkPHP("$makefoo = true;"
+ + ""
+ + "/* We can't call foo() from here "
+ + " since it doesn't exist yet,"
+ + " but we can call bar() */"
+ + ""
+ + "bar();"
+ + ""
+ + "if ($makefoo) {"
+ + " function foo ()"
+ + " {"
+ + " echo \"I don't exist until program execution reaches me.\\n\";"
+ + " }" + "}" + "" + "/* Now we can safely call foo()"
+ + " since $makefoo evaluated to true */" + ""
+ + "if ($makefoo) foo();" + "" + "function bar() " + "{"
+ + " echo \"I exist immediately upon program start.\\n\";"
+ + "}" + "" + "");
+ checkPHP("function foo() " + "{" + " function bar() " + " {"
+ + " echo \"I don't exist until foo() is called.\\n\";"
+ + " }" + "}" + "" + "/* We can't call bar() yet"
+ + " since it doesn't exist. */" + "" + "foo();\n" + ""
+ + "/* Now we can call bar()," + " foo()'s processesing has"
+ + " made it accessable. */" + "" + "bar();" + "");
+ // Bugs item #690938
+ checkPHP(" echo \"This is a test\"; // This is a one-line c++ style comment\n"
+ + " /* This is a multi line comment\n"
+ + " yet another line of comment */\n"
+ + " echo \"This is yet another test\";\n"
+ + " echo \"One Final Test\"; # This is shell-style style comment \n");
+ checkPHP("$bool = TRUE; // a boolean\n"
+ + "$str = \"foo\"; // a string\n"
+ + "$int = 12; // an integer\n" + "\n"
+ + "echo gettype($bool); // prints out \"boolean\"\n"
+ + "echo gettype($str); // prints out \"string\"\n" + ""
+ + "// If this is an integer, increment it by four\n"
+ + "if (is_int($int)) {\n" + " $int += 4;\n" + "}\n" + "\n"
+ + "// If $bool is a string, print it out\n"
+ + "// (does not print out anything)\n"
+ + "if (is_string($bool)) {\n" + " echo \"String: $bool\";\n"
+ + "}\n");
+ checkPHP("$foo = True; // assign the value TRUE to $foo");
+ checkPHP("// == is an operator which test\n"
+ + "// equality and returns a boolean\n"
+ + "if ($action == \"show_version\") {\n"
+ + " echo \"The version is 1.23\";\n" + "}\n" + "\n"
+ + "// this is not necessary...\n"
+ + "if ($show_separators == TRUE) {\n"
+ + " echo \"
\\n\";\n" + "}\n" + "\n"
+ + "// ...because you can simply type\n"
+ + "if ($show_separators) {\n" + " echo \"
\\n\";\n" + "}");
+ checkPHP( // "echo gettype((bool) \"\"); // bool(false)\n"
+ "echo gettype((bool) 1); // bool(true)\n"
+ + "echo gettype((bool) -2); // bool(true)\n"
+ + "echo gettype((bool) \"foo\"); // bool(true)\n"
+ + "echo gettype((bool) 2.3e5); // bool(true)\n"
+ + "echo gettype((bool) array(12)); // bool(true)\n"
+ + "echo gettype((bool) array()); // bool(false)\n");
+ checkPHP("$a = 1234; # decimal number\n"
+ + "$a = -123; # a negative number\n"
+ + "$a = 0123; # octal number (equivalent to 83 decimal)\n"
+ + "$a = 0x1A; # hexadecimal number (equivalent to 26 decimal)\n");
+ checkPHP("$large_number = 2147483647;\n"
+ + "var_dump($large_number);\n" + "// output: int(2147483647)\n"
+ + "\n" + "$large_number = 2147483648;\n"
+ + "var_dump($large_number);\n"
+ + "// output: float(2147483648)\n" + ""
+ + "// this goes also for hexadecimal specified integers:\n"
+ + "var_dump( 0x80000000 );\n"
+ + "// output: float(2147483648)\n" + "\n"
+ + "$million = 1000000;\n"
+ + "$large_number = 50000 * $million;\n"
+ + "var_dump($large_number);\n"
+ + "// output: float(50000000000)\n");
+ checkPHP("var_dump(25/7); // float(3.5714285714286)\n"
+ + "var_dump((int) (25/7)); // int(3)\n"
+ + "var_dump(round(25/7)); // float(4)");
+ checkPHP("echo (int) ( (0.1+0.7) * 10 ); // echoes 7!");
+ checkPHP("$a = 1.234; " + "$b = 1.2e3; " + "$c = 7E-10;");
+ checkPHP("echo 'this is a simple string';\n" + "\n"
+ + "echo 'You can also have embedded newlines in \n"
+ + "strings this way as it is\n" + "okay to do';\n" + "\n"
+ + "// Outputs: \"I'll be back\"\n"
+ + "echo 'Arnold once said: \"I\\'ll be back\"';\n" + "\n"
+ + "// Outputs: You deleted C:\\*.*?\n"
+ + "echo 'You deleted C:\\\\*.*?';\n" + "\n"
+ + "// Outputs: You deleted C:\\*.*?\n"
+ + "echo 'You deleted C:\\\\*.*?';\n" + "\n"
+ + "// Outputs: This will not expand: \\n a newline\n"
+ + "echo 'This will not expand: \\n a newline';\n" + "\n"
+ + "// Outputs: Variables do not $expand $either\n"
+ + "echo 'Variables do not $expand $either';\n");
+
+ checkPHP("echo \"This works: \" . $arr['foo'][3];");
+ checkPHP("echo \"\\$foo==$foo; type is \" . gettype ($foo) . \"
\\n\";");
+ checkPHP("$arr = array(\"foo\" => \"bar\", 12 => true);\n" + "\n"
+ + "echo $arr[\"foo\"]; // bar\n" + "echo $arr[12]; // 1\n");
+ checkPHP("// This array is the same as ...\n"
+ + "array(5 => 43, 32, 56, \"b\" => 12);\n" + "\n"
+ + "// ...this array\n"
+ + "array(5 => 43, 6 => 32, 7 => 56, \"b\" => 12);\n");
+ checkPHP("$arr = array(5 => 1, 12 => 2);\n"
+ + "\n"
+ + "$arr[] = 56; // This is the same as $arr[13] = 56;\n"
+ + " // at this point of the script\n"
+ + "\n"
+ + "$arr[\"x\"] = 42; // This adds a new element to\n"
+ + " // the array with key \"x\"\n"
+ + " \n"
+ + "unset($arr[5]); // This removes the element from the array\n"
+ + "\n" + "unset($arr); // This deletes the whole array\n");
+ checkPHP("$foo[bar] = 'enemy';\n" + "echo $foo[bar];");
+ checkPHP("$a = array( 'color' => 'red',\n"
+ + " 'taste' => 'sweet',\n"
+ + " 'shape' => 'round',\n"
+ + " 'name' => 'apple',\n"
+ + " 4 // key will be 0\n"
+ + " );\n"
+ + "\n"
+ + "// is completely equivalent with\n"
+ + "$a['color'] = 'red';\n"
+ + "$a['taste'] = 'sweet';\n"
+ + "$a['shape'] = 'round';\n"
+ + "$a['name'] = 'apple';\n"
+ + "$a[] = 4; // key will be 0\n"
+ + "\n"
+ + "$b[] = 'a';\n"
+ + "$b[] = 'b';\n"
+ + "$b[] = 'c';\n"
+ + "// will result in the array array(0 => 'a' , 1 => 'b' , 2 => 'c'),\n"
+ + "// or simply array('a', 'b', 'c')\n");
+ checkPHP("foreach ($colors as $key => $color) {\n"
+ + " // won't work:\n"
+ + " //$color = strtoupper($color);\n" + " \n"
+ + " // works:\n"
+ + " $colors[$key] = strtoupper($color);\n" + "}\n"
+ + "print_r($colors);\n");
+ checkPHP("$fruits = array ( \"fruits\" => array ( \"a\" => \"orange\",\n"
+ + " \"b\" => \"banana\",\n"
+ + " \"c\" => \"apple\"\n"
+ + " ),\n"
+ + " \"numbers\" => array ( 1,\n"
+ + " 2,\n"
+ + " 3,\n"
+ + " 4,\n"
+ + " 5,\n"
+ + " 6,\n"
+ + " ),\n"
+ + " \"holes\" => array ( \"first\",\n"
+ + " 5 => \"second\",\n"
+ + " \"third\"\n"
+ + " )\n"
+ + " );\n"
+ + "\n"
+ + "// Some examples to address values in the array above \n"
+ + "echo $fruits[\"holes\"][5]; // prints \"second\"\n"
+ + "echo $fruits[\"fruits\"][\"a\"]; // prints \"orange\"\n"
+ + "unset($fruits[\"holes\"][0]); // remove \"first\"\n"
+ + "\n"
+ + "// Create a new multi-dimensional array\n"
+ + "$juices[\"apple\"][\"green\"] = \"good\"; \n");
+ checkPHP("$arr3 = &$arr1;");
+ checkPHP("class foo\n" + "{\n" + " function do_foo()\n" + " {\n"
+ + " echo \"Doing foo.\"; \n" + " }\n" + "}\n" + "\n"
+ + "$bar = new foo;\n" + "$bar->do_foo();\n");
+ checkPHP("$obj = (object) 'ciao';\n"
+ + "echo $obj->scalar; // outputs 'ciao'");
+ checkPHP("$var = NULL;");
+ checkPHP("$var = \"Bob\";\n" + "$Var = \"Joe\";\n"
+ + "echo \"$var, $Var\"; // outputs \"Bob, Joe\"\n" + "\n"
+ +
+ // "$4site = 'not yet'; // invalid; starts with a number\n" +
+ "$_4site = 'not yet'; // valid; starts with an underscore\n"
+ + "$t�yte = 'mansikka'; \n");
+
+ checkPHP("");
+ checkPHP("");
+ }
}