package junit.sourceforge.phpeclipse;
/**********************************************************************
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;
/**
* 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() {
// 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);
}
}