diff options
Diffstat (limited to 'javatests')
17 files changed, 280 insertions, 49 deletions
diff --git a/javatests/com/google/turbine/binder/BinderErrorTest.java b/javatests/com/google/turbine/binder/BinderErrorTest.java index 6766470..a1bea05 100644 --- a/javatests/com/google/turbine/binder/BinderErrorTest.java +++ b/javatests/com/google/turbine/binder/BinderErrorTest.java @@ -681,7 +681,9 @@ public class BinderErrorTest { "class T extends T {}", }, { - "<>:1: error: cycle in class hierarchy: T", "class T extends T {}", " ^", + "<>:1: error: cycle in class hierarchy: T", // + "class T extends T {}", + " ^", }, }, { @@ -692,6 +694,19 @@ public class BinderErrorTest { "<>:1: error: cycle in class hierarchy: T", "class T implements T {}", " ^", + "<>:1: error: expected interface type", + "class T implements T {}", + " ^", + }, + }, + { + { + "interface T extends T {}", + }, + { + "<>:1: error: cycle in class hierarchy: T", + "interface T extends T {}", + " ^", }, }, { @@ -768,7 +783,7 @@ public class BinderErrorTest { "@interface Test {}", }, { - "<>:3: error: missing required annotation argument: value", + "<>:3: error: missing required annotation argument: value", // "@Retention", "^", }, @@ -958,6 +973,40 @@ public class BinderErrorTest { " ^", }, }, + { + { + "class C {}", // + "interface I {}", + "class A extends I implements C {}", + "interface B extends C {}", + }, + { + "<>:3: error: unexpected interface type", + "class A extends I implements C {}", + " ^", + "<>:3: error: expected interface type", + "class A extends I implements C {}", + " ^", + "<>:4: error: expected interface type", + "interface B extends C {}", + " ^", + }, + }, + { + { + "class T<X, X> {", // + " <Y, Y> void f() {}", + "}", + }, + { + "<>:1: error: duplicate declaration of X", + "class T<X, X> {", + " ^", + "<>:2: error: duplicate declaration of Y", + " <Y, Y> void f() {}", + " ^", + }, + }, }; return Arrays.asList((Object[][]) testCases); } diff --git a/javatests/com/google/turbine/binder/BinderTest.java b/javatests/com/google/turbine/binder/BinderTest.java index 40387ac..52b769b 100644 --- a/javatests/com/google/turbine/binder/BinderTest.java +++ b/javatests/com/google/turbine/binder/BinderTest.java @@ -265,7 +265,7 @@ public class BinderTest { parseLines( "import java.lang.annotation.Target;", "import java.lang.annotation.ElementType;", - "public class C implements B {", + "public class C extends B {", " @Target(ElementType.TYPE_USE)", " @interface A {};", "}")); diff --git a/javatests/com/google/turbine/bytecode/ClassReaderTest.java b/javatests/com/google/turbine/bytecode/ClassReaderTest.java index ad5b90d..d7abea5 100644 --- a/javatests/com/google/turbine/bytecode/ClassReaderTest.java +++ b/javatests/com/google/turbine/bytecode/ClassReaderTest.java @@ -40,6 +40,7 @@ import org.objectweb.asm.ByteVector; import org.objectweb.asm.ClassWriter; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.Handle; +import org.objectweb.asm.MethodVisitor; import org.objectweb.asm.ModuleVisitor; import org.objectweb.asm.Opcodes; @@ -57,12 +58,16 @@ public class ClassReaderTest { null, "java/lang/Object", null); - cw.visitMethod( - Opcodes.ACC_PUBLIC, - "f", - "(Ljava/lang/String;)Ljava/lang/String;", - "<T:Ljava/lang/String;>(TT;)TT;", - null); + MethodVisitor mv = + cw.visitMethod( + Opcodes.ACC_PUBLIC, + "f", + "(Ljava/lang/String;)Ljava/lang/String;", + "<T:Ljava/lang/String;>(TT;)TT;", + null); + mv.visitParameter(null, 0); // skip synthetic parameters + mv.visitParameter("<no name>", Opcodes.ACC_SYNTHETIC); // skip synthetic parameters + mv.visitParameter("parameterName", 42); cw.visitMethod( Opcodes.ACC_PUBLIC | Opcodes.ACC_STATIC, "g", @@ -92,6 +97,9 @@ public class ClassReaderTest { assertThat(f.annotations()).isEmpty(); assertThat(f.parameterAnnotations()).isEmpty(); assertThat(f.defaultValue()).isNull(); + assertThat(f.parameters()).hasSize(1); + assertThat(f.parameters().get(0).name()).isEqualTo("parameterName"); + assertThat(f.parameters().get(0).access()).isEqualTo(42); ClassFile.MethodInfo g = classFile.methods().get(1); assertThat(g.access()).isEqualTo(TurbineFlag.ACC_PUBLIC | TurbineFlag.ACC_STATIC); diff --git a/javatests/com/google/turbine/bytecode/sig/SigIntegrationTest.java b/javatests/com/google/turbine/bytecode/sig/SigIntegrationTest.java index 8602fe5..58c0eff 100644 --- a/javatests/com/google/turbine/bytecode/sig/SigIntegrationTest.java +++ b/javatests/com/google/turbine/bytecode/sig/SigIntegrationTest.java @@ -23,6 +23,7 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.base.Splitter; import com.google.common.collect.ImmutableList; import com.google.common.collect.Streams; +import org.objectweb.asm.Opcodes; import java.io.File; import java.io.IOException; import java.io.UncheckedIOException; @@ -44,7 +45,6 @@ import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; import org.objectweb.asm.MethodVisitor; -import org.objectweb.asm.Opcodes; /** * Reads all field, class, and method signatures in the bootclasspath, and round-trips them through diff --git a/javatests/com/google/turbine/deps/DependenciesTest.java b/javatests/com/google/turbine/deps/DependenciesTest.java index ba905db..2164a9f 100644 --- a/javatests/com/google/turbine/deps/DependenciesTest.java +++ b/javatests/com/google/turbine/deps/DependenciesTest.java @@ -29,7 +29,6 @@ import com.google.turbine.diag.SourceFile; import com.google.turbine.lower.IntegrationTestSupport; import com.google.turbine.lower.Lower; import com.google.turbine.lower.Lower.Lowered; -import com.google.turbine.options.LanguageVersion; import com.google.turbine.parse.Parser; import com.google.turbine.proto.DepsProto; import com.google.turbine.testing.TestClassPaths; @@ -105,11 +104,11 @@ public class DependenciesTest { units.build(), ClassPathBinder.bindClasspath(classpath), TestClassPaths.TURBINE_BOOTCLASSPATH, - /* moduleVersion=*/ Optional.empty()); + /* moduleVersion= */ Optional.empty()); Lowered lowered = Lower.lowerAll( - LanguageVersion.createDefault(), + Lower.LowerOptions.createDefault(), bound.units(), bound.modules(), bound.classPathEnv()); diff --git a/javatests/com/google/turbine/lower/IntegrationTestSupport.java b/javatests/com/google/turbine/lower/IntegrationTestSupport.java index f20962b..6527a03 100644 --- a/javatests/com/google/turbine/lower/IntegrationTestSupport.java +++ b/javatests/com/google/turbine/lower/IntegrationTestSupport.java @@ -33,6 +33,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.io.MoreFiles; import com.google.common.jimfs.Configuration; import com.google.common.jimfs.Jimfs; +import org.objectweb.asm.Opcodes; import com.google.turbine.binder.Binder; import com.google.turbine.binder.Binder.BindingResult; import com.google.turbine.binder.ClassPath; @@ -496,7 +497,9 @@ public final class IntegrationTestSupport { throws IOException { BindingResult bound = turbineAnalysis(input, classpath, bootClassPath, moduleVersion); return Lower.lowerAll( - LanguageVersion.fromJavacopts(javacopts), + Lower.LowerOptions.builder() + .languageVersion(LanguageVersion.fromJavacopts(javacopts)) + .build(), bound.units(), bound.modules(), bound.classPathEnv()) diff --git a/javatests/com/google/turbine/lower/LongStringIntegrationTest.java b/javatests/com/google/turbine/lower/LongStringIntegrationTest.java index 7bb61e5..33deaee 100644 --- a/javatests/com/google/turbine/lower/LongStringIntegrationTest.java +++ b/javatests/com/google/turbine/lower/LongStringIntegrationTest.java @@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.objectweb.asm.Opcodes; import java.io.IOException; import java.io.UncheckedIOException; import java.nio.file.Path; @@ -33,7 +34,6 @@ import org.junit.runners.JUnit4; import org.objectweb.asm.ClassReader; import org.objectweb.asm.ClassVisitor; import org.objectweb.asm.FieldVisitor; -import org.objectweb.asm.Opcodes; @RunWith(JUnit4.class) public class LongStringIntegrationTest { diff --git a/javatests/com/google/turbine/lower/LowerIntegrationTest.java b/javatests/com/google/turbine/lower/LowerIntegrationTest.java index 94f1d07..6c95d44 100644 --- a/javatests/com/google/turbine/lower/LowerIntegrationTest.java +++ b/javatests/com/google/turbine/lower/LowerIntegrationTest.java @@ -23,6 +23,7 @@ import static org.junit.Assume.assumeTrue; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Lists; import java.io.IOError; import java.io.IOException; @@ -47,6 +48,8 @@ public class LowerIntegrationTest { ImmutableMap.of( "record.test", 16, // "record2.test", 16, + "record_tostring.test", 16, + "record_ctor.test", 16, "sealed.test", 17, "sealed_nested.test", 17, "textblock.test", 15); @@ -269,9 +272,12 @@ public class LowerIntegrationTest { "receiver_param.test", "record.test", "record2.test", + "record_ctor.test", + "record_tostring.test", "rek.test", "samepkg.test", "sealed.test", + "sealed_nested.test", "self.test", "semi.test", // https://bugs.openjdk.java.net/browse/JDK-8054064 ? @@ -333,8 +339,9 @@ public class LowerIntegrationTest { "wildcanon.test", // keep-sorted end }; - List<Object[]> tests = - ImmutableList.copyOf(testCases).stream().map(x -> new Object[] {x}).collect(toList()); + ImmutableSet<String> cases = ImmutableSet.copyOf(testCases); + assertThat(cases).containsAtLeastElementsIn(SOURCE_VERSION.keySet()); + List<Object[]> tests = cases.stream().map(x -> new Object[] {x}).collect(toList()); String testShardIndex = System.getenv("TEST_SHARD_INDEX"); String testTotalShards = System.getenv("TEST_TOTAL_SHARDS"); if (testShardIndex == null || testTotalShards == null) { @@ -384,7 +391,12 @@ public class LowerIntegrationTest { int version = SOURCE_VERSION.getOrDefault(test, 8); assumeTrue(version <= Runtime.version().feature()); ImmutableList<String> javacopts = - ImmutableList.of("-source", String.valueOf(version), "-target", String.valueOf(version)); + ImmutableList.of( + "-source", + String.valueOf(version), + "-target", + String.valueOf(version), + "-Xpkginfo:always"); Map<String, byte[]> expected = IntegrationTestSupport.runJavac(input.sources, classpathJar, javacopts); diff --git a/javatests/com/google/turbine/lower/LowerTest.java b/javatests/com/google/turbine/lower/LowerTest.java index a6410db..2de4650 100644 --- a/javatests/com/google/turbine/lower/LowerTest.java +++ b/javatests/com/google/turbine/lower/LowerTest.java @@ -25,6 +25,7 @@ import static org.junit.Assert.assertThrows; import com.google.common.base.Joiner; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import org.objectweb.asm.Opcodes; import com.google.turbine.binder.Binder; import com.google.turbine.binder.Binder.BindingResult; import com.google.turbine.binder.ClassPathBinder; @@ -232,7 +233,7 @@ public class LowerTest { Map<String, byte[]> bytes = Lower.lowerAll( - LanguageVersion.createDefault(), + Lower.LowerOptions.createDefault(), ImmutableMap.of( new ClassSymbol("test/Test"), c, new ClassSymbol("test/Test$Inner"), i), ImmutableList.of(), @@ -260,10 +261,10 @@ public class LowerTest { "}"))), ClassPathBinder.bindClasspath(ImmutableList.of()), TURBINE_BOOTCLASSPATH, - /* moduleVersion=*/ Optional.empty()); + /* moduleVersion= */ Optional.empty()); Map<String, byte[]> lowered = Lower.lowerAll( - LanguageVersion.createDefault(), + Lower.LowerOptions.createDefault(), bound.units(), bound.modules(), bound.classPathEnv()) @@ -340,10 +341,10 @@ public class LowerTest { "}"))), ClassPathBinder.bindClasspath(ImmutableList.of()), TURBINE_BOOTCLASSPATH, - /* moduleVersion=*/ Optional.empty()); + /* moduleVersion= */ Optional.empty()); Map<String, byte[]> lowered = Lower.lowerAll( - LanguageVersion.createDefault(), + Lower.LowerOptions.createDefault(), bound.units(), bound.modules(), bound.classPathEnv()) @@ -423,10 +424,10 @@ public class LowerTest { ImmutableList.of(Parser.parse("@Deprecated class Test {}")), ClassPathBinder.bindClasspath(ImmutableList.of()), TURBINE_BOOTCLASSPATH, - /* moduleVersion=*/ Optional.empty()); + /* moduleVersion= */ Optional.empty()); Map<String, byte[]> lowered = Lower.lowerAll( - LanguageVersion.createDefault(), + Lower.LowerOptions.createDefault(), bound.units(), bound.modules(), bound.classPathEnv()) @@ -544,7 +545,7 @@ public class LowerTest { .put( "Test.java", lines( - "public class Test extends B.BM {", // + "public class Test implements B.BM {", // " I i;", "}")) .build(); @@ -649,10 +650,14 @@ public class LowerTest { ImmutableList.of(Parser.parse("class Test {}")), ClassPathBinder.bindClasspath(ImmutableList.of()), TURBINE_BOOTCLASSPATH, - /* moduleVersion=*/ Optional.empty()); + /* moduleVersion= */ Optional.empty()); Map<String, byte[]> lowered = Lower.lowerAll( - LanguageVersion.fromJavacopts(ImmutableList.of("-source", "7", "-target", "7")), + Lower.LowerOptions.builder() + .languageVersion( + LanguageVersion.fromJavacopts( + ImmutableList.of("-source", "7", "-target", "7"))) + .build(), bound.units(), bound.modules(), bound.classPathEnv()) @@ -676,6 +681,76 @@ public class LowerTest { assertThat(major[0]).isEqualTo(Opcodes.V1_8); } + @Test + public void privateFields() throws Exception { + BindingResult bound = + Binder.bind( + ImmutableList.of( + Parser.parse( + "class Test {\n" // + + " private int x;\n" + + " int y;\n" + + "}")), + ClassPathBinder.bindClasspath(ImmutableList.of()), + TURBINE_BOOTCLASSPATH, + /* moduleVersion= */ Optional.empty()); + ImmutableMap<String, byte[]> lowered = + Lower.lowerAll( + Lower.LowerOptions.builder().emitPrivateFields(true).build(), + bound.units(), + bound.modules(), + bound.classPathEnv()) + .bytes(); + List<String> fields = new ArrayList<>(); + new ClassReader(lowered.get("Test")) + .accept( + new ClassVisitor(Opcodes.ASM9) { + @Override + public FieldVisitor visitField( + int access, String name, String descriptor, String signature, Object value) { + fields.add(name); + return null; + } + }, + 0); + assertThat(fields).containsExactly("x", "y"); + } + + @Test + public void noPrivateFields() throws Exception { + BindingResult bound = + Binder.bind( + ImmutableList.of( + Parser.parse( + "class Test {\n" // + + " private int x;\n" + + " int y;\n" + + "}")), + ClassPathBinder.bindClasspath(ImmutableList.of()), + TURBINE_BOOTCLASSPATH, + /* moduleVersion= */ Optional.empty()); + ImmutableMap<String, byte[]> lowered = + Lower.lowerAll( + Lower.LowerOptions.createDefault(), + bound.units(), + bound.modules(), + bound.classPathEnv()) + .bytes(); + List<String> fields = new ArrayList<>(); + new ClassReader(lowered.get("Test")) + .accept( + new ClassVisitor(Opcodes.ASM9) { + @Override + public FieldVisitor visitField( + int access, String name, String descriptor, String signature, Object value) { + fields.add(name); + return null; + } + }, + 0); + assertThat(fields).containsExactly("y"); + } + static String lines(String... lines) { return Joiner.on(System.lineSeparator()).join(lines); } diff --git a/javatests/com/google/turbine/lower/testdata/package_info.test b/javatests/com/google/turbine/lower/testdata/package_info.test index a2416a4..6b0fc32 100644 --- a/javatests/com/google/turbine/lower/testdata/package_info.test +++ b/javatests/com/google/turbine/lower/testdata/package_info.test @@ -10,3 +10,5 @@ package p; package p; class Test {} +=== Empty.java === +package p;
\ No newline at end of file diff --git a/javatests/com/google/turbine/lower/testdata/record_ctor.test b/javatests/com/google/turbine/lower/testdata/record_ctor.test new file mode 100644 index 0000000..a3adc15 --- /dev/null +++ b/javatests/com/google/turbine/lower/testdata/record_ctor.test @@ -0,0 +1,52 @@ +=== Records.java === +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; + +public class Records { + public record A(String value) { + + void one() {} + + public A(String a, String b) { + this(a + ", " + b); + } + + void two() {} + } + + @Target(ElementType.TYPE_USE) + @interface N {} + + public record B(String value) { + + void one() {} + + public B(@N String value) { + this.value = value; + } + + void two() {} + + public B(String a, String b) { + this(a + ", " + b); + } + + void three() {} + } + + class Inner {} + + public record C(Records.Inner value) { + + public C(Records. @N Inner value) { + this.value = value; + } + } + + public record D<T>(T value) { + + public D(T value) { + this.value = value; + } + } +} diff --git a/javatests/com/google/turbine/lower/testdata/record_tostring.test b/javatests/com/google/turbine/lower/testdata/record_tostring.test new file mode 100644 index 0000000..f93187a --- /dev/null +++ b/javatests/com/google/turbine/lower/testdata/record_tostring.test @@ -0,0 +1,35 @@ +=== Records.java === + +import java.lang.annotation.ElementType; +import java.lang.annotation.Target; +import java.util.Objects; + +class Records { + public record A() { + @Override + public String toString() { + return "A"; + } + } + + public record B() { + @Override + public final String toString() { + return "B"; + } + } + + public record C() { + @Override + public final boolean equals(Object o) { + return false; + } + } + + public record D() { + @Override + public final int hashCode() { + return -1; + } + } +}
\ No newline at end of file diff --git a/javatests/com/google/turbine/main/MainTest.java b/javatests/com/google/turbine/main/MainTest.java index c894d9d..f65e6c0 100644 --- a/javatests/com/google/turbine/main/MainTest.java +++ b/javatests/com/google/turbine/main/MainTest.java @@ -106,7 +106,7 @@ public class MainTest { @Test public void packageInfo() throws IOException { - Path src = temporaryFolder.newFile("package-info.jar").toPath(); + Path src = temporaryFolder.newFile("package-info.java").toPath(); MoreFiles.asCharSink(src, UTF_8).write("@Deprecated package test;"); Path output = temporaryFolder.newFile("output.jar").toPath(); @@ -467,7 +467,7 @@ public class MainTest { @Test public void classGeneration() throws IOException { - Path src = temporaryFolder.newFile("package-info.jar").toPath(); + Path src = temporaryFolder.newFile("package-info.java").toPath(); MoreFiles.asCharSink(src, UTF_8).write("@Deprecated package test;"); File resources = temporaryFolder.newFile("resources.jar"); Main.compile( diff --git a/javatests/com/google/turbine/parse/LexerTest.java b/javatests/com/google/turbine/parse/LexerTest.java index bf0b374..6a6fe1c 100644 --- a/javatests/com/google/turbine/parse/LexerTest.java +++ b/javatests/com/google/turbine/parse/LexerTest.java @@ -339,6 +339,11 @@ public class LexerTest { lexerComparisonTest("import pkg\uD800\uDC00.test;"); } + @Test + public void javadocUnicodeEscape() { + lexerComparisonTest("class {/***/\\u007D;"); + } + private void lexerComparisonTest(String s) { assertThat(lex(s)).containsExactlyElementsIn(JavacLexer.javacLex(s)); } @@ -349,6 +354,8 @@ public class LexerTest { Token token; do { token = lexer.next(); + // Just check that javadoc handling doesn't crash + String unused = lexer.javadoc(); String tokenString; switch (token) { case IDENT: diff --git a/javatests/com/google/turbine/parse/ParserIntegrationTest.java b/javatests/com/google/turbine/parse/ParserIntegrationTest.java index c758a74..0981815 100644 --- a/javatests/com/google/turbine/parse/ParserIntegrationTest.java +++ b/javatests/com/google/turbine/parse/ParserIntegrationTest.java @@ -20,15 +20,12 @@ import static com.google.common.base.Verify.verifyNotNull; import static com.google.common.truth.Truth.assertThat; import static java.nio.charset.StandardCharsets.UTF_8; -import com.google.common.base.Function; import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; import com.google.common.io.CharStreams; import com.google.turbine.tree.Tree; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.util.Arrays; import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; @@ -39,8 +36,8 @@ import org.junit.runners.Parameterized.Parameters; public class ParserIntegrationTest { @Parameters(name = "{index}: {0}") - public static Iterable<Object[]> parameters() { - String[] tests = { + public static String[] parameters() { + return new String[] { "anno1.input", "anno2.input", "annodecl1.input", @@ -79,14 +76,6 @@ public class ParserIntegrationTest { "record.input", "sealed.input", }; - return Iterables.transform( - Arrays.asList(tests), - new Function<String, Object[]>() { - @Override - public Object[] apply(String input) { - return new Object[] {input}; - } - }); } final String input; diff --git a/javatests/com/google/turbine/processing/TurbineElementsGetAllMembersTest.java b/javatests/com/google/turbine/processing/TurbineElementsGetAllMembersTest.java index 11dedbf..bc6d9e6 100644 --- a/javatests/com/google/turbine/processing/TurbineElementsGetAllMembersTest.java +++ b/javatests/com/google/turbine/processing/TurbineElementsGetAllMembersTest.java @@ -77,17 +77,17 @@ public class TurbineElementsGetAllMembersTest { }, { "=== I.java ===", - "abstract class I {", - " abstract Integer f();", + "interface I {", + " default Integer f() {}", "}", "=== J.java ===", - "interface J extends I {", - " default Integer f() {", + "class J implements I {", + " Integer f() {", " return 42;", " }", "}", "=== Test.java ===", // - "class Test extends I implements J {", + "class Test extends J implements I {", "}", }, { diff --git a/javatests/com/google/turbine/processing/TurbineFilerTest.java b/javatests/com/google/turbine/processing/TurbineFilerTest.java index 96c325b..f76a08d 100644 --- a/javatests/com/google/turbine/processing/TurbineFilerTest.java +++ b/javatests/com/google/turbine/processing/TurbineFilerTest.java @@ -21,7 +21,6 @@ import static com.google.common.truth.Truth.assertThat; import static java.nio.charset.StandardCharsets.UTF_8; import static org.junit.Assert.assertThrows; -import com.google.common.base.Function; import com.google.common.base.Supplier; import com.google.common.io.CharStreams; import com.google.turbine.diag.SourceFile; @@ -34,6 +33,7 @@ import java.util.Collection; import java.util.HashSet; import java.util.Map; import java.util.Set; +import java.util.function.Function; import javax.annotation.processing.FilerException; import javax.lang.model.element.Element; import javax.tools.FileObject; |