private Compilation compareCommandDump(List<String> expected, JavaFileObject ... sourceFiles) { CommandSpec2YamlProcessor processor = new CommandSpec2YamlProcessor(); Compilation compilation = javac() .withProcessors(processor) .compile(sourceFiles); assertTrue("Expected at least " + expected.size() + " commands but found " + processor.strings.size(), expected.size() <= processor.strings.size()); for (int i = 0; i < expected.size(); i++) { assertEqualCommand(expected.get(i), processor.strings.get(i)); } return compilation; }
@Test public void intentBuilderGenerator_should_fail_when_navigationModelIsAbstract() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.DartModel;", "@DartModel", "public abstract class TestNavigationModel {", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "DartModel class TestNavigationModel must not be private, static or abstract."); }
@Test public void intentBuilderGenerator_should_fail_when_navigationModelSuffixIsWrong() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.DartModel;", "@DartModel", "class TestModel {", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "DartModel class TestModel does not follow the naming convention: my.package.TargetComponentNavigationModel."); }
@Test public void intentBuilderGenerator_should_fail_when_extraIsInvalidType() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.BindExtra;", "public class TestNavigationModel {", " @BindExtra Object extra;", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "The fields of class annotated with @DartModel must be primitive, Serializable or Parcelable (test.navigation.TestNavigationModel.extra)."); }
@Test public void intentBuilderGenerator_should_fail_when_extraKeyIsInvalid() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.BindExtra;", "public class TestNavigationModel {", " @BindExtra(\"my.key\") String extra;", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "@BindExtra key has to be a valid java variable identifier (test.navigation.TestNavigationModel#extra)."); }
@Test public void intentBuilderGenerator_should_fail_when_extraIsPrivate() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.BindExtra;", "public class TestNavigationModel {", " @BindExtra private String extra;", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "@BindExtra field must not be private or static. (test.navigation.TestNavigationModel.extra)"); }
@Test public void intentBuilderGenerator_should_fail_when_navigationModelIsInnerClass() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.OuterClass", Joiner.on('\n') .join( "package test.navigation;", "import dart.DartModel;", "public class OuterClass {", " @DartModel", " class TestNavigationModel {", " }", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining("DartModel class TestNavigationModel must be a top level class."); }
@Test public void intentBuilderGenerator_should_fail_when_navigationModelDefaultConstructorIsPrivate() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.DartModel;", "@DartModel", "public class TestNavigationModel {", " private TestNavigationModel() {}", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "DartModel class TestNavigationModel default constructor must not be private."); }
@Test public void intentBuilderGenerator_should_fail_when_navigationModelIsNotAClass() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.DartModel;", "@DartModel", "public interface TestNavigationModel {", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "DartModel class TestNavigationModel must not be private, static or abstract."); }
@Test public void intentBuilderGenerator_should_fail_when_extraIsStatic() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.BindExtra;", "public class TestNavigationModel {", " @BindExtra static String extra;", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "@BindExtra field must not be private or static. (test.navigation.TestNavigationModel.extra)"); }
@Test public void intentBuilderGenerator_should_fail_when_extraIsNonSerializableCollection() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( // "package test.navigation;", "import java.util.List;", "import dart.BindExtra;", "public class TestNavigationModel {", " @BindExtra List<String> extra;", "}")); Compilation compilation = javac().withProcessors(hensonProcessorWithoutParceler()).compile(source); assertThat(compilation) .hadErrorContaining( "The fields of class annotated with @DartModel must be primitive, Serializable or Parcelable (test.navigation.TestNavigationModel.extra)."); }
@Test public void intentBuilderGenerator_should_fail_when_parentIsNotANavigationModel() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.BindExtra;", "public class TestNavigationModel extends SuperClass {", " @BindExtra String extra;", "}", "class SuperClass {", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "DartModel test.navigation.TestNavigationModel parent does not have an IntentBuilder. Is test.navigation.SuperClass annotated with @DartModel or contains @BindExtra fields?"); }
@Test public void intentBuilderGenerator_should_fail_when_navigationModelIsStatic() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.OuterClass", Joiner.on('\n') .join( "package test.navigation;", "import dart.DartModel;", "public class OuterClass {", " @DartModel", " static class TestNavigationModel {", " }", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining( "DartModel class TestNavigationModel must not be private, static or abstract."); }
@Test public void intentBuilderGenerator_should_fail_when_navigationModelDoesNotHaveDefaultConstructor() { JavaFileObject source = JavaFileObjects.forSourceString( "test.navigation.TestNavigationModel", Joiner.on('\n') .join( "package test.navigation;", "import dart.DartModel;", "@DartModel", "public class TestNavigationModel {", " public TestNavigationModel(String parameter) {}", "}")); Compilation compilation = javac().withProcessors(hensonProcessor()).compile(source); assertThat(compilation) .hadErrorContaining("DartModel class TestNavigationModel must have a default constructor."); }
@Test public void testInvalidAnnotationsOnInterface() { CommandSpec2YamlProcessor processor = new CommandSpec2YamlProcessor(); Compilation compilation = javac() .withProcessors(processor) .compile(JavaFileObjects.forResource( "picocli/examples/annotatedmethods/InvalidAnnotatedInterfaceMethodOptions.java")); assertThat(compilation).failed(); ImmutableList<Diagnostic<? extends JavaFileObject>> errors = compilation.errors(); assertEquals("expected error count", 3, errors.size()); for (Diagnostic<? extends JavaFileObject> diag : errors) { MatcherAssert.assertThat(diag.getMessage(Locale.ENGLISH), containsString("Invalid picocli annotation on interface field")); } //assertThat(compilation).hadErrorContaining("Invalid picocli annotation on interface field"); }
@Test public void failsIfStatic() { JavaFileObject source = JavaFileObjects.forSourceString( "test.TestNavigationModel", Joiner.on('\n') .join( "package test;", "import dart.BindExtra;", "public class TestNavigationModel {", " @BindExtra(\"key\") static String extra;", "}")); Compilation compilation = javac().withProcessors(extraBinderProcessorsWithoutParceler()).compile(source); assertThat(compilation) .hadErrorContaining( "@BindExtra field must not be private or static. (test.TestNavigationModel.extra)") .inFile(source) .onLine(4); }
@Test public void generateNested() { AnnotatedCommandSourceGeneratorProcessor processor = new AnnotatedCommandSourceGeneratorProcessor(); Compilation compilation = javac() .withProcessors(processor) .compile(JavaFileObjects.forResource( "picocli/examples/PopulateFlagsMain.java")); assertThat(compilation).succeeded(); assertThat(compilation) .generatedFile(StandardLocation.SOURCE_OUTPUT, "generated/picocli/examples/PopulateFlagsMain.java") .hasSourceEquivalentTo(JavaFileObjects.forResource("generated/picocli/examples/PopulateFlagsMain.java")); }
@Test public void generate1() { AnnotatedCommandSourceGeneratorProcessor processor = new AnnotatedCommandSourceGeneratorProcessor(); Compilation compilation = javac() .withProcessors(processor) .compile(JavaFileObjects.forResource( "picocli/codegen/aot/graalvm/Example.java")); assertThat(compilation).succeeded(); assertThat(compilation) .generatedFile(StandardLocation.SOURCE_OUTPUT, "generated/picocli/codegen/aot/graalvm/Example.java") .hasSourceEquivalentTo(JavaFileObjects.forResource("generated/picocli/codegen/aot/graalvm/Example.java")); }
@Ignore @Test public void generate() { AnnotatedCommandSourceGeneratorProcessor processor = new AnnotatedCommandSourceGeneratorProcessor(); Compilation compilation = javac() .withProcessors(processor) .compile(JavaFileObjects.forResource( "picocli/examples/subcommands/ParentCommandDemo.java")); assertThat(compilation).succeeded(); assertThat(compilation) .generatedSourceFile("GeneratedHelloWorld") .hasSourceEquivalentTo(JavaFileObjects.forResource("GeneratedHelloWorld.java")); }
@Ignore @Test public void generateNested2() { AnnotatedCommandSourceGeneratorProcessor processor = new AnnotatedCommandSourceGeneratorProcessor(); Compilation compilation = javac() .withProcessors(processor) .compile(JavaFileObjects.forResource( "picocli/examples/subcommands/ParentCommandDemo.java")); assertThat(compilation).succeeded(); assertThat(compilation) .generatedFile(StandardLocation.SOURCE_OUTPUT, "generated/examples/subcommands/ParentCommandDemo.java") .hasSourceEquivalentTo(JavaFileObjects.forResource("generated/examples/subcommands/ParentCommandDemo.java")); } }