/*******************************************************************************
 * Copyright (c) 2005, 2008 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.wst.jsdt.core.tests.compiler.regression;


public class BasicResolveTests extends AbstractRegressionTest {

	public BasicResolveTests(String name) {
		super(name);

	}
	public void test002()	{	// local method 
		this.runNegativeTest(
				new String[] {
						"X.js",
						"	function foo(){\n" +
						"	  abc(); \n" +
						"}\n"
				},
				"----------\n" +
				"1. ERROR in X.js (at line 2)\n" +
				"	abc(); \n"+ 
				"	^^^\n"+
				"The function abc() is undefined\n"+ 
				"----------\n"
		);

		this.runNegativeTest(
				new String[] {
						"X.js",
						"	function foo(a){\n" +
						"	  foo(a); \n" +
						"}\n"
				},
				""
		);

	}

	public void test003()	{	// local var 
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var i;" +
						"i=1;\n" +
						"\n"
				},
				""
		);

		this.runNegativeTest(
				new String[] {
						"X.js",
						"var i;\n" +
						"i=j;\n" 
				},
				"----------\n" +
				"1. ERROR in X.js (at line 2)\n" +
				"	i=j;\n"+ 
				"	  ^\n"+
				"j cannot be resolved\n"+ 
				"----------\n"
		);


	}

	public void test004()	{	// system reference 
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var win=debugger;\n" +
						"Object();\n" +
						"\n"
				},
				""
		);

		this.runNegativeTest(
				new String[] {
						"X.js",
						"var i;\n" +
						"i=j;\n" 
				},
				"----------\n" +
				"1. ERROR in X.js (at line 2)\n" +
				"	i=j;\n"+ 
				"	  ^\n"+
				"j cannot be resolved\n"+ 
				"----------\n"
		);


	}

	public void test005()	{	// system reference 
		this.runNegativeTest(
				new String[] {
						"X.js",
						"Object();\n" +
						"\n"
				},
				""
		);


	}


//	With inferred types

	public void test010()	{	// field reference 
		this.runNegativeTest(
				new String[] {
						"X.js",
						"MyClass.prototype.someMethod = MyClass_someMethod;"+ 
						"function MyClass(){}"+
						"function MyClass_someMethod(){}"+
						"var myClassObj = new MyClass();\n"+
						"myClassObj.someMethod();\n"
				},
				""
		);


	}

	public void test011()	{	// field reference 
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function MyClass() {\n"+
						"  this.url = \"\";\n"+
						"  this.activate = function(){}\n"+
						"}\n"+
						"var myClassObj = new MyClass();\n"+
						"var u=myClassObj.url;\n"+
						"\n"
				},
				""
		);


	}


	public void test012()	{	// field reference 
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function Bob(firstname, lastname) {\n" +
						"   this.Firstname = firstname;\n" +
						"   this.Lastname = lastname;\n" +
						"}\n" +
						"Bob.prototype.name = function () {return this.Firstname + this.Lastname;};\n",
				},
				""
		);


	}

	public void test013()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var SingleQuote = {\n" +
						"   Version: '1.1-beta2' \n" +
						"}\n"
				},
				""
		);

	}

	public void test014()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var o = {x:1, y: 2, name: \"print\" };\n" +
						"o.Z = 0; \n"
				},
				""
		);

	}



	public void test020()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function foo() {\n" +
						"		var t = new Test();\n" +
						"}\n" +
						"   function Test()\n" +
						"{\n" +
						"}\n"
				},
				""
		);

	}
	public void test021()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function foo() {\n" +
						"	var i=1;\n" +
						"	if (2>i )\n" +
						"		foo();\n" +
						"}\n" 
				},
				""
		);

	}

	public void test022()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function foo() {\n" +
						"	var ff=function(p) \n" +
						"	{var c=p;};\n" +
						"	ff(1);\n" +
						"}\n" 
				},
				""
		);

	}

	public void test022b()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"	var ff=function(p) \n" +
						"	{var c=p;};\n" +
						"	ff(1);\n" +
						"" 
				},
				""
		);

	}


	public void test023()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"	var ff=new String();\n" +
						"" 
				},
				""
		);

	}		

	public void test024()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" function bar() {;\n" +
						"return Test.x;\n" +
						"}\n" +
						"Test.prototype=new Object();\n" +
						"Test.x=1;\n" +
						"" 
				},
				""
		);

	}

	public void test025()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" function g() {\n" +
						"return null;\n" +
						"}\n" +
						"function foo() {\n" +
						"	g();\n" +
						"}\n" +
						"" 
				},
				""
		);

	}

	public void test026()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var i=[10];\n" +
						"" 
				},
				""
		);

	}


	public void test027()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" function bar(vv) {;\n" +
						"return vv%4;\n" +
						"}\n" +
						"" 
				},
				""
		);

	}

	public void test028()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var c=false;\n" +
						"var d=!c;\n" +
						"" 
				},
				""
		);

	}

	public void test029()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var d=new Date(1);\n" +
						"" 
				},
				""
		);

	}


	public void test030()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function foo(e) {\n" +
						"var x= 10, z = null, i, j;\n" +
						"}\n" +
						"" 
				},
				""
		);

	}
	public void test031()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function OBJ(){}\n" +
						"var o = new OBJ();\n" +
						"" 
				},
				""
		);

	}

	public void test032()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var foo;\n" +
						" foo.onMouseDown = function () { return 1; };\n" +
						" foo.onMouseDown();\n" +
						"" 
				},
				""
		);

	}

	public void test032b()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var foo;\n" +
						" foo.level1=new Object();\n" +
						" foo.level1.onMouseDown = function () { return 1; };\n" +
						" foo.level1.onMouseDown();\n" +
						"" 
				},
				""
		);

	}


	public void test033()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" if (typeof abc == \"undefined\") {}\n" +
						"" 
				},
				""
		);

	}

	public void test034()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" if (true) {\n" +
						"   var abc=1;}\n" +
						" var d=abc;\n" +
						"" 
				},
				""
		);

	}

	public void test035()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" function foo() {\n" +
						"   var vv=arguments;}\n" +
						"" 
				},
				""
		);

	}


	public void test036()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" function foo() {\n" +
						"   function inner(){}\n" +
						"   inner();\n" +
						"   }\n" +
						"" 
				},
				""
		);

	}


	public void test037()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" var s = new String();\n" +
						" var sub=s.substring(0,0);\n" +
						" var i=sub.length;\n" +
						"" 
				},
				""
		);

	}

	public void test038()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" s = new String();\n" +
						" sub=s.substring(0,0);\n" +
						" i=sub.length;\n" +
						"" 
				},
				""
		);

	}


	public void test039()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" var s = \"\";\n" +
						" with (s) {\n" +
						"   var i=length;\n" +
						" }\n" +
						"" 
				},
				""
		);

	}

	public void test040()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" var s = \"\";\n" +
						" with (s) {\n" +
						"   var i=charAt(0);\n" +
						" }\n" +
						"" 
				},
				""
		);

	}

	/*
	 * Field reference error testing
	 */
	public void test041()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var x = {};\n" +
						"x.a = \"\""
				},
				""
		);

	}

	public void test042()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var x = {};\n" +
						"x.a.b = \"\""
				},
				"----------\n" +
				"1. WARNING in X.js (at line 2)\n" +
				"	x.a.b = \"\"\n"+ 
				"	  ^\n"+
				"a cannot be resolved or is not a field\n"+ 
				"----------\n"
		);
	}

	public void test043()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var x = null;\n" +
						"x>3;"+
						"var y;\n" +
						"y=null;\n" +
						"y>3"+
						""
				},
				""
		);

	}

	public void test044()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" if (typeof abc == \"undefined\") { abc=1;}\n" +
						" var c= abc;\n" +
						"" 
				},
				""
		);

	}

	public void test045()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						" var a,b=1;\n" +
						" var c= b;\n" +
						" function abc(){" +
						" var d= 1,e=4;\n" +
						" var f=e;}\n" +
						"" 
				},
				""
		);

	}

	
	public void test046()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function debug2() {\n" +
						" var keyFunct = null;\n" +
						" keyFunct = function () {};\n" +
						"  keyFunct();\n" +
						"  }\n" +
						"" 
				},
				""
		);

	}

	
	public void test046b()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function debug2() {\n" +
						" var keyFunct = null;\n" +
						" keyFunct = new function () {};\n" +
						"  keyFunct();\n" +
						"  }\n" +
						"" 
				},
				""
		);

	}
	

	public void test047()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function Config() {}\n" +
						"Config.printDocTypes = function() { throw new (\"doctype 1.\"); };\n" +
						"Config.prototype.toString = function () { return \"\"; };\n" +
						"function main() {\n" +
						"    Config.printDocTypes();\n" +
						"}   \n" +
						"" 
				},
				""
		);
	}


	public void test048()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function Config2() {};\n" +
						"Config2.INPUT_DIR = \"\";\n" +
						"Config2.OUTPUT_DIR = Config2.INPUT_DIR  ;\n" +
						"Config2.getNum = function() { return 1; }\n" +
						"function numberGen() { \n" +
						"    return Config2.getNum(); \n" +
						"}   \n" +
						"" 
				},
				""
		);
	}

	public void test049()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var arr=[];\n" +
						"var ref=arr.length;\n" +
						"var o=arr.pop();\n" +
						"" 
				},
				""
		);
	}


	public void test050()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function getDateTime() {\n" +
						"	    this.ctime = new Object();\n" +
						"	    this.ctime.getDay = new function() { return \"Mon\"; };\n" +
						"	    return this;\n" +
						"	}\n" +
						"	function debug3() {\n" +
						"	    var newObj = getDateTime();\n" +
						"	    return newObj.ctime.getDay();\n" +
						"	}\n" +
						"" 
				},
				""
		);
	}

	public void test050b()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function getDateTime() {\n" +
						"	    this.ctime = new Object();\n" +
						"	    this.ctime.getDay = new function() { return \"Mon\"; };\n" +
						"	    return this;\n" +
						"	}\n" +
						"	function debug3() {\n" +
						"	    var newObj = new getDateTime();\n" +
						"	    return newObj.ctime.getDay();\n" +
						"	}\n" +
						"" 
				},
				""
		);
	}

	   
	public void test051()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var ns = {};\n"+ 
						"ns.foo = function(){\n" +
						"};\n" +
						"ns.foo.prototype.bar = \"\";\n" +
						"ns.foo.prototype.bar2 = function(){\n" +
						"  return \"\";\n" +
						"}\n"+
						"c=new ns.foo();\n"+
						"c.bar2();\n"+
						"i=c.bar;\n"+
						"" 
				},
				""
		);
	}


	public void test052()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var myObject=new Object();\n"+ 
						"myObject.ctor=   function(){\n" +
						"};\n" +
						"myObject.ctor.prototype.bar = \"\";\n" +
						"myObject.ctor.prototype.bar2 = function(){\n" +
						"  return \"\";\n" +
						"}\n"+
						"c=new myObject.ctor();\n"+
						"c.bar2();\n"+
						"i=c.bar;\n"+
						"" 
				},
				""
		);
	}

	

	public void test053()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function funccall(pp){}\n"+ 
						"funccall({\n"+ 
						"meth : function(){  \n" +
						"  var c=this.i; },\n" +
						" i : 1 \n" +
						"});\n"+
						"" 
				},
				""
		);
	}


	public void test054()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function func1(pp){}\n"+ 
						"func1();\n"+ 
						"function obj(){}\n"+ 
						"var o=new obj(1);\n"+ 
						"" 
				},
				"----------\n" + 
				"1. WARNING in X.js (at line 2)\n" + 
				"	func1();\n" + 
				"	^^^^^^^\n" + 
				"Wrong number of arguments for the function func1 (), expecting 1 argument(s), but there was 0 \n" + 
				"----------\n" + 
				"2. WARNING in X.js (at line 4)\n" + 
				"	var o=new obj(1);\n" + 
				"	      ^^^^^^^^^^\n" + 
				"Wrong number of arguments for the function obj (), expecting 0 argument(s), but there was 1 \n" + 
				"----------\n"
		);
	}

	
	public void test055()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function func1(base,mixin){\n"+ 
						"var bp = (base||0).prototype;\n"+ 
						"}\n"+ 
						"" 
				},
				""
		);
	}
		
	
	public void test056()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var arr=[];\n"+ 
						"arr.push(1);\n"+ 
						"" 
				},
				""
		);
	}
	
	public void test057()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var arr= {\n"+ 
						"  func: function(){ \n"+ 
						"       this.func();\n"+ 
						"   } \n"+ 
						"};\n"+ 
						"" 
				},
				""
		);
	}
	
	
	public void test058()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var cls= {};\n"+ 
						"cls.arr={};\n"+ 
						"cls.arr[\"ss\"]=1;\n"+ 
						"var dd=cls.arr[\"ssd\"];\n"+ 
						"" 
				},
				""
		);
	}
	
	
	public void test059()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						 "/**\n"
						+ " * Valid class javadoc\n"
						+ " * @param {String | Number} p1 param def\n"
						+ " */\n"
						+"function foo(p1){\n"  
						+"p1.length;\n" 
						+"p1.toPrecision(1);\n" 
						+"}\n" 
						+"" 
				},
				""
		);
	}
	
	
	public void test060()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function foo(p1){\n"  
						+"p1();\n" 
						+"}\n" 
						+"" 
				},
				""
		);
	}

	public void test061()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"function foo(){\n"
						+"p1=1;\n" 
						+"p1();\n" 
						+"}\n" 
						+"" 
				},
				"----------\n" + 
				"1. WARNING in X.js (at line 3)\n" + 
				"	p1();\n" + 
				"	^^\n" + 
				"p1 is not a function \n" + 
				"----------\n"
		);
	}
	
	
	public void test062()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var cc=function(){\n"  
						+"  function inner(){}\n" 
						+"  var dd=inner;\n" 
						+"}\n" 
						+"" 
				},
				""
		);
	}

	
	public void test063()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						"var cc=function(){\n"  
						+"  var ii;\n" 
						+"  function inner(){\n" 
						+"    var dd=ii;\n" 
						+"  }\n" 
						+"}\n" 
						+"" 
				},
				""
		);
	}
	
	public void test064()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						 "  function inner(){\n" 
						+"  var ii=0,i2=ii+1;\n" 
//						+"  var ii=0;\n" 
//						+"  var i2=ii+1;\n" 
						+"}\n" 
						+"" 
				},
				""
		);
	}
 
	public void test065()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						 "  function inner(aArray){\n" 
						+"  var number = 0;\n" 
						+"  number -= aArray.length;\n" 
						+"  number += aArray.length;\n" 
						+"  return number;\n" 
						+"}\n" 
						+"" 
				},
				""
		);
	}

	public void test066()	{
		this.runNegativeTest(
				new String[] {
						"X.js",
						 "  TestClass = function() {\n" 
						+"  }\n" 
						+"  TestClass.prototype = new Object();\n" 
						+"  ns=new Object();\n" 
						+"  ns.TestClass = function() {\n" 
						+"  }\n" 
						+"  ns.TestClass.prototype = new Object();\n" 
						+"" 
				},
				""
		);
	}


}