diff options
author | Éamonn McManus <emcmanus@google.com> | 2021-04-09 09:25:18 -0700 |
---|---|---|
committer | Google Java Core Libraries <java-libraries-firehose+copybara@google.com> | 2021-04-09 09:25:54 -0700 |
commit | d22cc63a8bf4c7546027ffe1470b179ed9f32b79 (patch) | |
tree | 21f943413154728761c75743d98425a4759aef0b /value/src/test/java/com/google | |
parent | ea0a418bed3a099c989c41f278a6937b1de9f4e2 (diff) | |
download | auto-d22cc63a8bf4c7546027ffe1470b179ed9f32b79.tar.gz |
Add some compilation error tests for AutoBuilder.
These correspond to errors in `AutoBuilderProcessor`. Further tests will check for errors in `BuilderMethodClassifier`.
RELNOTES=n/a
PiperOrigin-RevId: 367646674
Diffstat (limited to 'value/src/test/java/com/google')
-rw-r--r-- | value/src/test/java/com/google/auto/value/processor/AutoBuilderCompilationTest.java | 333 |
1 files changed, 332 insertions, 1 deletions
diff --git a/value/src/test/java/com/google/auto/value/processor/AutoBuilderCompilationTest.java b/value/src/test/java/com/google/auto/value/processor/AutoBuilderCompilationTest.java index 296651c8..831fbb25 100644 --- a/value/src/test/java/com/google/auto/value/processor/AutoBuilderCompilationTest.java +++ b/value/src/test/java/com/google/auto/value/processor/AutoBuilderCompilationTest.java @@ -154,5 +154,336 @@ public final class AutoBuilderCompilationTest { .hasSourceEquivalentTo(EXPECTED_SIMPLE_OUTPUT); } - // TODO(b/183005059): error tests + @Test + public void autoBuilderOnEnum() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "@AutoBuilder", + "public enum Baz {", + " ZIG, ZAG, DUSTIN,", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining( + "[AutoBuilderWrongType] @AutoBuilder only applies to classes and interfaces") + .inFile(javaFileObject) + .onLineContaining("enum Baz"); + } + + @Test + public void autoBuilderPrivate() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " @AutoBuilder", + " private interface Builder {", + " Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining("[AutoBuilderPrivate] @AutoBuilder class must not be private") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void autoBuilderNestedInPrivate() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " private static class Private {", + " @AutoBuilder", + " public interface Builder {", + " Baz build();", + " }", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining( + "[AutoBuilderInPrivate] @AutoBuilder class must not be nested in a private class") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void autoBuilderInner() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " @AutoBuilder", + " abstract class Builder {", + " abstract Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining("[AutoBuilderInner] Nested @AutoBuilder class must be static") + .inFile(javaFileObject) + .onLineContaining("class Builder"); + } + + @Test + public void innerConstructor() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " class Inner {}", + "", + " @AutoBuilder(ofClass = Inner.class)", + " interface Builder {", + " abstract Inner build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining("[AutoBuilderInner] Nested @AutoBuilder ofClass class must be static") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void noVisibleConstructor() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " @AutoBuilder(ofClass = System.class)", + " interface Builder {", + " abstract System build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining("[AutoBuilderNoVisible] No visible constructor for java.lang.System") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void noVisibleMethod() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " private static Baz of() {", + " return new Baz();", + " }", + "", + " @AutoBuilder(callMethod = \"of\")", + " interface Builder {", + " abstract Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining( + "[AutoBuilderNoVisible] No visible static method named \"of\" for foo.bar.Baz") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void methodNotStatic() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " Baz of() {", + " return this;", + " }", + "", + " @AutoBuilder(callMethod = \"of\")", + " interface Builder {", + " abstract Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining( + "[AutoBuilderNoVisible] No visible static method named \"of\" for foo.bar.Baz") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void noMatchingConstructor() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " public Baz(int notMe) {}", + "", + " public Baz(String notMeEither) {}", + "", + " @AutoBuilder", + " interface Builder {", + " Builder setBuh(String x);", + " abstract Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining( + "[AutoBuilderNoMatch] Property names do not correspond to the parameter names of any" + + " constructor:\n" + + " Baz(int notMe)\n" + + " Baz(java.lang.String notMeEither)") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void twoMatchingConstructors() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public class Baz {", + " public Baz() {}", + "", + " public Baz(int buh) {}", + "", + " public Baz(String buh) {}", + "", + " @AutoBuilder", + " interface Builder {", + " Builder setBuh(String x);", + " abstract Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining( + "[AutoBuilderAmbiguous] Property names correspond to more than one constructor:\n" + + " Baz(int buh)\n" + + " Baz(java.lang.String buh)") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } + + @Test + public void constructInterface() { + JavaFileObject javaFileObject = + JavaFileObjects.forSourceLines( + "foo.bar.Baz", + "package foo.bar;", + "", + "import com.google.auto.value.AutoBuilder;", + "", + "public interface Baz {", + " @AutoBuilder", + " interface Builder {", + " abstract Baz build();", + " }", + "}"); + Compilation compilation = + javac() + .withProcessors(new AutoBuilderProcessor()) + .withOptions("-Acom.google.auto.value.AutoBuilderIsUnstable") + .compile(javaFileObject); + assertThat(compilation).failed(); + assertThat(compilation) + .hadErrorContaining( + "[AutoBuilderEnclosing] @AutoBuilder must specify ofClass=Something.class or it must" + + " be nested inside the class to be built; actually nested inside interface" + + " foo.bar.Baz") + .inFile(javaFileObject) + .onLineContaining("interface Builder"); + } } |