blob: 66d4841a40c35ad4cf4dbe4b775fef1c70e329fe [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2000, 2003 IBM Corporation and others.
* 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
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.jdt.core.tests.compiler.regression;
import junit.framework.Test;
/**
* Name Lookup within Inner Classes
* Creation date: (8/2/00 12:04:53 PM)
* @author: Dennis Conway
*/
public class LookupTest extends AbstractRegressionTest {
public LookupTest(String name) {
super(name);
}
public static Test suite() {
return setupSuite(testClass());
}
/**
* Non-static member class
*/
public void test01() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private static int value = 23; \n"+
" class B { \n"+
" private int value; \n"+
" B (int val) { \n"+
" value = (A.value * 2) + val; \n"+
" } \n"+
" } \n"+
" public static void main (String args[]) { \n"+
" int result = new A().new B(12).value; \n"+
" int expected = 58; \n"+
" System.out.println( \n"+
" result == expected \n"+
" ? \"SUCCESS\" \n"+
" : \"FAILED : got \"+result+\" instead of \"+ expected); \n"+
" } \n"+
"}"
},
"SUCCESS"
);
}
/**
* Attempt to access non-static field from static inner class (illegal)
*/
public void test02() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"class A { \n"+
" private int value; \n"+
" static class B { \n"+
" B () { \n"+
" value = 2; \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" B result = new B(); \n"+
" } \n"+
"}"
},
"----------\n" +
"1. WARNING in p1\\A.java (at line 3)\n" +
" private int value; \n" +
" ^^^^^\n" +
"The private field A.value is never read locally\n" +
"----------\n" +
"2. ERROR in p1\\A.java (at line 6)\n" +
" value = 2; \n" +
" ^^^^^\n" +
"Cannot make a static reference to the non-static field value\n" +
"----------\n"
);
}
/**
* Access static field from static inner class
*/
public void test03() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private static int value; \n"+
" static class B { \n"+
" B () { \n"+
" value = 2; \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" B result = new B(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"}",
"SUCCESS"
}
);
}
/**
*
*/
public void test04() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private String value; \n"+
" private A (String strIn) { \n"+
" value = new B(strIn, \"E\").str; \n"+
" } \n"+
" class B { \n"+
" String str; \n"+
" private B (String strFromA, String strIn) {\n"+
" str = strFromA + strIn + new C(\"S\").str;\n"+
" } \n"+
" class C { \n"+
" String str; \n"+
" private C (String strIn) { \n"+
" str = strIn + new D(\"S\").str; \n"+
" } \n"+
" class D { \n"+
" String str; \n"+
" private D (String strIn) { \n"+
" str = strIn; \n"+
" } \n"+
" } \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" System.out.println(new A(\"SUCC\").value); \n"+
" } \n"+
"}"
},
"SUCCESS"
);
}
/**
*
*/
public void test05() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private static void doSomething(String showThis) {\n"+
" System.out.print(showThis); \n"+
" return; \n"+
" } \n"+
" class B { \n"+
" void aMethod () { \n"+
" p1.A.doSomething(\"SUCC\"); \n"+
" A.doSomething(\"ES\"); \n"+
" doSomething(\"S\"); \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" B foo = new A().new B(); \n"+
" foo.aMethod(); \n"+
" } \n"+
"}"
},
"SUCCESS"
);
}
/**
* jdk1.2.2 reports: No variable sucess defined in nested class p1.A. B.C.
* jdk1.3 reports: success has private access in p1.A
*/
public void test06() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"class A { \n"+
" private static String success = \"SUCCESS\"; \n"+
" public interface B { \n"+
" public abstract void aTask(); \n"+
" class C extends A implements B { \n"+
" public void aTask() {System.out.println(this.success);}\n"+
" } \n"+
" } \n"+
" public static void main (String[] argv) { \n"+
" } \n"+
"}"
},
"----------\n" +
"1. WARNING in p1\\A.java (at line 3)\n" +
" private static String success = \"SUCCESS\"; \n" +
" ^^^^^^^\n" +
"The private field A.success is never read locally\n" +
"----------\n" +
"2. ERROR in p1\\A.java (at line 7)\n" +
" public void aTask() {System.out.println(this.success);}\n" +
" ^^^^^^^^^^^^\n" +
"The field success is not visible\n" +
"----------\n"
);
}
/**
* No errors in jdk1.2.2, jdk1.3
*/
public void test07() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private static String success = \"SUCCESS\"; \n"+
" public interface B { \n"+
" public abstract void aTask(); \n"+
" class C extends A implements B { \n"+
" public void aTask() {System.out.println(A.success);}\n"+
" } \n"+
" } \n"+
" public static void main (String[] argv) { \n"+
" } \n"+
"}"
}
);
}
/**
* jdk1.2.2 reports: Undefined variable: A.this
* jdk1.3 reports: non-static variable this cannot be referenced from a static context
*/
public void test08() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"class A { \n"+
" private static String success = \"SUCCESS\"; \n"+
" public interface B { \n"+
" public abstract void aTask(); \n"+
" class C extends A implements B { \n"+
" public void aTask() {System.out.println(A.this.success);}\n"+
" } \n"+
" } \n"+
" public static void main (String[] argv) { \n"+
" } \n"+
"}"
},
"----------\n" +
"1. ERROR in p1\\A.java (at line 7)\n" +
" public void aTask() {System.out.println(A.this.success);}\n" +
" ^^^^^^\n" +
"No enclosing instance of the type A is accessible in scope\n" +
"----------\n" +
"2. WARNING in p1\\A.java (at line 7)\n" +
" public void aTask() {System.out.println(A.this.success);}\n" +
" ^^^^^^^^^^^^^^\n" +
"The static field A.success should be accessed in a static way\n" +
"----------\n"
);
}
/**
* jdk1.2.2 reports: No variable success defined in nested class p1.A. B.C
* jdk1.3 reports: success has private access in p1.A
*/
public void test09() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"class A { \n"+
" private String success = \"SUCCESS\"; \n"+
" public interface B { \n"+
" public abstract void aTask(); \n"+
" class C extends A implements B { \n"+
" public void aTask() {System.out.println(this.success);}\n"+
" } \n"+
" } \n"+
" public static void main (String[] argv) { \n"+
" } \n"+
"}"
},
"----------\n" +
"1. WARNING in p1\\A.java (at line 3)\n" +
" private String success = \"SUCCESS\"; \n" +
" ^^^^^^^\n" +
"The private field A.success is never read locally\n" +
"----------\n" +
"2. ERROR in p1\\A.java (at line 7)\n" +
" public void aTask() {System.out.println(this.success);}\n" +
" ^^^^^^^^^^^^\n" +
"The field success is not visible\n" +
"----------\n"
);
}
/**
* jdk1.2.2 reports: Can't make a static reference to nonstatic variable success in class p1.A
* jdk1.3 reports: non-static variable success cannot be referenced from a static context
*/
public void test10() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"class A { \n"+
" private String success = \"SUCCESS\"; \n"+
" public interface B { \n"+
" public abstract void aTask(); \n"+
" class C extends A implements B { \n"+
" public void aTask() {System.out.println(A.success);}\n"+
" } \n"+
" } \n"+
" public static void main (String[] argv) { \n"+
" } \n"+
"}"
},
"----------\n" +
"1. WARNING in p1\\A.java (at line 3)\n" +
" private String success = \"SUCCESS\"; \n" +
" ^^^^^^^\n" +
"The private field A.success is never read locally\n" +
"----------\n" +
"2. ERROR in p1\\A.java (at line 7)\n" +
" public void aTask() {System.out.println(A.success);}\n" +
" ^^^^^^^^^\n" +
"Cannot make a static reference to the non-static field A.success\n" +
"----------\n"
);
}
/**
*
*/
public void test11() {
this.runNegativeTest(
new String[] {
/* p2.Aa */
"p2/Aa.java",
"package p2; \n"+
"class Aa extends p1.A{ \n"+
" class B implements p1.A.C { \n"+
" } \n"+
" public static void main (String args[]) { \n"+
" } \n"+
"}",
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" public A() { \n"+
" } \n"+
" class B implements C { \n"+
" public int sMethod() { \n"+
" return 23; \n"+
" } \n"+
" } \n"+
" public interface C { \n"+
" public abstract int sMethod(); \n"+
" } \n"+
"}",
},
"----------\n" +
"1. ERROR in p2\\Aa.java (at line 3)\n" +
" class B implements p1.A.C { \n" +
" ^\n" +
"Class must implement the inherited abstract method A.C.sMethod()\n" +
"----------\n"
);
}
/**
*
*/
public void test12() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" public interface B { \n"+
" public abstract void aMethod (int A); \n"+
" public interface C { \n"+
" public abstract void anotherMethod(); \n"+
" } \n"+
" } \n"+
" public class aClass implements B, B.C { \n"+
" public void aMethod (int A) { \n"+
" } \n"+
" public void anotherMethod(){} \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"}"
},
"SUCCESS"
);
}
/**
*
*/
public void test13() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" public interface B { \n"+
" public abstract void aMethod (int A); \n"+
" public interface C { \n"+
" public abstract void anotherMethod(int A);\n"+
" } \n"+
" } \n"+
" public class aClass implements B, B.C { \n"+
" public void aMethod (int A) { \n"+
" public void anotherMethod(int A) {}; \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"}"
},
"----------\n" +
"1. ERROR in p1\\A.java (at line 9)\n" +
" public class aClass implements B, B.C { \n" +
" ^^^^^^\n" +
"Class must implement the inherited abstract method A.B.C.anotherMethod(int)\n" +
"----------\n" +
"2. ERROR in p1\\A.java (at line 11)\n" +
" public void anotherMethod(int A) {}; \n" +
" ^\n" +
"Syntax error on token \"(\", \";\" expected\n" +
"----------\n"
);
}
/**
*
*/
public void test14() {
this.runNegativeTest(
new String[] {
/* pack1.First */
"pack1/First.java",
"package pack1; \n"+
"public class First { \n"+
" public static void something() {} \n"+
" class Inner {} \n"+
" public static void main (String argv[]) { \n"+
" First.Inner foo = new First().new Inner(); \n"+
" foo.something(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"}"
},
"----------\n" +
"1. ERROR in pack1\\First.java (at line 7)\n" +
" foo.something(); \n" +
" ^^^^^^^^^\n" +
"The method something() is undefined for the type First.Inner\n" +
"----------\n"
);
}
/**
*
*/
public void test15() {
this.runConformTest(
new String[] {
/* pack1.First */
"pack1/First.java",
"package pack1; \n"+
"public class First { \n"+
" class Inner { \n"+
" public void something() {} \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" First.Inner foo = new First().new Inner(); \n"+
" foo.something(); \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"}"
},
"SUCCESS"
);
}
/**
*
*/
public void test16() {
this.runConformTest(
new String[] {
/* pack1.Outer */
"pack1/Outer.java",
"package pack1; \n"+
"import pack2.*; \n"+
"public class Outer { \n"+
" int time, distance; \n"+
" public Outer() { \n"+
" } \n"+
" public Outer(int d) { \n"+
" distance = d; \n"+
" } \n"+
" public void aMethod() { \n"+
" this.distance *= 2; \n"+
" return; \n"+
" } \n"+
"}",
/* pack2.OuterTwo */
"pack2/OuterTwo.java",
"package pack2; \n"+
"import pack1.*; \n"+
"public class OuterTwo extends Outer { \n"+
" public OuterTwo(int bar) { \n"+
" Outer A = new Outer(3) { \n"+
" public void bMethod(){ \n"+
" final class X { \n"+
" int price; \n"+
" public X(int inp) { \n"+
" price = inp + 32; \n"+
" } \n"+
" } \n"+
" } \n"+
" }; \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" System.out.println(\"\"); \n"+
" OuterTwo foo = new OuterTwo(12); \n"+
" Outer bar = new Outer(8); \n"+
" } \n"+
"}"
}
);
}
/**
*
*/
public void test17() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" int value; \n"+
" public A(B bVal) { \n"+
" bVal.sval += \"V\"; \n"+
" } \n"+
" static class B { \n"+
" public static String sval; \n"+
" public void aMethod() { \n"+
" sval += \"S\"; \n"+
" A bar = new A(this); \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" B foo = new B(); \n"+
" foo.sval = \"U\"; \n"+
" foo.aMethod(); \n"+
" System.out.println(foo.sval); \n"+
" } \n"+
"}"
},
"USV"
);
}
/**
* member class
*/
public void test18() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private String rating; \n"+
" public class B { \n"+
" String rating; \n"+
" public B (A sth) { \n"+
" sth.rating = \"m\"; \n"+
" rating = \"er\"; \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" A foo = new A(); \n"+
" foo.rating = \"o\"; \n"+
" B bar = foo.new B(foo); \n"+
" System.out.println(foo.rating + bar.rating);\n"+
" } \n"+
"}"
},
"mer"
);
}
/**
* member class
*/
public void test19() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private String rating; \n"+
" public void setRating(A sth, String setTo) { \n"+
" sth.rating = setTo; \n"+
" return; \n"+
" } \n"+
" public class B { \n"+
" public B (A sth) { \n"+
" setRating(sth, \"m\"); \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" A foo = new A(); \n"+
" foo.rating = \"o\"; \n"+
" B bar = foo.new B(foo); \n"+
" System.out.println(foo.rating + bar.other); \n"+
" } \n"+
"}"
},
"----------\n" +
"1. ERROR in p1\\A.java (at line 17)\n" +
" System.out.println(foo.rating + bar.other); \n" +
" ^^^^^^^^^\n" +
"bar.other cannot be resolved or is not a field\n" +
"----------\n"
);
}
/**
* member class
*/
public void test20() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private String rating; \n"+
" public class B { \n"+
" public B (A sth) { \n"+
" sth.rating = \"m\"; \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" A foo = new A(); \n"+
" foo.rating = \"o\"; \n"+
" B bar = foo.new B(foo); \n"+
" System.out.println(foo.rating + bar.other); \n"+
" } \n"+
"}"
},
"----------\n" +
"1. WARNING in p1\\A.java (at line 6)\n" +
" sth.rating = \"m\"; \n" +
" ^^^^^^^^^^\n" +
"Write access to enclosing field A.rating is emulated by a synthetic accessor method. Increasing its visibility will improve your performance\n" +
"----------\n" +
"2. ERROR in p1\\A.java (at line 13)\n" +
" System.out.println(foo.rating + bar.other); \n" +
" ^^^^^^^^^\n" +
"bar.other cannot be resolved or is not a field\n" +
"----------\n"
);
}
/**
* member class
*/
public void test21() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" private String rating; \n"+
" public class B { \n"+
" public B (A sth) { \n"+
" sth.rating = \"m\"; \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" A foo = new A(); \n"+
" foo.rating = \"o\"; \n"+
" B bar = foo.new B(foo); \n"+
" System.out.println(foo.rating); \n"+
" } \n"+
"}"
}
);
}
/**
*
*/
public void test22() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"import p2.*; \n"+
"public class A { \n"+
" public int aValue; \n"+
" public A() {} \n"+
" public static class C extends A { \n"+
" public String aString; \n"+
" public C() { \n"+
" } \n"+
" } \n"+
"}",
/* p2.B */
"p2/B.java",
"package p2; \n"+
"import p1.*; \n"+
"public class B extends A.C { \n"+
" public B() {} \n"+
" public class D extends A { \n"+
" public D() { \n"+
" C val2 = new C(); \n"+
" val2.aString = \"s\"; \n"+
" A val = new A(); \n"+
" val.aValue = 23; \n"+
" } \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" D foo = new B().new D(); \n"+
" } \n"+
"}"
}
);
}
/**
*
*/
public void test23() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1;\n"+
"public class A implements B { \n"+
"} \n"+
"interface B { \n"+
" public class A implements B { \n"+
" public static void main (String argv[]) { \n"+
" class Ba { \n"+
" int time; \n"+
" } \n"+
" Ba foo = new Ba(); \n"+
" foo.time = 3; \n"+
" } \n"+
" interface C { \n"+
" } \n"+
" interface Bb extends C { \n"+
" } \n"+
" } \n"+
"}"
}
);
}
/**
*
*/
public void test24() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" protected static String bleh; \n"+
" interface B { \n"+
" public String bleh(); \n"+
" class C{ \n"+
" public String bleh() {return \"B\";}\n"+
" } \n"+
" } \n"+
" class C implements B { \n"+
" public String bleh() {return \"A\";} \n"+
" } \n"+
" public static void main(String argv[]) { \n"+
" C foo = new A().new C(); \n"+
" } \n"+
"}"
}
);
}
/**
*
*/
public void test25() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"import p2.*; \n"+
"public class A { \n"+
" public static class B { \n"+
" public static int B; \n"+
" } \n"+
" public static void main(String argv[]) {\n"+
" B foo = new A.B(); \n"+
" B bar = new B(); \n"+
" foo.B = 2; \n"+
" p2.B bbar = new p2.B(); \n"+
" if (bar.B == 35) { \n"+
" System.out.println(\"SUCCESS\");\n"+
" } \n"+
" else { \n"+
" System.out.println(bar.B); \n"+
" } \n"+
" } \n"+
"}",
"p2/B.java",
"package p2; \n"+
"import p1.*; \n"+
"public class B extends A { \n"+
" public B() { \n"+
" A.B bleh = new A.B(); \n"+
" bleh.B = 35; \n"+
" } \n"+
"}"
},
"SUCCESS"
);
}
/**
*
*/
public void test26() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" public static class B { \n"+
" protected static int B; \n"+
" } \n"+
" public static void main(String argv[]) {\n"+
" B foo = new A.B(); \n"+
" B bar = new B(); \n"+
" B.B = 2; \n"+
" p2.B bbar = new p2.B(); \n"+
" if (B.B == 35) { \n"+
" System.out.println(\"SUCCESS\");\n"+
" } \n"+
" else { \n"+
" System.out.println(B.B); \n"+
" } \n"+
" } \n"+
"}",
"p2/B.java",
"package p2; \n"+
"import p1.*; \n"+
"public class B extends A { \n"+
" public B() { \n"+
" A.B bleh = new A.B(); \n"+
" bleh.B = 35; \n"+
" } \n"+
"}"
},
"----------\n" +
"1. ERROR in p2\\B.java (at line 6)\n" +
" bleh.B = 35; \n" +
" ^^^^^^\n" +
"The field bleh.B is not visible\n" +
"----------\n"
);
}
/**
*
*/
public void test27() {
this.runNegativeTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" protected static class B { \n"+
" public static int B; \n"+
" } \n"+
" public static void main(String argv[]) {\n"+
" B foo = new A.B(); \n"+
" B bar = new B(); \n"+
" B.B = 2; \n"+
" p2.B bbar = new p2.B(); \n"+
" if (B.B == 35) { \n"+
" System.out.println(\"SUCCESS\");\n"+
" } \n"+
" else { \n"+
" System.out.println(B.B); \n"+
" } \n"+
" } \n"+
"}",
"p2/B.java",
"package p2; \n"+
"import p1.*; \n"+
"public class B extends A { \n"+
" public B() { \n"+
" A.B bleh = new A.B(); \n"+
" A.B.B = 35; \n"+
" } \n"+
"}"
},
"----------\n" +
"1. ERROR in p2\\B.java (at line 5)\n" +
" A.B bleh = new A.B(); \n" +
" ^^^^^^^^^\n" +
"The constructor A.B() is not visible\n" +
"----------\n"
);
}
/**
*
*/
public void test28() {
this.runConformTest(
new String[] {
/* p1.A */
"p1/A.java",
"package p1; \n"+
"public class A { \n"+
" static class B { \n"+
" public static class C { \n"+
" private static int a; \n"+
" private int b; \n"+
" } \n"+
" } \n"+
" class D extends B { \n"+
" int j = p1.A.B.C.a; \n"+
" } \n"+
" public static void main (String argv[]) { \n"+
" System.out.println(\"SUCCESS\"); \n"+
" } \n"+
"}"
},
"SUCCESS"
);
}
public static Class testClass() {
return LookupTest.class;
}
}