| /******************************************************************************* |
| * Copyright (c) 2000, 2014 IBM Corporation and others. |
| * |
| * This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License 2.0 |
| * which accompanies this distribution, and is available at |
| * https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| * |
| * Contributors: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jdt.core.tests.compiler.regression; |
| |
| import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants; |
| |
| import junit.framework.Test; |
| |
| @SuppressWarnings({ "rawtypes" }) |
| public class AssertionTest extends AbstractRegressionTest { |
| // Static initializer to specify tests subset using TESTS_* static variables |
| // All specified tests which does not belong to the class are skipped... |
| static { |
| // TESTS_NAMES = new String[] { "test000" }; |
| // TESTS_NUMBERS = new int[] { 13, 14 }; |
| // TESTS_RANGE = new int[] { 11, -1 }; |
| } |
| public AssertionTest(String name) { |
| super(name); |
| } |
| |
| public static Test suite() { |
| return buildMinimalComplianceTestSuite(testClass(), F_1_4); |
| } |
| |
| public static Class testClass() { |
| return AssertionTest.class; |
| } |
| |
| public void test001() { |
| this.runNegativeTest( |
| new String[] { |
| "assert.java", |
| "public class assert {}\n", |
| }, |
| "----------\n" + |
| "1. ERROR in assert.java (at line 1)\n" + |
| " public class assert {}\n" + |
| " ^^^^^^\n" + |
| "Syntax error on token \"assert\", Identifier expected\n" + |
| "----------\n"); |
| } |
| |
| public void test002() { |
| this.runConformTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " try { \n" |
| + " int i = 4;\n" |
| + " assert i != 4;\n" |
| + " System.out.println(i);\n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.print(\"SUCCESS\"); \n" |
| + " } \n" |
| + " } \n" |
| + "} \n" }, |
| "SUCCESS", //expected display |
| null, // use default class-path |
| true, // flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| |
| public void test003() { |
| this.runConformTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " int i = 4;\n" |
| + " assert i != 4;\n" |
| + " System.out.println(i);\n" |
| + " } \n" |
| + "} \n" }, |
| "4", |
| null, // use default class-path |
| true, // flush previous output dir content |
| new String[] {"-da"}); |
| } |
| public void test004() { |
| this.runConformTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " try { \n" |
| + " assert false : \"SUC\"; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.print(e.getMessage()); \n" |
| + " } \n" |
| + " try { \n" |
| + " assert false : new Object(){ public String toString(){ return \"CESS\";}}; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.println(e.getMessage()); \n" |
| + " } \n" |
| + " } \n" |
| + "} \n" }, |
| "SUCCESS", //expected display |
| null, // use default class-path |
| true, // flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| public void test005() { |
| this.runConformTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " try { \n" |
| + " assert false : 1; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.print(e.getMessage()); \n" |
| + " } \n" |
| + " try { \n" |
| + " int i = 2; \n" |
| + " assert false : i; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.println(e.getMessage()); \n" |
| + " } \n" |
| + " } \n" |
| + "} \n" }, |
| "12", //expected display |
| null, // use default class-path |
| true, // flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| public void test006() { |
| this.runNegativeTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " try { \n" |
| + " assert false : unbound; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.println(e.getMessage()); \n" |
| + " } \n" |
| + " } \n" |
| + "} \n" }, |
| "----------\n" + |
| "1. ERROR in A4.java (at line 4)\n" + |
| " assert false : unbound; \n" + |
| " ^^^^^^^\n" + |
| "unbound cannot be resolved to a variable\n" + |
| "----------\n"); |
| } |
| public void test007() { |
| this.runConformTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " try { \n" |
| + " assert false : 1L; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.print(e.getMessage()); \n" |
| + " } \n" |
| + " try { \n" |
| + " assert false : 0L; \n" // 0L isn't 0 |
| + " } catch(AssertionError e){ \n" |
| + " System.out.print(e.getMessage()); \n" |
| + " } \n" |
| + " try { \n" |
| + " long l = 2L; \n" |
| + " assert false : l; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.println(e.getMessage()); \n" |
| + " } \n" |
| + " } \n" |
| + "} \n" }, |
| "102", //expected display |
| null, // use default class-path |
| true, // flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| public void test008() { |
| this.runConformTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " try { \n" |
| + " assert false : 1.0f; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.print(e.getMessage()); \n" |
| + " } \n" |
| + " try { \n" |
| + " float f = 2.0f; \n" |
| + " assert false : f; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.println(e.getMessage()); \n" |
| + " } \n" |
| + " } \n" |
| + "} \n" }, |
| "1.02.0", //expected display |
| null, // use default class-path |
| true, // do not flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| public void test009() { |
| this.runConformTest(new String[] { |
| "A4.java", |
| "public class A4 { \n" |
| + " public static void main(String[] args) {\n" |
| + " try { \n" |
| + " assert false : 1.0; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.print(e.getMessage()); \n" |
| + " } \n" |
| + " try { \n" |
| + " double d = 2.0; \n" |
| + " assert false : d; \n" |
| + " } catch(AssertionError e){ \n" |
| + " System.out.println(e.getMessage()); \n" |
| + " } \n" |
| + " } \n" |
| + "} \n" }, |
| "1.02.0", //expected display |
| null, // use default class-path |
| true, // flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| // http://dev.eclipse.org/bugs/show_bug.cgi?id=22334 |
| public void test010() { |
| this.runConformTest(new String[] { |
| "X.java", |
| "public class X { \n" + |
| " public static void main(String[] args) { \n" + |
| " I.Inner inner = new I.Inner(); \n" + |
| " try { \n" + |
| " inner.test(); \n" + |
| " System.out.println(\"FAILED\"); \n" + |
| " } catch(AssertionError e){ \n" + |
| " System.out.println(\"SUCCESS\"); \n" + |
| " } \n" + |
| " } \n" + |
| "} \n" + |
| "interface I { \n" + |
| " public static class Inner { \n" + |
| " public void test() { \n" + |
| " assert false; \n" + |
| " } \n" + |
| " } \n" + |
| "} \n" }, |
| "SUCCESS", |
| null, // use default classpath |
| true, // flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| |
| /** |
| * http://dev.eclipse.org/bugs/show_bug.cgi?id=28750 |
| */ |
| public void test011() { |
| this.runConformTest( |
| new String[] { |
| "AssertTest.java", |
| "public class AssertTest {\n" + |
| " public AssertTest() {}\n" + |
| " public class InnerClass {\n" + |
| " InnerClass() {\n" + |
| " assert(false);\n" + |
| " }\n" + |
| " }\n" + |
| " \n" + |
| " public static void main(String[] args) { \n" + |
| " System.out.print(\"SUCCESS\"); \n" + |
| " } \n" + |
| "}" |
| }, |
| "SUCCESS"); // expected output |
| } |
| /** |
| * http://dev.eclipse.org/bugs/show_bug.cgi?id=57743 |
| */ |
| public void test012() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public static void main( String[] args ) {\n" + |
| " try {\n" + |
| " throw new Throwable( \"This is a test\");\n" + |
| " }\n" + |
| " catch( Throwable ioe ) {\n" + |
| " assert false : ioe;\n" + |
| " }\n" + |
| " System.out.print(\"SUCCESS\"); \n" + |
| " }\n" + |
| "}\n" |
| }, |
| "SUCCESS"); // expected output |
| } |
| |
| /** |
| * http://dev.eclipse.org/bugs/show_bug.cgi?id=157389 |
| */ |
| public void test013() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " static class Y {\n" + |
| " public static void test() {\n" + |
| " assert false;\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " ClassLoader classLoader = new X().getClass().getClassLoader();\n" + |
| " // enable assertion for X.Y\n" + |
| " classLoader.setClassAssertionStatus(\"X$Y\", true);\n" + |
| " X.Y.test();\n" + |
| " }\n" + |
| "}" |
| }, |
| "SUCCESS"); // expected output |
| } |
| |
| /** |
| * http://dev.eclipse.org/bugs/show_bug.cgi?id=163600 |
| */ |
| public void test014() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| "\n" + |
| " public static class Foo {\n" + |
| " public void myMethod(boolean trash) {\n" + |
| " System.out.println(\"Expecting class Foo\");\n" + |
| " Class c = Foo.class;\n" + |
| " System.out.println(\"Got the class \" + c);\n" + |
| " }\n" + |
| " }\n" + |
| " public static class Bar {\n" + |
| " public void myMethod(boolean doAssert) {\n" + |
| " System.out.println(\"Expecting class Bar\");\n" + |
| " Class c = Bar.class;\n" + |
| " System.out.println(\"Got the class \" + c);\n" + |
| " assert c.getName().endsWith(\"Bar\");\n" + |
| " }\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new Foo().myMethod(false);\n" + |
| " new Bar().myMethod(false);\n" + |
| " }\n" + |
| "}" |
| }, |
| "Expecting class Foo\n" + |
| "Got the class class X$Foo\n" + |
| "Expecting class Bar\n" + |
| "Got the class class X$Bar"); // expected output |
| } |
| |
| /** |
| * http://dev.eclipse.org/bugs/show_bug.cgi?id=163600 |
| */ |
| public void test015() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| "\n" + |
| " public static class Foo {\n" + |
| " public void myMethod(boolean trash) {\n" + |
| " System.out.println(\"Expecting class Foo\");\n" + |
| " Class c = Foo.class;\n" + |
| " System.out.println(\"Got the class \" + c);\n" + |
| " }\n" + |
| " }\n" + |
| " public static class Bar {\n" + |
| " public void myMethod(boolean doAssert) {\n" + |
| " System.out.println(\"Expecting class Bar\");\n" + |
| " Class c = Bar.class;\n" + |
| " try {\n" + |
| " assert c.getName().endsWith(\"Bar2\");\n" + |
| " } catch(AssertionError e) {\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " }\n" + |
| " System.out.println(\"Got the class \" + c);\n" + |
| " }\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new Foo().myMethod(false);\n" + |
| " new Bar().myMethod(false);\n" + |
| " }\n" + |
| "}" |
| }, |
| "Expecting class Foo\n" + |
| "Got the class class X$Foo\n" + |
| "Expecting class Bar\n" + |
| "SUCCESS\n" + |
| "Got the class class X$Bar", |
| null, // use default classpath |
| true, // flush previous output dir content |
| new String[] {"-ea"}); |
| } |
| |
| /** |
| * http://dev.eclipse.org/bugs/show_bug.cgi?id=163600 |
| */ |
| public void test016() { |
| this.runConformTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| "\n" + |
| " public static class Foo {\n" + |
| " public void myMethod(boolean trash) {\n" + |
| " System.out.println(\"Expecting class Foo\");\n" + |
| " Class c = Foo.class;\n" + |
| " System.out.println(\"Got the class \" + c);\n" + |
| " }\n" + |
| " }\n" + |
| " public static class Bar {\n" + |
| " public void myMethod(boolean doAssert) {\n" + |
| " System.out.println(\"Expecting class Bar\");\n" + |
| " Class c = Bar.class;\n" + |
| " try {\n" + |
| " assert c.getName().endsWith(\"Bar2\");\n" + |
| " System.out.println(\"SUCCESS\");\n" + |
| " } catch(AssertionError e) {\n" + |
| " System.out.println(\"FAILED\");\n" + |
| " }\n" + |
| " System.out.println(\"Got the class \" + c);\n" + |
| " }\n" + |
| " }\n" + |
| " public static void main(String[] args) {\n" + |
| " new Foo().myMethod(false);\n" + |
| " new Bar().myMethod(false);\n" + |
| " }\n" + |
| "}" |
| }, |
| "Expecting class Foo\n" + |
| "Got the class class X$Foo\n" + |
| "Expecting class Bar\n" + |
| "SUCCESS\n" + |
| "Got the class class X$Bar", |
| null, // use default classpath |
| true, // flush previous output dir content |
| new String[] {"-da"}); |
| } |
| //https://bugs.eclipse.org/bugs/show_bug.cgi?id=255008 |
| public void test017() { |
| runNegativeTest( |
| new String[] { /* test files */ |
| "X.java", |
| "public class X {\n" + |
| " protected void transform1(boolean srcPts) {\n" + |
| " final float error1;\n" + |
| " assert !(srcPts && (error1 = maxError()) > 0) : error1;\n" + |
| " }\n" + |
| " float foo1(boolean srcPts) {\n" + |
| " final float error2;\n" + |
| " if (!(srcPts && (error2 = maxError()) > 0)) {\n" + |
| " } else {\n" + |
| " return error2;\n" + |
| " }\n" + |
| " return 0;\n" + |
| " }\n" + |
| " float bar1(boolean srcPts) {\n" + |
| " final float error3;\n" + |
| " if ((srcPts && (error3 = maxError()) > 0)) {\n" + |
| " return error3;\n" + |
| " }\n" + |
| " return 0;\n" + |
| " } \n" + |
| " protected void transform2(boolean srcPts) {\n" + |
| " final float error4;\n" + |
| " assert (srcPts && (error4 = maxError()) > 0) : error4;\n" + |
| " }\n" + |
| " float foo2(boolean srcPts) {\n" + |
| " final float error5;\n" + |
| " if (srcPts && (error5 = maxError()) > 0) {\n" + |
| " } else {\n" + |
| " return error5;\n" + |
| " }\n" + |
| " return 0;\n" + |
| " }\n" + |
| " float bar2(boolean srcPts) {\n" + |
| " final float error6;\n" + |
| " if (!(srcPts && (error6 = maxError()) > 0)) {\n" + |
| " return error6;\n" + |
| " }\n" + |
| " return 0;\n" + |
| " }\n" + |
| " private float maxError() {\n" + |
| " return 0;\n" + |
| " }\n" + |
| "\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 23)\n" + |
| " assert (srcPts && (error4 = maxError()) > 0) : error4;\n" + |
| " ^^^^^^\n" + |
| "The local variable error4 may not have been initialized\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 29)\n" + |
| " return error5;\n" + |
| " ^^^^^^\n" + |
| "The local variable error5 may not have been initialized\n" + |
| "----------\n" + |
| "3. ERROR in X.java (at line 36)\n" + |
| " return error6;\n" + |
| " ^^^^^^\n" + |
| "The local variable error6 may not have been initialized\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=328361 |
| public void test018() { |
| this.runNegativeTest(new String[] { |
| "X.java", |
| "public class X {\n" + |
| " static final int i;\n" + |
| " static {\n" + |
| " assert (i = 0) == 0;\n" + |
| " System.out.println(i);\n" + |
| " }\n" + |
| "}" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 2)\n" + |
| " static final int i;\n" + |
| " ^\n" + |
| "The blank final field i may not have been initialized\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 5)\n" + |
| " System.out.println(i);\n" + |
| " ^\n" + |
| "The blank final field i may not have been initialized\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=328361 |
| public void test019() { |
| this.runConformTest(new String[] { |
| "X.java", |
| "public class X {\n" + |
| " static final int i;\n" + |
| " static {\n" + |
| " i = 0;\n" + |
| " assert i == 0;\n" + |
| " System.out.println(i);\n" + |
| " }\n" + |
| "}" |
| }, |
| ""); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=328361 |
| public void test020() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " void method1() {\n" + |
| " int i;" + |
| " assert (i = 0) == 0;\n" + |
| " System.out.println(i);\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 4)\n" + |
| " System.out.println(i);\n" + |
| " ^\n" + |
| "The local variable i may not have been initialized\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=328361 |
| public void test021() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public int bar() {\n" + |
| " return 1;\n" + |
| " }\n" + |
| " void method1() {\n" + |
| " int i;" + |
| " assert (i = this.bar()) == 0;\n" + |
| " System.out.println(i);\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 7)\n" + |
| " System.out.println(i);\n" + |
| " ^\n" + |
| "The local variable i may not have been initialized\n" + |
| "----------\n"); |
| } |
| // https://bugs.eclipse.org/bugs/show_bug.cgi?id=328361 |
| public void test022() throws Exception { |
| this.runNegativeTest( |
| new String[] { |
| "X.java", |
| "public class X {\n" + |
| " public int bar() {\n" + |
| " return 1;\n" + |
| " }\n" + |
| " void method1() {\n" + |
| " int i;\n" + |
| " assert i++ == 0;\n" + |
| " System.out.println(i);\n" + |
| " }\n" + |
| "}\n" |
| }, |
| "----------\n" + |
| "1. ERROR in X.java (at line 7)\n" + |
| " assert i++ == 0;\n" + |
| " ^\n" + |
| "The local variable i may not have been initialized\n" + |
| "----------\n" + |
| "2. ERROR in X.java (at line 8)\n" + |
| " System.out.println(i);\n" + |
| " ^\n" + |
| "The local variable i may not have been initialized\n" + |
| "----------\n"); |
| } |
| public void test023() { |
| if (this.complianceLevel < ClassFileConstants.JDK1_8) |
| return; |
| this.runConformTest(new String[] {"X.java", |
| "interface Foo {\n" + |
| " default Object test(Object a) {\n" + |
| " assert a != null; // triggers creation of bogus synthetic field\n" + |
| " return a;\n" + |
| " }\n" + |
| "}\n" + |
| "public class X implements Foo {\n" + |
| " public static void main(String[] args) {\n" + |
| " new X().test(\"\");\n" + |
| " System.out.println(\"Hello\");\n" + |
| " }\n" + |
| "}\n"}, "Hello"); |
| } |
| } |