8313613: Use JUnit in langtools/lib tests

Reviewed-by: cstein, asotona
This commit is contained in:
Qing Xiao 2023-10-16 17:14:34 +00:00 committed by Christian Stein
parent 8c1bb2b280
commit 741ae06c55
17 changed files with 471 additions and 346 deletions

View File

@ -1,6 +1,6 @@
# This file identifies root(s) of the test-ng hierarchy.
# This file identifies root(s) of the JUnit hierarchy.
TestNG.dirs = .
JUnit.dirs = .
modules = \
jdk.compiler/com.sun.tools.javac.util

View File

@ -0,0 +1,31 @@
package tools.javac.combo;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;
import org.junit.jupiter.api.extension.AfterAllCallback;
import org.junit.jupiter.api.extension.ExtensionContext;
import org.junit.jupiter.api.extension.TestWatcher;
public class ComboWatcher implements TestWatcher, AfterAllCallback {
private final Set<String> errors = Collections.synchronizedSet(new HashSet<>());
@Override
public void testFailed(ExtensionContext context, Throwable cause) {
if (context.getRequiredTestInstance() instanceof JavacTemplateTestBase instance) {
errors.addAll(instance.diags.errorKeys());
if (instance instanceof CompilationTestCase) {
// Make sure offending template ends up in log file on failure
System.err.printf("Diagnostics: %s%nTemplate: %s%n", instance.diags.errorKeys(),
instance.sourceFiles.stream().map(SourceFile::template).toList());
}
}
}
@Override
public void afterAll(ExtensionContext extensionContext) {
if (errors.isEmpty()) return;
System.err.println("Errors found in tests: " + errors);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -31,30 +31,14 @@ import java.util.stream.IntStream;
import javax.tools.Diagnostic;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
import static java.util.stream.Collectors.toList;
/**
* Base class for negative and positive compilation tests.
*/
@Test
public class CompilationTestCase extends JavacTemplateTestBase {
private String[] compileOptions = new String[] { };
private String[] compileOptions = new String[]{};
private String defaultFileName = "Source.java";
private String programShell = "#";
@AfterMethod
public void dumpTemplateIfError(ITestResult result) {
// Make sure offending template ends up in log file on failure
if (!result.isSuccess()) {
System.err.printf("Diagnostics: %s%nTemplate: %s%n", diags.errorKeys(),
sourceFiles.stream().map(p -> p.snd).collect(toList()));
}
}
protected void setProgramShell(String shell) {
programShell = shell;
}
@ -81,7 +65,7 @@ public class CompilationTestCase extends JavacTemplateTestBase {
throw new AssertionError("unexpected negative value " + i);
}
if (i >= compileOptions.length) {
compileOptions = new String[] {};
compileOptions = new String[]{};
} else {
compileOptions = Arrays.copyOf(compileOptions, compileOptions.length - i);
}
@ -105,8 +89,7 @@ public class CompilationTestCase extends JavacTemplateTestBase {
File dir = null;
try {
dir = compile(generate);
}
catch (IOException e) {
} catch (IOException e) {
throw new RuntimeException(e);
}
postTest.run();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -33,10 +33,8 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
import javax.tools.Diagnostic;
@ -48,17 +46,13 @@ import javax.tools.StandardLocation;
import javax.tools.ToolProvider;
import com.sun.source.util.JavacTask;
import com.sun.tools.javac.util.Pair;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.AfterSuite;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.extension.ExtendWith;
import static org.testng.Assert.fail;
import static org.junit.jupiter.api.Assertions.fail;
/**
* Base class for template-driven TestNG javac tests that support on-the-fly
* Base class for template-driven JUnit javac tests that support on-the-fly
* source file generation, compilation, classloading, execution, and separate
* compilation.
*
@ -70,16 +64,15 @@ import static org.testng.Assert.fail;
*
* @author Brian Goetz
*/
@Test
@ExtendWith(ComboWatcher.class)
public abstract class JavacTemplateTestBase {
private static final Set<String> suiteErrors = Collections.synchronizedSet(new HashSet<>());
private static final AtomicInteger counter = new AtomicInteger();
private static final File root = new File("gen");
private static final File nullDir = new File("empty");
protected final Map<String, Template> templates = new HashMap<>();
protected final Diagnostics diags = new Diagnostics();
protected final List<Pair<String, String>> sourceFiles = new ArrayList<>();
protected final List<SourceFile> sourceFiles = new ArrayList<>();
protected final List<String> compileOptions = new ArrayList<>();
protected final List<File> classpaths = new ArrayList<>();
@ -95,7 +88,7 @@ public abstract class JavacTemplateTestBase {
/** Add a source file */
protected void addSourceFile(String name, String template) {
sourceFiles.add(new Pair<>(name, template));
sourceFiles.add(new SourceFile(name, template));
}
/** Add a File to the class path to be used when loading classes; File values
@ -130,7 +123,7 @@ public abstract class JavacTemplateTestBase {
protected void resetClassPaths() { classpaths.clear(); }
// Before each test method, reset everything
@BeforeMethod
@BeforeEach
public void reset() {
resetCompileOptions();
resetDiagnostics();
@ -139,38 +132,6 @@ public abstract class JavacTemplateTestBase {
resetClassPaths();
}
// After each test method, if the test failed, capture source files and diagnostics and put them in the log
@AfterMethod
public void copyErrors(ITestResult result) {
if (!result.isSuccess()) {
suiteErrors.addAll(diags.errorKeys());
List<Object> list = new ArrayList<>();
Collections.addAll(list, result.getParameters());
list.add("Test case: " + getTestCaseDescription());
for (Pair<String, String> e : sourceFiles)
list.add("Source file " + e.fst + ": " + e.snd);
if (diags.errorsFound())
list.add("Compile diagnostics: " + diags.toString());
result.setParameters(list.toArray(new Object[list.size()]));
}
}
@AfterSuite
// After the suite is done, dump any errors to output
public void dumpErrors() {
if (!suiteErrors.isEmpty())
System.err.println("Errors found in test suite: " + suiteErrors);
}
/**
* Get a description of this test case; since test cases may be combinatorially
* generated, this should include all information needed to describe the test case
*/
protected String getTestCaseDescription() {
return this.toString();
}
/** Assert that all previous calls to compile() succeeded */
protected void assertCompileSucceeded() {
if (diags.errorsFound())
@ -258,9 +219,7 @@ public abstract class JavacTemplateTestBase {
/** Compile all registered source files, optionally generating class files
* and returning a File describing the directory to which they were written */
protected File compile(boolean generate) throws IOException {
List<JavaFileObject> files = new ArrayList<>();
for (Pair<String, String> e : sourceFiles)
files.add(new FileAdapter(e.fst, e.snd));
var files = sourceFiles.stream().map(FileAdapter::new).toList();
return compile(classpaths, files, generate);
}
@ -268,13 +227,11 @@ public abstract class JavacTemplateTestBase {
* for finding required classfiles, optionally generating class files
* and returning a File describing the directory to which they were written */
protected File compile(List<File> classpaths, boolean generate) throws IOException {
List<JavaFileObject> files = new ArrayList<>();
for (Pair<String, String> e : sourceFiles)
files.add(new FileAdapter(e.fst, e.snd));
var files = sourceFiles.stream().map(FileAdapter::new).toList();
return compile(classpaths, files, generate);
}
private File compile(List<File> classpaths, List<JavaFileObject> files, boolean generate) throws IOException {
private File compile(List<File> classpaths, List<? extends JavaFileObject> files, boolean generate) throws IOException {
JavaCompiler systemJavaCompiler = ToolProvider.getSystemJavaCompiler();
try (StandardJavaFileManager fm = systemJavaCompiler.getStandardFileManager(null, null, null)) {
if (classpaths.size() > 0)
@ -327,9 +284,9 @@ public abstract class JavacTemplateTestBase {
private class FileAdapter extends SimpleJavaFileObject {
private final String templateString;
FileAdapter(String filename, String templateString) {
super(URI.create("myfo:/" + filename), Kind.SOURCE);
this.templateString = templateString;
FileAdapter(SourceFile file) {
super(URI.create("myfo:/" + file.name()), Kind.SOURCE);
this.templateString = file.template();
}
public CharSequence getCharContent(boolean ignoreEncodingErrors) {

View File

@ -0,0 +1,26 @@
/*
* Copyright (c) 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package tools.javac.combo;
public record SourceFile(String name, String template) {}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,34 +23,34 @@
package tools.javac.combo;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import static org.junit.jupiter.api.Assertions.*;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import java.util.HashMap;
import java.util.Map;
import static org.testng.Assert.assertEquals;
/**
* TemplateTest
*/
@Test
public class TemplateTest {
Map<String, Template> vars = new HashMap<>();
class TemplateTest {
final Map<String, Template> vars = new HashMap<>();
@BeforeTest
@BeforeEach
void before() { vars.clear(); }
private void assertTemplate(String expected, String template) {
String result = Template.expandTemplate(template, vars);
assertEquals(result, expected, "for " + template);
assertEquals(expected, result, "for " + template);
}
private String dotIf(String s) {
return s == null || s.isEmpty() ? "" : "." + s;
}
public void testTemplateExpansion() {
@Test
void testTemplateExpansion() {
vars.put("A", s -> "a" + dotIf(s));
vars.put("B", s -> "b" + dotIf(s));
vars.put("C", s -> "#{A}#{B}");
@ -72,7 +72,8 @@ public class TemplateTest {
assertTemplate("#{A", "#{A");
}
public void testIndexedTemplate() {
@Test
void testIndexedTemplate() {
vars.put("A[0]", s -> "a" );
vars.put("A[1]", s -> "b" );
vars.put("A[2]", s -> "c" );
@ -82,13 +83,14 @@ public class TemplateTest {
assertTemplate("c", "#{A[2]}");
}
public void testAngleBrackets() {
@Test
void testAngleBrackets() {
vars.put("X", s -> "xyz");
assertTemplate("List<String> ls = xyz;", "List<String> ls = #{X};");
}
@Test(expectedExceptions = IllegalStateException.class )
public void testUnknownKey() {
assertTemplate("#{Q}", "#{Q}");
@Test
void testUnknownKey() {
assertThrows(IllegalStateException.class, () -> assertTemplate("#{Q}", "#{Q}"));
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -21,19 +21,12 @@
* questions.
*/
import java.io.IOException;
import java.util.List;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
import org.junit.jupiter.api.Test;
import tools.javac.combo.CompilationTestCase;
import tools.javac.combo.JavacTemplateTestBase;
import static java.util.stream.Collectors.toList;
@Test
public class ExpSwitchNestingTest extends CompilationTestCase {
class ExpSwitchNestingTest extends CompilationTestCase {
private static final String RUNNABLE = "Runnable r = () -> { # };";
private static final String INT_FN = "java.util.function.IntSupplier r = () -> { # };";
private static final String LABEL = "label: #";
@ -77,14 +70,16 @@ public class ExpSwitchNestingTest extends CompilationTestCase {
setProgramShell(SHELL);
}
public void testReallySimpleCases() {
@Test
void testReallySimpleCases() {
for (String s : CONTAINERS)
assertOK(s, NOTHING);
for (String s : CONTAINER_STATEMENTS)
assertOK(LABEL, s, NOTHING);
}
public void testLambda() {
@Test
void testLambda() {
assertOK(RUNNABLE, RETURN_N);
assertOK(RUNNABLE, NOTHING);
assertOK(INT_FN, RETURN_Z);
@ -106,7 +101,8 @@ public class ExpSwitchNestingTest extends CompilationTestCase {
assertFail("compiler.err.undef.label", LABEL, BLOCK, INT_FN, CONTINUE_L);
}
public void testEswitch() {
@Test
void testEswitch() {
//Int-valued switch expressions
assertOK(ESWITCH_Z, YIELD_Z);
assertOK(LABEL, BLOCK, ESWITCH_Z, YIELD_Z);
@ -151,7 +147,8 @@ public class ExpSwitchNestingTest extends CompilationTestCase {
}
public void testNestedInExpSwitch() {
@Test
void testNestedInExpSwitch() {
assertOK(ESWITCH_Z, IF, YIELD_Z);
assertOK(ESWITCH_Z, BLOCK, YIELD_Z);
//
@ -184,7 +181,8 @@ public class ExpSwitchNestingTest extends CompilationTestCase {
assertOK(ESWITCH_Z, YIELD_Z, BLOCK, DO, IF, YIELD_Z);
}
public void testBreakExpressionLabelDisambiguation() {
@Test
void testBreakExpressionLabelDisambiguation() {
assertOK(DEF_LABEL_VAR, ESWITCH_Z, YIELD_L);
assertFail("compiler.err.undef.label", DEF_LABEL_VAR, ESWITCH_Z, BREAK_L);
assertFail("compiler.err.break.outside.switch.expression", LABEL, FOR, BLOCK, DEF_LABEL_VAR, ESWITCH_Z, BREAK_L);
@ -194,11 +192,13 @@ public class ExpSwitchNestingTest extends CompilationTestCase {
//
}
public void testFunReturningSwitchExp() {
@Test
void testFunReturningSwitchExp() {
assertOK(INT_FN_ESWITCH, YIELD_INT_FN);
}
public void testContinueLoops() {
@Test
void testContinueLoops() {
assertOK(LABEL, FOR, CONTINUE_L);
assertOK(LABEL, FOR_EACH, CONTINUE_L);
assertOK(LABEL, WHILE, CONTINUE_L);

View File

@ -1,4 +1,4 @@
TestNG.dirs = .
JUnit.dirs = .
lib.dirs = /lib/combo

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -31,12 +31,12 @@ import java.util.List;
import java.util.Map;
import java.util.StringJoiner;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import tools.javac.combo.*;
import static org.testng.Assert.fail;
import static org.junit.jupiter.api.Assertions.fail;
/**
* BridgeMethodTestCase -- used for asserting linkage to bridges under separate compilation.
@ -56,7 +56,6 @@ import static org.testng.Assert.fail;
* @author Brian Goetz
*/
@Test
public abstract class BridgeMethodTestCase extends JavacTemplateTestBase {
private static final String TYPE_LETTERS = "ABCDIJK";
@ -229,7 +228,7 @@ public abstract class BridgeMethodTestCase extends JavacTemplateTestBase {
return files;
}
@BeforeMethod
@BeforeEach
@Override
public void reset() {
compileDirs.clear();

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2013, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2013, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -22,16 +22,16 @@
*/
import java.io.IOException;
import org.testng.annotations.Test;
import tools.javac.combo.*;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
/**
* BridgeMethodsTemplateTest
*
* @author Brian Goetz
*/
@Test
public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
/*
* Cc1(A) -> Cc1(Ac0)
@ -39,7 +39,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited from A
* 1: Declared in C
*/
public void test1() throws IOException, ReflectiveOperationException {
@Test
void test1() throws IOException, ReflectiveOperationException {
compileSpec("Cc1(A)");
assertLinkage("C", LINKAGE_ERROR, "C1");
recompileSpec("Cc1(Ac0)", "A");
@ -52,7 +53,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited default from I
* 1: Declared in C
*/
public void test2() throws IOException, ReflectiveOperationException {
@Test
void test2() throws IOException, ReflectiveOperationException {
compileSpec("Cc1(I)");
assertLinkage("C", LINKAGE_ERROR, "C1");
recompileSpec("Cc1(Id0)", "I");
@ -65,7 +67,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited from A
* 1: Inherited from B
*/
public void test3() throws IOException, ReflectiveOperationException {
@Test
void test3() throws IOException, ReflectiveOperationException {
compileSpec("C(Bc1(A))");
assertLinkage("C", LINKAGE_ERROR, "B1");
recompileSpec("C(Bc1(Ac0))", "A");
@ -78,7 +81,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0: Inherited from B (through bridge)
* 1: Inherited from B
*/
public void test4() throws IOException, ReflectiveOperationException {
@Test
void test4() throws IOException, ReflectiveOperationException {
compileSpec("C(B(Ac0))");
assertLinkage("C", "A0", LINKAGE_ERROR);
recompileSpec("C(Bc1(Ac0))", "B");
@ -91,7 +95,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0: Inherited from B (through bridge)
* 1: Inherited from B
*/
public void test5() throws IOException, ReflectiveOperationException {
@Test
void test5() throws IOException, ReflectiveOperationException {
compileSpec("C(B(A))");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR);
recompileSpec("C(Bc1(Ac0))", "A", "B");
@ -104,7 +109,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited default from I
* 1: Inherited from A
*/
public void test6() throws IOException, ReflectiveOperationException {
@Test
void test6() throws IOException, ReflectiveOperationException {
compileSpec("C(Ac1(I))");
assertLinkage("C", LINKAGE_ERROR, "A1");
recompileSpec("C(Ac1(Id0))", "I");
@ -117,7 +123,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0: Inherited from A (through bridge)
* 1: Inherited from A
*/
public void test7() throws IOException, ReflectiveOperationException {
@Test
void test7() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0))");
assertLinkage("C", "I0", LINKAGE_ERROR);
recompileSpec("C(Ac1(Id0))", "A");
@ -130,7 +137,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited from A (through bridge)
* 1*: Inherited from A
*/
public void test8() throws IOException, ReflectiveOperationException {
@Test
void test8() throws IOException, ReflectiveOperationException {
compileSpec("C(A(I))");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR);
recompileSpec("C(Ac1(Id0))", "A", "I");
@ -143,7 +151,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited default from J
* 1: Inherited default from I
*/
public void test9() throws IOException, ReflectiveOperationException {
@Test
void test9() throws IOException, ReflectiveOperationException {
compileSpec("C(Id1(J))");
assertLinkage("C", LINKAGE_ERROR, "I1");
recompileSpec("C(Id1(Jd0))", "J");
@ -156,7 +165,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0: Inherited default from I (through bridge)
* 1: Inherited default from I
*/
public void test10() throws IOException, ReflectiveOperationException {
@Test
void test10() throws IOException, ReflectiveOperationException {
compileSpec("C(I(Jd0))");
assertLinkage("C", "J0", LINKAGE_ERROR);
recompileSpec("C(Id1(Jd0))", "I");
@ -169,7 +179,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0: Inherited default from I (through bridge)
* 1: Inherited default from I
*/
public void test11() throws IOException, ReflectiveOperationException {
@Test
void test11() throws IOException, ReflectiveOperationException {
compileSpec("C(I(J))");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR);
recompileSpec("C(Id1(Jd0))", "I", "J");
@ -183,7 +194,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from B
* 2: Declared in C
*/
public void test12() throws IOException, ReflectiveOperationException {
@Test
void test12() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(B(Ac0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Bc1(Ac0))", "B");
@ -197,7 +209,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from B
* 2: Declared in C
*/
public void test13() throws IOException, ReflectiveOperationException {
@Test
void test13() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(B(Aa0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Bc1(Aa0))", "B");
@ -211,7 +224,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test14() throws IOException, ReflectiveOperationException {
@Test
void test14() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Bc1(A))");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Bc1(Ac0))", "A");
@ -225,7 +239,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test15() throws IOException, ReflectiveOperationException {
@Test
void test15() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Ba1(A))");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Ba1(Ac0))", "A");
@ -239,7 +254,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from B
* 2: Declared in C
*/
public void test16() throws IOException, ReflectiveOperationException {
@Test
void test16() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(B(A))");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Bc1(Ac0))", "B", "A");
@ -253,7 +269,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from A
* 2: Declared in C
*/
public void test17() throws IOException, ReflectiveOperationException {
@Test
void test17() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A(Id0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1(Id0))", "A");
@ -267,7 +284,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from A
* 2: Declared in C
*/
public void test18() throws IOException, ReflectiveOperationException {
@Test
void test18() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A(Ia0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1(Ia0))", "A");
@ -281,7 +299,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test19() throws IOException, ReflectiveOperationException {
@Test
void test19() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Ac1(I))");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Ac1(Id0))", "I");
@ -295,7 +314,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test20() throws IOException, ReflectiveOperationException {
@Test
void test20() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Aa1(I))");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Aa1(Id0))", "I");
@ -309,7 +329,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from A
* 2: Declared in C
*/
public void test21() throws IOException, ReflectiveOperationException {
@Test
void test21() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A(I))");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1(Id0))", "A", "I");
@ -323,7 +344,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test22() throws IOException, ReflectiveOperationException {
@Test
void test22() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(J(Id0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Jd1(Id0))", "J");
@ -337,7 +359,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test23() throws IOException, ReflectiveOperationException {
@Test
void test23() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(J(Ia0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Jd1(Ia0))", "J");
@ -351,7 +374,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test24() throws IOException, ReflectiveOperationException {
@Test
void test24() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Jd1(I))");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Jd1(Id0))", "I");
@ -365,7 +389,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test25() throws IOException, ReflectiveOperationException {
@Test
void test25() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Ja1(I))");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Ja1(Id0))", "I");
@ -379,7 +404,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test26() throws IOException, ReflectiveOperationException {
@Test
void test26() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(J(I))");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Jd1(Id0))", "J", "I");
@ -392,7 +418,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited default from I
* 1: Inherited from A
*/
public void test27() throws IOException, ReflectiveOperationException {
@Test
void test27() throws IOException, ReflectiveOperationException {
compileSpec("C(Ac1,I)");
assertLinkage("C", LINKAGE_ERROR, "A1");
recompileSpec("C(Ac1,Id0)", "I");
@ -405,7 +432,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited default from I
* 1: Inherited from A
*/
public void test28() throws IOException, ReflectiveOperationException {
@Test
void test28() throws IOException, ReflectiveOperationException {
compileSpec("C(A,Id0)");
assertLinkage("C", "I0", LINKAGE_ERROR);
recompileSpec("C(Ac1,Id0)", "A");
@ -418,7 +446,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited default from I
* 1: Inherited from A
*/
public void test29() throws IOException, ReflectiveOperationException {
@Test
void test29() throws IOException, ReflectiveOperationException {
compileSpec("C(A,I)");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR);
recompileSpec("C(Ac1,Id0)", "A", "I");
@ -432,7 +461,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test30() throws IOException, ReflectiveOperationException {
@Test
void test30() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Ac1,I)");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Ac1,Id0)", "I");
@ -446,7 +476,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Declared in C (through bridge)
* 2: Declared in C
*/
public void test31() throws IOException, ReflectiveOperationException {
@Test
void test31() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Aa1,I)");
assertLinkage("C", LINKAGE_ERROR, "C2", "C2");
recompileSpec("Cc2(Aa1,Id0)", "I");
@ -460,7 +491,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from A
* 2: Declared in C
*/
public void test32() throws IOException, ReflectiveOperationException {
@Test
void test32() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A,Id0)");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1,Id0)", "A");
@ -474,7 +506,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from A
* 2: Declared in C
*/
public void test33() throws IOException, ReflectiveOperationException {
@Test
void test33() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A,Ia0)");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1,Ia0)", "A");
@ -488,7 +521,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from I
* 2: Declared in C
*/
public void test34() throws IOException, ReflectiveOperationException {
@Test
void test34() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A,I)");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1,Id0)", "A", "I");
@ -502,7 +536,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test35() throws IOException, ReflectiveOperationException {
@Test
void test35() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Id0,J)");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Id0,Jd1)", "J");
@ -516,7 +551,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test36() throws IOException, ReflectiveOperationException {
@Test
void test36() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(Ia0,J)");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ia0,Jd1)", "J");
@ -530,7 +566,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test37() throws IOException, ReflectiveOperationException {
@Test
void test37() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(I,J)");
assertLinkage("C", LINKAGE_ERROR, LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Id0,Jd1)", "I", "J");
@ -544,7 +581,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited from A (through bridge)
* 1*: Inherited from A
*/
public void test38() throws IOException, ReflectiveOperationException {
@Test
void test38() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0),J(Id0))");
assertLinkage("C", "I0", LINKAGE_ERROR);
recompileSpec("C(Ac1(Id0),J(Id0))", "A");
@ -558,7 +596,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0: Inherited default from J (through bridge)
* 1*: Inherited default from J
*/
public void test39() throws IOException, ReflectiveOperationException {
@Test
void test39() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0),J(Id0))");
assertLinkage("C", "I0", LINKAGE_ERROR);
recompileSpec("C(A(Id0),Jd1(Id0))", "J");
@ -573,7 +612,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Inherited from A
*/
public void test40() throws IOException, ReflectiveOperationException {
@Test
void test40() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0),J(Id0))");
assertLinkage("C", "I0", LINKAGE_ERROR);
recompileSpec("C(Ac2(Id0),Jd1(Id0))", "A", "J");
@ -587,7 +627,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 0*: Inherited default from J (through bridge)
* 1: Inherited default from J
*/
public void test41() throws IOException, ReflectiveOperationException {
@Test
void test41() throws IOException, ReflectiveOperationException {
compileSpec("C(J(Id0),K(Id0))");
assertLinkage("C", "I0", LINKAGE_ERROR);
recompileSpec("C(Jd1(Id0),K(Id0))", "J");
@ -601,7 +642,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Inherited from A
*/
public void test42() throws IOException, ReflectiveOperationException {
@Test
void test42() throws IOException, ReflectiveOperationException {
compileSpec("C(Ac2(Id0),J(Id0))");
assertLinkage("C", "A2", LINKAGE_ERROR, "A2");
recompileSpec("C(Ac2(Id0),Jd1(Id0))", "J");
@ -615,7 +657,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Inherited from A
*/
public void test43() throws IOException, ReflectiveOperationException {
@Test
void test43() throws IOException, ReflectiveOperationException {
compileSpec("C(Ac2(Ia0),J(Ia0))");
assertLinkage("C", "A2", LINKAGE_ERROR, "A2");
recompileSpec("C(Ac2(Ia0),Jd1(Ia0))", "J");
@ -630,7 +673,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Inherited default from J
* 2*: Inherited from A
*/
public void test44() throws IOException, ReflectiveOperationException {
@Test
void test44() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0),Jd1(Id0))");
assertLinkage("C", "J1", "J1", LINKAGE_ERROR);
recompileSpec("C(Ac2(Id0),Jd1(Id0))", "A");
@ -645,7 +689,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1: Inherited default from J
* 2*: Inherited from A
*/
public void test45() throws IOException, ReflectiveOperationException {
@Test
void test45() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Ia0),Jd1(Ia0))");
assertLinkage("C", "J1", "J1", LINKAGE_ERROR);
recompileSpec("C(Ac2(Ia0),Jd1(Ia0))", "A");
@ -659,7 +704,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from A
* 2: Declared in C
*/
public void test46() throws IOException, ReflectiveOperationException {
@Test
void test46() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A(Id0),J(Id0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1(Id0),J(Id0))", "A");
@ -673,7 +719,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited from A
* 2: Declared in C
*/
public void test47() throws IOException, ReflectiveOperationException {
@Test
void test47() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A(Ia0),J(Ia0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Ac1(Ia0),J(Ia0))", "A");
@ -687,7 +734,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test48() throws IOException, ReflectiveOperationException {
@Test
void test48() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A(Id0),J(Id0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(A(Id0),Jd1(Id0))", "J");
@ -701,7 +749,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test49() throws IOException, ReflectiveOperationException {
@Test
void test49() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(A(Ia0),J(Ia0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(A(Ia0),Jd1(Ia0))", "J");
@ -717,7 +766,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from J
* 3: Declared in C
*/
public void test50() throws IOException, ReflectiveOperationException {
@Test
void test50() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(A(Id0),J(Id0))");
assertLinkage("C", "C3", LINKAGE_ERROR, LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Ac1(Id0),Jd2(Id0))", "A", "J");
@ -732,7 +782,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from J
* 3: Declared in C
*/
public void test51() throws IOException, ReflectiveOperationException {
@Test
void test51() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(A(Ia0),J(Ia0))");
assertLinkage("C", "C3", LINKAGE_ERROR, LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Ac1(Ia0),Jd2(Ia0))", "A", "J");
@ -746,7 +797,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test52() throws IOException, ReflectiveOperationException {
@Test
void test52() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(J(Id0),K(Id0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Jd1(Id0),K(Id0))", "J");
@ -760,7 +812,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 1*: Inherited default from J
* 2: Declared in C
*/
public void test53() throws IOException, ReflectiveOperationException {
@Test
void test53() throws IOException, ReflectiveOperationException {
compileSpec("Cc2(J(Ia0),K(Ia0))");
assertLinkage("C", "C2", LINKAGE_ERROR, "C2");
recompileSpec("Cc2(Jd1(Ia0),K(Ia0))", "J");
@ -775,7 +828,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from K
* 3: Declared in C
*/
public void test54() throws IOException, ReflectiveOperationException {
@Test
void test54() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(J(Id0),K(Id0))");
assertLinkage("C", "C3", LINKAGE_ERROR, LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Jd1(Id0),Kd2(Id0))", "J", "K");
@ -790,7 +844,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from K
* 3: Declared in C
*/
public void test55() throws IOException, ReflectiveOperationException {
@Test
void test55() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(J(Ia0),K(Ia0))");
assertLinkage("C", "C3", LINKAGE_ERROR, LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Jd1(Ia0),Kd2(Ia0))", "J", "K");
@ -805,7 +860,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from J
* 3: Declared in C
*/
public void test56() throws IOException, ReflectiveOperationException {
@Test
void test56() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Ac1(Id0),J(Id0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Ac1(Id0),Jd2(Id0))", "J");
@ -820,7 +876,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from J
* 3: Declared in C
*/
public void test57() throws IOException, ReflectiveOperationException {
@Test
void test57() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Ac1(Ia0),J(Ia0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Ac1(Ia0),Jd2(Ia0))", "J");
@ -835,7 +892,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from J
* 3: Declared in C
*/
public void test58() throws IOException, ReflectiveOperationException {
@Test
void test58() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Aa1(Id0),J(Id0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Aa1(Id0),Jd2(Id0))", "J");
@ -850,7 +908,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from J
* 3: Declared in C
*/
public void test59() throws IOException, ReflectiveOperationException {
@Test
void test59() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Aa1(Ia0),J(Ia0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Aa1(Ia0),Jd2(Ia0))", "J");
@ -865,7 +924,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2: Declared in C (through bridge)
* 3: Declared in C
*/
public void test60() throws IOException, ReflectiveOperationException {
@Test
void test60() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(A(Id0),Jd2(Id0))");
assertLinkage("C", "C3", LINKAGE_ERROR, "C3", "C3");
recompileSpec("Cc3(Ac1(Id0),Jd2(Id0))", "A");
@ -880,7 +940,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2: Declared in C (through bridge)
* 3: Declared in C
*/
public void test61() throws IOException, ReflectiveOperationException {
@Test
void test61() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(A(Ia0),Jd2(Ia0))");
assertLinkage("C", "C3", LINKAGE_ERROR, "C3", "C3");
recompileSpec("Cc3(Ac1(Ia0),Jd2(Ia0))", "A");
@ -895,7 +956,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2: Declared in C (through bridge)
* 3: Declared in C
*/
public void test62() throws IOException, ReflectiveOperationException {
@Test
void test62() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(A(Id0),Ja2(Id0))");
assertLinkage("C", "C3", LINKAGE_ERROR, "C3", "C3");
recompileSpec("Cc3(Ac1(Id0),Ja2(Id0))", "A");
@ -910,7 +972,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2: Declared in C (through bridge)
* 3: Declared in C
*/
public void test63() throws IOException, ReflectiveOperationException {
@Test
void test63() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(A(Ia0),Ja2(Ia0))");
assertLinkage("C", "C3", LINKAGE_ERROR, "C3", "C3");
recompileSpec("Cc3(Ac1(Ia0),Ja2(Ia0))", "A");
@ -925,7 +988,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from K
* 3: Declared in C
*/
public void test64() throws IOException, ReflectiveOperationException {
@Test
void test64() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Jd1(Id0),K(Id0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Jd1(Id0),Kd2(Id0))", "K");
@ -940,7 +1004,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from K
* 3: Declared in C
*/
public void test65() throws IOException, ReflectiveOperationException {
@Test
void test65() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Jd1(Ia0),K(Ia0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Jd1(Ia0),Kd2(Ia0))", "K");
@ -955,7 +1020,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from K
* 3: Declared in C
*/
public void test66() throws IOException, ReflectiveOperationException {
@Test
void test66() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Jd1(Id0),K(Id0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Jd1(Id0),Kd2(Id0))", "K");
@ -970,7 +1036,8 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
* 2*: Inherited default from K
* 3: Declared in C
*/
public void test67() throws IOException, ReflectiveOperationException {
@Test
void test67() throws IOException, ReflectiveOperationException {
compileSpec("Cc3(Jd1(Ia0),K(Ia0))");
assertLinkage("C", "C3", "C3", LINKAGE_ERROR, "C3");
recompileSpec("Cc3(Jd1(Ia0),Kd2(Ia0))", "K");
@ -978,57 +1045,68 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
}
// Dan's set A
public void testA1() throws IOException, ReflectiveOperationException {
@Test
void testA1() throws IOException, ReflectiveOperationException {
compileSpec("C(Id0)");
assertLinkage("C", "I0");
}
public void testA2() throws IOException, ReflectiveOperationException {
@Test
void testA2() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0))");
assertLinkage("C", "I0");
}
public void testA3() throws IOException, ReflectiveOperationException {
@Test
void testA3() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0),J)");
assertLinkage("C", "I0");
}
public void testA4() throws IOException, ReflectiveOperationException {
@Test
void testA4() throws IOException, ReflectiveOperationException {
compileSpec("D(C(Id0),Jd0(Id0))");
assertLinkage("D", "J0");
assertLinkage("C", "I0");
}
public void testA5() throws IOException, ReflectiveOperationException {
@Test
void testA5() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0),Jd0)",
"compiler.err.types.incompatible");
}
public void testA6() throws IOException, ReflectiveOperationException {
@Test
void testA6() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Ia0,Jd0))",
"compiler.err.does.not.override.abstract",
"compiler.err.types.incompatible");
}
public void testA7() throws IOException, ReflectiveOperationException {
@Test
void testA7() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Id0,Jd0))",
"compiler.err.types.incompatible");
}
public void testA8() throws IOException, ReflectiveOperationException {
@Test
void testA8() throws IOException, ReflectiveOperationException {
compileSpec("C(A(Ia0),J)", "compiler.err.does.not.override.abstract");
}
public void testA9() throws IOException, ReflectiveOperationException {
@Test
void testA9() throws IOException, ReflectiveOperationException {
compileSpec("C(Ac0(Id0))");
assertLinkage("C", "A0");
}
public void testA10() throws IOException, ReflectiveOperationException {
@Test
void testA10() throws IOException, ReflectiveOperationException {
compileSpec("C(Aa0,I)", "compiler.err.does.not.override.abstract");
}
public void testA11() throws IOException, ReflectiveOperationException {
@Test
void testA11() throws IOException, ReflectiveOperationException {
compileSpec("C(Ac0,Id0)");
assertLinkage("C", "A0");
}
@ -1036,14 +1114,16 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
// Dan's set B
/* B1 can't be done, needs a second concrete class D
public void testB1() throws IOException, ReflectiveOperationException {
@Test
void testB1() throws IOException, ReflectiveOperationException {
compileSpec("Cc1(Dc0)");
assertLinkage("C", "C1", "C1");
assertLinkage("D", "A0", LINKAGE_ERROR);
}
*/
public void testB2() throws IOException, ReflectiveOperationException {
@Test
void testB2() throws IOException, ReflectiveOperationException {
compileSpec("Cc1(Ac0)");
assertLinkage("C", "C1", "C1");
}
@ -1056,22 +1136,26 @@ public class BridgeMethodsTemplateTest extends BridgeMethodTestCase {
// B4 needs too many classes
public void testB5() throws IOException, ReflectiveOperationException {
@Test
void testB5() throws IOException, ReflectiveOperationException {
compileSpec("Cc1(Aa1(Id0))");
assertLinkage("C", "C1", "C1");
}
public void testB6() throws IOException, ReflectiveOperationException {
@Test
void testB6() throws IOException, ReflectiveOperationException {
compileSpec("C(Ac1(Id0))");
assertLinkage("C", "A1", "A1");
}
public void testB7() throws IOException, ReflectiveOperationException {
@Test
void testB7() throws IOException, ReflectiveOperationException {
compileSpec("Cc1(Id0)");
assertLinkage("C", "C1", "C1");
}
public void testB8() throws IOException, ReflectiveOperationException {
@Test
void testB8() throws IOException, ReflectiveOperationException {
compileSpec("C(Jd1(Id0))");
assertLinkage("C", "J1", "J1");
}

View File

@ -1,6 +1,6 @@
# This file identifies root(s) of the test-ng hierarchy.
# This file identifies root(s) of the JUnit hierarchy.
TestNG.dirs = .
JUnit.dirs = .
lib.dirs = /lib/combo

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -29,7 +29,7 @@
* @modules
* jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.util
* @run testng BoundUnboundSearchTest
* @run junit BoundUnboundSearchTest
*/
import java.util.function.*;
@ -40,13 +40,10 @@ import com.sun.tools.javac.api.ClientCodeWrapper.DiagnosticSourceUnwrapper;
import com.sun.tools.javac.util.Assert;
import com.sun.tools.javac.util.JCDiagnostic;
import org.testng.annotations.Test;
import org.junit.jupiter.api.Test;
import tools.javac.combo.CompilationTestCase;
import static org.testng.Assert.assertEquals;
@Test
public class BoundUnboundSearchTest extends CompilationTestCase {
class BoundUnboundSearchTest extends CompilationTestCase {
static final String TEMPLATE =
"""
import java.util.function.*;
@ -58,7 +55,7 @@ public class BoundUnboundSearchTest extends CompilationTestCase {
}
""";
public BoundUnboundSearchTest() {
BoundUnboundSearchTest() {
setDefaultFilename("Test.java");
setCompileOptions(new String[]{"--debug=dumpMethodReferenceSearchResults"});
}
@ -75,7 +72,8 @@ public class BoundUnboundSearchTest extends CompilationTestCase {
};
}
public void test() {
@Test
void test() {
assertOK(
getDiagConsumer(0, -1),
TEMPLATE.replaceFirst("#CANDIDATES",

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2018, 2019, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2018, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -23,18 +23,11 @@
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import org.testng.ITestResult;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.Test;
import org.junit.jupiter.api.Test;
import tools.javac.combo.JavacTemplateTestBase;
import static java.util.stream.Collectors.toList;
@Test
public class ScopeTest extends JavacTemplateTestBase {
class ScopeTest extends JavacTemplateTestBase {
private static String st_block(String... statements) {
return Arrays.stream(statements).collect(Collectors.joining("", "{", "}"));
@ -84,14 +77,6 @@ public class ScopeTest extends JavacTemplateTestBase {
return "!(" + expr + ")";
}
@AfterMethod
public void dumpTemplateIfError(ITestResult result) {
// Make sure offending template ends up in log file on failure
if (!result.isSuccess()) {
System.err.printf("Diagnostics: %s%nTemplate: %s%n", diags.errorKeys(), sourceFiles.stream().map(p -> p.snd).collect(toList()));
}
}
private void program(String block) {
String s = "class C { void m(Object o) " + block + "}";
addSourceFile("C.java", s);
@ -121,24 +106,28 @@ public class ScopeTest extends JavacTemplateTestBase {
assertCompileFailed(expectedDiag);
}
public void testIf() {
@Test
void testIf() {
assertOK(st_block(st_if(expr_o_match_str(), st_s_use(), st_return()), st_s_use()));
assertOK(st_block(st_if(expr_not(expr_o_match_str()), st_return(), st_s_use()), st_s_use()));
assertFail("compiler.err.cant.resolve.location", st_block(st_if(expr_o_match_str(), st_s_use(), st_noop()), st_s_use()));
assertFail("compiler.err.cant.resolve.location", st_block(st_if(expr_not(expr_o_match_str()), st_noop(), st_s_use()), st_s_use()));
}
public void testWhile() {
@Test
void testWhile() {
assertOK(st_block(st_while(expr_not(expr_o_match_str()), st_noop()), st_s_use()));
assertFail("compiler.err.cant.resolve.location", st_block(st_while(expr_not(expr_o_match_str()), st_break()), st_s_use()));
}
public void testDoWhile() {
@Test
void testDoWhile() {
assertOK(st_block(st_do_while(st_noop(), expr_not(expr_o_match_str())), st_s_use()));
assertFail("compiler.err.cant.resolve.location", st_block(st_do_while(st_break(), expr_not(expr_o_match_str())), st_s_use()));
}
public void testFor() {
@Test
void testFor() {
assertOK(st_block(st_for(expr_empty(), expr_not(expr_o_match_str()), expr_empty(), st_noop()), st_s_use()));
assertFail("compiler.err.cant.resolve.location", st_block(st_for(expr_empty(), expr_not(expr_o_match_str()), expr_empty(), st_break()), st_s_use()));
}

View File

@ -1,4 +1,4 @@
TestNG.dirs = .
JUnit.dirs = .
lib.dirs = /lib/combo

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -29,17 +29,15 @@
* @modules jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.file
* jdk.compiler/com.sun.tools.javac.util
* @run testng/othervm LocalStaticDeclarations2
* @run junit/othervm LocalStaticDeclarations2
*/
import org.testng.annotations.Test;
import org.junit.jupiter.api.Test;
import tools.javac.combo.CompilationTestCase;
import static org.testng.Assert.assertEquals;
@Test
public class LocalStaticDeclarations2 extends CompilationTestCase {
public void testLocalStatic() {
class LocalStaticDeclarations2 extends CompilationTestCase {
@Test
void testLocalStatic() {
assertOK(
"""
class Test {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -39,8 +39,8 @@
* java.base/jdk.internal.classfile.components
* java.base/jdk.internal.classfile.impl
* @build JavacTestingAbstractProcessor
* @run testng/othervm -DuseAP=false RecordCompilationTests
* @run testng/othervm -DuseAP=true RecordCompilationTests
* @run junit/othervm -DuseAP=false RecordCompilationTests
* @run junit/othervm -DuseAP=true RecordCompilationTests
*/
import java.io.File;
@ -81,11 +81,10 @@ import com.sun.tools.javac.code.Symbol;
import com.sun.tools.javac.code.Symbol.VarSymbol;
import com.sun.tools.javac.util.JCDiagnostic;
import org.testng.annotations.Test;
import tools.javac.combo.CompilationTestCase;
import org.junit.jupiter.api.Test;
import static java.lang.annotation.ElementType.*;
import static org.testng.Assert.assertEquals;
/** Records are the first feature which sports automatic injection of (declarative and type) annotations : from a
* given record component to one or more record members, if applicable.
@ -99,8 +98,7 @@ import static org.testng.Assert.assertEquals;
* method: testAnnos()
*/
@Test
public class RecordCompilationTests extends CompilationTestCase {
class RecordCompilationTests extends CompilationTestCase {
private static String[] OPTIONS_WITH_AP = {"-processor", SimplestAP.class.getName()};
private static final List<String> BAD_COMPONENT_NAMES = List.of(
@ -128,7 +126,8 @@ public class RecordCompilationTests extends CompilationTestCase {
System.out.println(useAP ? "running all tests using an annotation processor" : "running all tests without annotation processor");
}
public void testMalformedDeclarations() {
@Test
void testMalformedDeclarations() {
assertFail("compiler.err.premature.eof", "record R()");
assertFail("compiler.err.expected", "record R();");
assertFail("compiler.err.illegal.start.of.type", "record R(,) { }");
@ -150,7 +149,8 @@ public class RecordCompilationTests extends CompilationTestCase {
assertFail("compiler.err.instance.initializer.not.allowed.in.records", "record R(int i) { {} }");
}
public void testGoodDeclarations() {
@Test
void testGoodDeclarations() {
assertOK("public record R() { }");
assertOK("record R() { }");
assertOK("record R() implements java.io.Serializable, Runnable { public void run() { } }");
@ -180,7 +180,8 @@ public class RecordCompilationTests extends CompilationTestCase {
""");
}
public void testGoodMemberDeclarations() {
@Test
void testGoodMemberDeclarations() {
String template = "public record R(int x) {\n"
+ " public R(int x) { this.x = x; }\n"
+ " public int x() { return x; }\n"
@ -191,12 +192,14 @@ public class RecordCompilationTests extends CompilationTestCase {
assertOK(template);
}
public void testBadComponentNames() {
@Test
void testBadComponentNames() {
for (String s : BAD_COMPONENT_NAMES)
assertFail("compiler.err.illegal.record.component.name", "record R(int #) { } ", s);
}
public void testRestrictedIdentifiers() {
@Test
void testRestrictedIdentifiers() {
for (String s : List.of("interface record { void m(); }",
"@interface record { }",
"class record { }",
@ -215,7 +218,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testValidMembers() {
@Test
void testValidMembers() {
for (String s : List.of("record X(int j) { }",
"interface I { }",
"static { }",
@ -226,12 +230,14 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testCyclic() {
@Test
void testCyclic() {
// Cyclic records are OK, but cyclic inline records would not be
assertOK("record R(R r) { }");
}
public void testBadExtends() {
@Test
void testBadExtends() {
assertFail("compiler.err.expected", "record R(int x) extends Object { }");
assertFail("compiler.err.expected", "record R(int x) {}\n"
+ "record R2(int x) extends R { }");
@ -239,7 +245,8 @@ public class RecordCompilationTests extends CompilationTestCase {
+ "class C extends R { }");
}
public void testNoExtendRecord() {
@Test
void testNoExtendRecord() {
assertFail("compiler.err.invalid.supertype.record",
"""
class R extends Record {
@ -251,7 +258,8 @@ public class RecordCompilationTests extends CompilationTestCase {
);
}
public void testFieldDeclarations() {
@Test
void testFieldDeclarations() {
// static fields are OK
assertOK("public record R(int x) {\n" +
" static int I = 1;\n" +
@ -279,7 +287,8 @@ public class RecordCompilationTests extends CompilationTestCase {
"}");
}
public void testAccessorRedeclaration() {
@Test
void testAccessorRedeclaration() {
assertOK("public record R(int x) {\n" +
" public int x() { return x; };" +
"}");
@ -335,7 +344,8 @@ public class RecordCompilationTests extends CompilationTestCase {
"}");
}
public void testConstructorRedeclaration() {
@Test
void testConstructorRedeclaration() {
for (String goodCtor : List.of(
"public R(int x) { this(x, 0); }",
"public R(int x, int y) { this.x = x; this.y = y; }",
@ -426,7 +436,8 @@ public class RecordCompilationTests extends CompilationTestCase {
"public R(int a) { super(); this.a = a; }");
}
public void testAnnotationCriteria() {
@Test
void testAnnotationCriteria() {
String imports = "import java.lang.annotation.*;\n";
String template = "@Target({ # }) @interface A {}\n";
EnumMap<ElementType, String> annotations = new EnumMap<>(ElementType.class);
@ -435,7 +446,7 @@ public class RecordCompilationTests extends CompilationTestCase {
EnumSet<ElementType> goodSet = EnumSet.of(RECORD_COMPONENT, FIELD, METHOD, PARAMETER, TYPE_USE);
EnumSet<ElementType> badSet = EnumSet.of(CONSTRUCTOR, PACKAGE, TYPE, LOCAL_VARIABLE, ANNOTATION_TYPE, TYPE_PARAMETER, MODULE);
assertEquals(goodSet.size() + badSet.size(), values().length);
Assert.check(goodSet.size() + badSet.size() == values().length);
String A_GOOD = template.replace("#",
goodSet.stream().map(ElementType::name).map(s -> "ElementType." + s).collect(Collectors.joining(",")));
String A_BAD = template.replace("#",
@ -459,7 +470,8 @@ public class RecordCompilationTests extends CompilationTestCase {
// TODO: OK to redeclare with or without same annos
}
public void testNestedRecords() {
@Test
void testNestedRecords() {
String template = "class R { \n" +
" # record RR(int a) { }\n" +
"}";
@ -477,7 +489,8 @@ public class RecordCompilationTests extends CompilationTestCase {
assertOK("record R(int x) { # }", s);
}
public void testDuplicatedMember() {
@Test
void testDuplicatedMember() {
String template
= " record R(int i) {\n" +
" public int i() { return i; }\n" +
@ -486,7 +499,8 @@ public class RecordCompilationTests extends CompilationTestCase {
assertFail("compiler.err.already.defined", template);
}
public void testStaticLocals() {
@Test
void testStaticLocals() {
// static locals can't capture local variables, instance fields or type variables
for (String s : List.of(
"record RR(int x) { public int x() { return y; }};",
@ -576,7 +590,8 @@ public class RecordCompilationTests extends CompilationTestCase {
assertOK("class R { void m() { final record RR(int x) { }; } }");
}
public void testStaticDefinitionsInInnerClasses() {
@Test
void testStaticDefinitionsInInnerClasses() {
// static defs in inner classes can't capture instance fields or type variables
for (String s : List.of(
"""
@ -1042,7 +1057,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testReturnInCanonical_Compact() {
@Test
void testReturnInCanonical_Compact() {
assertFail("compiler.err.invalid.canonical.constructor.in.record", "record R(int x) { # }",
"public R { return; }");
assertFail("compiler.err.invalid.canonical.constructor.in.record", "record R(int x) { # }",
@ -1051,7 +1067,8 @@ public class RecordCompilationTests extends CompilationTestCase {
assertOK("record R(int x) { public R { Runnable r = () -> { return; };} }");
}
public void testArgumentsAreNotFinalInCompact() {
@Test
void testArgumentsAreNotFinalInCompact() {
assertOK(
"""
record R(int x) {
@ -1062,14 +1079,16 @@ public class RecordCompilationTests extends CompilationTestCase {
""");
}
public void testNoNativeMethods() {
@Test
void testNoNativeMethods() {
assertFail("compiler.err.mod.not.allowed.here", "record R(int x) { # }",
"public native R {}");
assertFail("compiler.err.mod.not.allowed.here", "record R(int x) { # }",
"public native void m();");
}
public void testRecordsInsideInner() {
@Test
void testRecordsInsideInner() {
assertOK(
"""
class Outer {
@ -1110,7 +1129,8 @@ public class RecordCompilationTests extends CompilationTestCase {
""");
}
public void testAnnoInsideLocalOrAnonymous() {
@Test
void testAnnoInsideLocalOrAnonymous() {
assertFail("compiler.err.annotation.decl.not.allowed.here",
"""
class Outer {
@ -1214,7 +1234,8 @@ public class RecordCompilationTests extends CompilationTestCase {
""");
}
public void testReceiverParameter() {
@Test
void testReceiverParameter() {
assertFail("compiler.err.receiver.parameter.not.applicable.constructor.toplevel.class",
"""
record R(int i) {
@ -1242,7 +1263,8 @@ public class RecordCompilationTests extends CompilationTestCase {
""");
}
public void testOnlyOneFieldRef() throws Exception {
@Test
void testOnlyOneFieldRef() throws Exception {
for (String source : List.of(
"record R(int recordComponent) {}",
"""
@ -1292,7 +1314,8 @@ public class RecordCompilationTests extends CompilationTestCase {
// check that fields are initialized in a canonical constructor in the same declaration order as the corresponding
// record component
public void testCheckInitializationOrderInCompactConstructor() throws Exception {
@Test
void testCheckInitializationOrderInCompactConstructor() throws Exception {
FieldInstruction putField1 = null;
FieldInstruction putField2 = null;
File dir = assertOK(true, "record R(int i, String s) { R {} }");
@ -1331,7 +1354,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testAcceptRecordId() {
@Test
void testAcceptRecordId() {
String[] previousOptions = getCompileOptions();
try {
String[] testOptions = {};
@ -1348,7 +1372,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testMultipleAnnosInRecord() throws Exception {
@Test
void testMultipleAnnosInRecord() throws Exception {
String[] previousOptions = getCompileOptions();
try {
@ -1389,7 +1414,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testAnnos() throws Exception {
@Test
void testAnnos() throws Exception {
String[] previousOptions = getCompileOptions();
try {
String srcTemplate =
@ -1532,7 +1558,8 @@ public class RecordCompilationTests extends CompilationTestCase {
// JDK-8292159: TYPE_USE annotations on generic type arguments
// of record components discarded
public void testOnlyTypeAnnotationsOnComponentField() throws Exception {
@Test
void testOnlyTypeAnnotationsOnComponentField() throws Exception {
String code =
"""
import java.lang.annotation.*;
@ -1755,7 +1782,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testMethodsInheritedFromRecordArePublicAndFinal() throws Exception {
@Test
void testMethodsInheritedFromRecordArePublicAndFinal() throws Exception {
int numberOfFieldRefs = 0;
File dir = assertOK(true, "record R() {}");
for (final File fileEntry : Objects.requireNonNull(dir.listFiles())) {
@ -1774,7 +1802,8 @@ public class RecordCompilationTests extends CompilationTestCase {
private static final List<String> ACCESSIBILITY = List.of(
"public", "protected", "", "private");
public void testCanonicalAccessibility() throws Exception {
@Test
void testCanonicalAccessibility() throws Exception {
// accessibility of canonical can't be stronger than that of the record type
for (String a1 : ACCESSIBILITY) {
for (String a2 : ACCESSIBILITY) {
@ -1823,7 +1852,8 @@ public class RecordCompilationTests extends CompilationTestCase {
};
}
public void testSameArity() {
@Test
void testSameArity() {
for (String source : List.of(
"""
record R(int... args) {
@ -1897,7 +1927,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testSafeVararsAnno() {
@Test
void testSafeVararsAnno() {
assertFail("compiler.err.annotation.type.not.applicable",
"""
@SafeVarargs
@ -1959,7 +1990,8 @@ public class RecordCompilationTests extends CompilationTestCase {
);
}
public void testOverrideAtAccessor() {
@Test
void testOverrideAtAccessor() {
assertOK(
"""
record R(int i) {
@ -1997,7 +2029,8 @@ public class RecordCompilationTests extends CompilationTestCase {
);
}
public void testNoAssigmentInsideCompactRecord() {
@Test
void testNoAssigmentInsideCompactRecord() {
assertFail("compiler.err.cant.assign.val.to.var",
"""
record R(int i) {
@ -2018,7 +2051,8 @@ public class RecordCompilationTests extends CompilationTestCase {
);
}
public void testNoNPEStaticAnnotatedFields() {
@Test
void testNoNPEStaticAnnotatedFields() {
assertOK(
"""
import java.lang.annotation.Native;
@ -2051,7 +2085,8 @@ public class RecordCompilationTests extends CompilationTestCase {
);
}
public void testDoNotAllowCStyleArraySyntaxForRecComponents() {
@Test
void testDoNotAllowCStyleArraySyntaxForRecComponents() {
assertFail("compiler.err.record.component.and.old.array.syntax",
"""
record R(int i[]) {}
@ -2069,7 +2104,8 @@ public class RecordCompilationTests extends CompilationTestCase {
);
}
public void testNoWarningForSerializableRecords() {
@Test
void testNoWarningForSerializableRecords() {
if (!useAP) {
// don't execute this test when the default annotation processor is on as it will fail due to
// spurious warnings
@ -2084,7 +2120,8 @@ public class RecordCompilationTests extends CompilationTestCase {
}
}
public void testAnnotationsOnVarargsRecComp() {
@Test
void testAnnotationsOnVarargsRecComp() {
assertOK(
"""
import java.lang.annotation.*;
@ -2119,7 +2156,8 @@ public class RecordCompilationTests extends CompilationTestCase {
);
}
public void testSaveVarargsAnno() {
@Test
void testSaveVarargsAnno() {
// the compiler would generate an erronous accessor
assertFail("compiler.err.varargs.invalid.trustme.anno",
"""

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2019, 2023, Oracle and/or its affiliates. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
@ -33,20 +33,14 @@
* jdk.compiler/com.sun.tools.javac.api
* jdk.compiler/com.sun.tools.javac.main
* @build toolbox.ToolBox toolbox.JavacTask
* @run testng/othervm -DuseAP=false SealedCompilationTests
* @run testng/othervm -DuseAP=true SealedCompilationTests
* @run junit/othervm -DuseAP=false SealedCompilationTests
* @run junit/othervm -DuseAP=true SealedCompilationTests
*/
import java.lang.constant.ClassDesc;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
@ -54,16 +48,12 @@ import java.util.stream.Collectors;
import javax.annotation.processing.AbstractProcessor;
import javax.annotation.processing.RoundEnvironment;
import javax.annotation.processing.SupportedAnnotationTypes;
import javax.lang.model.element.TypeElement;
import javax.lang.model.SourceVersion;
import com.sun.tools.javac.util.Assert;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertTrue;
import static org.testng.Assert.fail;
import org.testng.annotations.Test;
import org.junit.jupiter.api.Test;
import tools.javac.combo.CompilationTestCase;
import toolbox.ToolBox;
@ -71,8 +61,9 @@ import toolbox.JavacTask;
import toolbox.Task;
import toolbox.Task.OutputKind;
@Test
public class SealedCompilationTests extends CompilationTestCase {
import static org.junit.jupiter.api.Assertions.fail;
class SealedCompilationTests extends CompilationTestCase {
ToolBox tb = new ToolBox();
@ -94,7 +85,7 @@ public class SealedCompilationTests extends CompilationTestCase {
}
public SealedCompilationTests() {
SealedCompilationTests() {
boolean useAP = System.getProperty("useAP") == null ? false : System.getProperty("useAP").equals("true");
setDefaultFilename("SealedTest.java");
setCompileOptions(useAP ? OPTIONS_WITH_AP : new String[]{});
@ -116,7 +107,8 @@ public class SealedCompilationTests extends CompilationTestCase {
""";
private static final List<String> SHELLS = List.of(NO_SHELL, NEST_SHELL, AUX_SHELL);
public void testSimpleExtension() {
@Test
void testSimpleExtension() {
String CC1 =
"""
sealed class Sup # { }
@ -194,7 +186,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertFail("compiler.err.non.sealed.sealed.or.final.expected", shell, expandMarkers(b, p, m));
}
public void testSealedAndRecords() {
@Test
void testSealedAndRecords() {
String P =
"""
sealed interface Sup # { }
@ -210,7 +203,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
// Test that a type that explicitly permits one type, can't be extended by another
public void testBadExtension() {
@Test
void testBadExtension() {
String CC2 =
"""
sealed class Sup permits Sub1 { }
@ -241,7 +235,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertFail("compiler.err.cant.inherit.from.sealed", shell, b);
}
public void testRestrictedKeyword() {
@Test
void testRestrictedKeyword() {
for (String s : List.of(
"class SealedTest { String sealed; }",
"class SealedTest { int sealed = 0; int non = 0; int ns = non-sealed; }",
@ -289,7 +284,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testRejectPermitsInNonSealedClass() {
@Test
void testRejectPermitsInNonSealedClass() {
assertFail("compiler.err.invalid.permits.clause",
"class SealedTest {\n" +
" class NotSealed permits Sub {}\n" +
@ -302,7 +298,8 @@ public class SealedCompilationTests extends CompilationTestCase {
"}");
}
public void testTypeInPermitsIsSameClassOrSuper() {
@Test
void testTypeInPermitsIsSameClassOrSuper() {
assertFail("compiler.err.invalid.permits.clause",
"""
sealed class Sealed permits Sealed {}
@ -326,7 +323,8 @@ public class SealedCompilationTests extends CompilationTestCase {
/* It is a compile-time error if a class declaration has more than one of the class modifiers
* sealed, non-sealed and final
*/
public void testBadModifiers() {
@Test
void testBadModifiers() {
assertFail("compiler.err.non.sealed.with.no.sealed.supertype",
"class SealedTest { non-sealed class NoSealedSuper {} }");
assertFail("compiler.err.mod.not.allowed.here",
@ -344,7 +342,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertFail("compiler.err.illegal.combination.of.modifiers", s);
}
public void testAnonymous_FunctionalExpr_and_Sealed() {
@Test
void testAnonymous_FunctionalExpr_and_Sealed() {
for (String s : List.of(
"""
sealed interface I extends Runnable {
@ -403,7 +402,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertFail("compiler.err.local.classes.cant.extend.sealed", s);
}
public void testNoLocalSealedClasses() {
@Test
void testNoLocalSealedClasses() {
for (String s : List.of(
"""
sealed class C {
@ -422,7 +422,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertFail("compiler.err.sealed.or.non.sealed.local.classes.not.allowed", s);
}
public void testLocalCantExtendSealed() {
@Test
void testLocalCantExtendSealed() {
for (String s : List.of(
"""
sealed class C {
@ -454,7 +455,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertFail("compiler.err.local.classes.cant.extend.sealed", s);
}
public void testSealedInterfaceAndAbstracClasses() {
@Test
void testSealedInterfaceAndAbstracClasses() {
for (String s : List.of(
"""
sealed interface I {}
@ -496,7 +498,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertOK(s);
}
public void testEnumsCantBeSealedOrNonSealed() {
@Test
void testEnumsCantBeSealedOrNonSealed() {
for (String s : List.of(
"""
sealed interface I {}
@ -511,7 +514,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertFail("compiler.err.mod.not.allowed.here", s);
}
public void testEnumsCanImplementSealedInterfaces() {
@Test
void testEnumsCanImplementSealedInterfaces() {
for (String s : List.of(
"""
sealed interface I {}
@ -521,7 +525,8 @@ public class SealedCompilationTests extends CompilationTestCase {
assertOK(s);
}
public void testClassesCanExtendNonSealed() {
@Test
void testClassesCanExtendNonSealed() {
for (String s : List.of(
"""
sealed class C {}
@ -534,7 +539,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testEmptyPermits() {
@Test
void testEmptyPermits() {
for (String s : List.of(
"""
sealed class C permits {}
@ -544,7 +550,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testTypeVarInPermits() {
@Test
void testTypeVarInPermits() {
for (String s : List.of(
"""
class Outer<T> {
@ -555,7 +562,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testRepeatedTypeInPermits() {
@Test
void testRepeatedTypeInPermits() {
for (String s : List.of(
"""
sealed class C permits Sub, Sub {}
@ -566,7 +574,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testSubtypeDoesntExtendSealed() {
@Test
void testSubtypeDoesntExtendSealed() {
for (String s : List.of(
"""
sealed class C permits Sub {}
@ -590,7 +599,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testAPIForPrimitiveAndArrayClasses() {
@Test
void testAPIForPrimitiveAndArrayClasses() {
for (Class<?> c : new Class[]{byte.class, byte[].class, short.class, short[].class, int.class, int[].class, long.class, long[].class,
float.class, float[].class, double.class, double[].class, char.class, char[].class, boolean.class, boolean[].class, void.class,
String[].class}) {
@ -599,7 +609,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testPrinting() throws Exception {
@Test
void testPrinting() throws Exception {
Path base = Paths.get("testPrinting");
Path src = base.resolve("src");
Path test = src.resolve("Test");
@ -715,7 +726,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testNonSealedErroneousSuper() {
@Test
void testNonSealedErroneousSuper() {
assertFail("compiler.err.cant.resolve",
d -> {
if (diags.keys().size() != 1) {
@ -727,7 +739,8 @@ public class SealedCompilationTests extends CompilationTestCase {
""");
}
public void testNonSealedErroneousSuperInterface() {
@Test
void testNonSealedErroneousSuperInterface() {
assertFail("compiler.err.cant.resolve",
d -> {
if (diags.keys().size() != 1) {
@ -739,7 +752,8 @@ public class SealedCompilationTests extends CompilationTestCase {
""");
}
public void testIllFormedNonSealed() {
@Test
void testIllFormedNonSealed() {
for (String s : List.of(
"""
sealed class C permits Sub {}
@ -767,7 +781,8 @@ public class SealedCompilationTests extends CompilationTestCase {
"byte[]", "short[]", "int[]", "long[]", "float[]", "double[]", "char[]", "boolean[]"
};
public void testPermitsClause() {
@Test
void testPermitsClause() {
for (String s : List.of(
// can't include a parameterized type
"""
@ -829,7 +844,8 @@ public class SealedCompilationTests extends CompilationTestCase {
return tb.findJavaFiles(paths);
}
public void testSealedNonSealedWithOtherModifiers() {
@Test
void testSealedNonSealedWithOtherModifiers() {
String template1 =
"""
@interface A {}
@ -872,7 +888,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testSubClassBeforeSealedClassInSameCU() {
@Test
void testSubClassBeforeSealedClassInSameCU() {
for (String s : List.of(
"""
final class Sub extends Sealed {}
@ -951,7 +968,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testDoNotAllowSealedAnnotation() {
@Test
void testDoNotAllowSealedAnnotation() {
for (String s : List.of(
"""
sealed @interface A {}
@ -962,7 +980,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testNarrowConversion() {
@Test
void testNarrowConversion() {
for (String s : List.of(
"""
interface I {}
@ -1264,7 +1283,8 @@ public class SealedCompilationTests extends CompilationTestCase {
}
}
public void testIntersectionWithSealedClasses() {
@Test
void testIntersectionWithSealedClasses() {
assertOK(
"""
class A { }