Search in sources :

Example 1 with Compilation

use of io.jbock.testing.compile.Compilation in project jbock by jbock-java.

the class DependsOnGeneratedTypeTest method dependsOnGeneratedType.

@Test
void dependsOnGeneratedType() {
    JavaFileObject command = forSourceLines("test.Arguments", "package test;", "", "import java.util.Optional;", "import java.util.function.Supplier;", "import net.jbock.Command;", "import net.jbock.Parameter;", "import net.jbock.util.StringConverter;", "", "@Command", "abstract class Arguments {", "", "  @Parameter(index = 0, converter = Mimi.class)", "  abstract Optional<GeneratedType> hello();", "", "  static class Mimi implements Supplier<StringConverter<GeneratedType>> {", "    public StringConverter<GeneratedType> get() { return new MapMap(); }", "  }", "}");
    GeneratingProcessor generatingProcessor = new GeneratingProcessor("test.GeneratedType", "package test;", "", "final class GeneratedType {", "}");
    GeneratingProcessor converter = new GeneratingProcessor("test.MapMap", "package test;", "", "import net.jbock.util.StringConverter;", "", "class MapMap extends StringConverter<GeneratedType> {", "", "  @Override", "  public GeneratedType convert(String token) { return null; }", "}");
    Compilation compilation = Processor.compiler(generatingProcessor, converter).compile(command);
    assertThat(compilation).succeededWithoutWarnings();
}
Also used : JavaFileObject(javax.tools.JavaFileObject) Compilation(io.jbock.testing.compile.Compilation) Test(org.junit.jupiter.api.Test)

Example 2 with Compilation

use of io.jbock.testing.compile.Compilation in project jbock by jbock-java.

the class ParseOrExitFullTest method testBasicGenerated.

@Test
void testBasicGenerated() {
    JavaFileObject javaFile = fromSource("@Command", "abstract class Arguments {", "", "  @Parameters", "  abstract List<String> hello();", "}");
    List<String> expectedParser = List.of("package test;", "", "import io.jbock.util.Either;", "import io.jbock.util.Eithers;", "import java.util.List;", "import java.util.Map;", "import java.util.function.Function;", "import javax.annotation.processing.Generated;", "import net.jbock.contrib.StandardErrorHandler;", "import net.jbock.model.CommandModel;", "import net.jbock.model.ItemType;", "import net.jbock.model.Multiplicity;", "import net.jbock.model.Parameter;", "import net.jbock.parse.RestParser;", "import net.jbock.util.ExConvert;", "import net.jbock.util.ExFailure;", "import net.jbock.util.ParseRequest;", "import net.jbock.util.ParsingFailed;", "import net.jbock.util.StringConverter;", "", "@Generated(", "    value = \"net.jbock.processor.JbockProcessor\",", "    comments = \"https://github.com/jbock-java\"", ")", "final class ArgumentsParser {", "  Either<ParsingFailed, Arguments> parse(List<String> tokens) {", "    RestParser<Void> parser = RestParser.create(Map.of(), Map.of(), 0);", "    try {", "      parser.parse(tokens);", "      return Either.right(harvest(parser));", "    } catch (ExFailure e) {", "      return Either.left(e.toError(createModel()));", "    }", "  }", "", "  Arguments parseOrExit(String[] args) {", "    if (args.length > 0 && \"--help\".equals(args[0])) {", "      StandardErrorHandler.builder().build()", "        .printUsageDocumentation(createModel());", "      System.exit(0);", "    }", "    return ParseRequest.from(args).expand()", "      .mapLeft(err -> err.addModel(createModel()))", "      .flatMap(this::parse)", "      .orElseThrow(failure -> {", "        StandardErrorHandler.builder().build().printErrorMessage(failure);", "        System.exit(1);", "        return new RuntimeException();", "      });", "  }", "", "  private Arguments harvest(RestParser<Void> parser) throws ExFailure {", "    List<String> _hello = parser.rest()", "          .map(StringConverter.create(Function.identity()))", "          .collect(Eithers.firstFailure())", "          .orElseThrow(left -> new ExConvert(left, ItemType.PARAMETER, 0));", "    return new Arguments_Impl(_hello);", "  }", "", "  CommandModel createModel() {", "    return CommandModel.builder()", "          .withProgramName(\"arguments\")", "          .addParameter(Parameter.builder(Multiplicity.REPEATABLE)", "            .withParamLabel(\"HELLO\")", "            .build())", "          .build();", "  }", "}");
    List<String> expectedImpl = List.of("package test;", "", "import java.util.List;", "import javax.annotation.processing.Generated;", "", "@Generated(", "    value = \"net.jbock.processor.JbockProcessor\",", "    comments = \"https://github.com/jbock-java\"", ")", "final class Arguments_Impl extends Arguments {", "  private final List<String> hello;", "", "  Arguments_Impl(List<String> hello) {", "    this.hello = hello;", "  }", "", "  @Override", "  List<String> hello() {", "    return hello;", "  }", "}");
    Compilation compilation = Processor.compiler().compile(javaFile);
    assertThat(compilation).succeeded();
    assertThat(compilation).generatedSourceFile("test.ArgumentsParser").contentsAsUtf8Iterable().containsExactlyElementsIn(expectedParser).inOrder();
    assertThat(compilation).generatedSourceFile("test.Arguments_Impl").contentsAsUtf8Iterable().containsExactlyElementsIn(expectedImpl).inOrder();
}
Also used : JavaFileObject(javax.tools.JavaFileObject) Compilation(io.jbock.testing.compile.Compilation) Test(org.junit.jupiter.api.Test)

Example 3 with Compilation

use of io.jbock.testing.compile.Compilation in project jbock by jbock-java.

the class BasicFullTest method testBasicGenerated.

@Test
void testBasicGenerated() {
    JavaFileObject javaFile = fromSource("@Command(skipGeneratingParseOrExitMethod = true)", "abstract class Arguments {", "", "  @Parameters", "  abstract List<String> hello();", "}");
    List<String> expectedParser = List.of("package test;", "", "import io.jbock.util.Either;", "import io.jbock.util.Eithers;", "import java.util.List;", "import java.util.Map;", "import java.util.function.Function;", "import javax.annotation.processing.Generated;", "import net.jbock.model.CommandModel;", "import net.jbock.model.ItemType;", "import net.jbock.model.Multiplicity;", "import net.jbock.model.Parameter;", "import net.jbock.parse.RestParser;", "import net.jbock.util.ExConvert;", "import net.jbock.util.ExFailure;", "import net.jbock.util.ParsingFailed;", "import net.jbock.util.StringConverter;", "", "@Generated(", "    value = \"net.jbock.processor.JbockProcessor\",", "    comments = \"https://github.com/jbock-java\"", ")", "final class ArgumentsParser {", "  Either<ParsingFailed, Arguments> parse(List<String> tokens) {", "    RestParser<Void> parser = RestParser.create(Map.of(), Map.of(), 0);", "    try {", "      parser.parse(tokens);", "      return Either.right(harvest(parser));", "    } catch (ExFailure e) {", "      return Either.left(e.toError(createModel()));", "    }", "  }", "", "  private Arguments harvest(RestParser<Void> parser) throws ExFailure {", "    List<String> _hello = parser.rest()", "          .map(StringConverter.create(Function.identity()))", "          .collect(Eithers.firstFailure())", "          .orElseThrow(left -> new ExConvert(left, ItemType.PARAMETER, 0));", "    return new Arguments_Impl(_hello);", "  }", "", "  CommandModel createModel() {", "    return CommandModel.builder()", "          .withProgramName(\"arguments\")", "          .addParameter(Parameter.builder(Multiplicity.REPEATABLE)", "            .withParamLabel(\"HELLO\")", "            .build())", "          .build();", "  }", "}");
    List<String> expectedImpl = List.of("package test;", "", "import java.util.List;", "import javax.annotation.processing.Generated;", "", "@Generated(", "    value = \"net.jbock.processor.JbockProcessor\",", "    comments = \"https://github.com/jbock-java\"", ")", "final class Arguments_Impl extends Arguments {", "  private final List<String> hello;", "", "  Arguments_Impl(List<String> hello) {", "    this.hello = hello;", "  }", "", "  @Override", "  List<String> hello() {", "    return hello;", "  }", "}");
    Compilation compilation = Processor.compiler().compile(javaFile);
    assertThat(compilation).succeeded();
    assertThat(compilation).generatedSourceFile("test.ArgumentsParser").contentsAsUtf8Iterable().containsExactlyElementsIn(expectedParser).inOrder();
    assertThat(compilation).generatedSourceFile("test.Arguments_Impl").contentsAsUtf8Iterable().containsExactlyElementsIn(expectedImpl).inOrder();
}
Also used : JavaFileObject(javax.tools.JavaFileObject) Compilation(io.jbock.testing.compile.Compilation) Test(org.junit.jupiter.api.Test)

Example 4 with Compilation

use of io.jbock.testing.compile.Compilation in project jbock by jbock-java.

the class BasicFullTest method testPublicParser.

@Test
void testPublicParser() {
    JavaFileObject javaFile = fromSource("@Command(skipGeneratingParseOrExitMethod = true, publicParser = true)", "abstract class Arguments {", "", "  @Parameters", "  abstract List<String> hello();", "}");
    List<String> expectedParser = List.of("package test;", "", "import io.jbock.util.Either;", "import io.jbock.util.Eithers;", "import java.util.List;", "import java.util.Map;", "import java.util.function.Function;", "import javax.annotation.processing.Generated;", "import net.jbock.model.CommandModel;", "import net.jbock.model.ItemType;", "import net.jbock.model.Multiplicity;", "import net.jbock.model.Parameter;", "import net.jbock.parse.RestParser;", "import net.jbock.util.ExConvert;", "import net.jbock.util.ExFailure;", "import net.jbock.util.ParsingFailed;", "import net.jbock.util.StringConverter;", "", "@Generated(", "    value = \"net.jbock.processor.JbockProcessor\",", "    comments = \"https://github.com/jbock-java\"", ")", "public final class ArgumentsParser {", "  public Either<ParsingFailed, Arguments> parse(List<String> tokens) {", "    RestParser<Void> parser = RestParser.create(Map.of(), Map.of(), 0);", "    try {", "      parser.parse(tokens);", "      return Either.right(harvest(parser));", "    } catch (ExFailure e) {", "      return Either.left(e.toError(createModel()));", "    }", "  }", "", "  private Arguments harvest(RestParser<Void> parser) throws ExFailure {", "    List<String> _hello = parser.rest()", "          .map(StringConverter.create(Function.identity()))", "          .collect(Eithers.firstFailure())", "          .orElseThrow(left -> new ExConvert(left, ItemType.PARAMETER, 0));", "    return new Arguments_Impl(_hello);", "  }", "", "  public CommandModel createModel() {", "    return CommandModel.builder()", "          .withProgramName(\"arguments\")", "          .addParameter(Parameter.builder(Multiplicity.REPEATABLE)", "            .withParamLabel(\"HELLO\")", "            .build())", "          .build();", "  }", "}");
    List<String> expectedImpl = List.of("package test;", "", "import java.util.List;", "import javax.annotation.processing.Generated;", "", "@Generated(", "    value = \"net.jbock.processor.JbockProcessor\",", "    comments = \"https://github.com/jbock-java\"", ")", "final class Arguments_Impl extends Arguments {", "  private final List<String> hello;", "", "  Arguments_Impl(List<String> hello) {", "    this.hello = hello;", "  }", "", "  @Override", "  List<String> hello() {", "    return hello;", "  }", "}");
    Compilation compilation = Processor.compiler().compile(javaFile);
    assertThat(compilation).succeeded();
    assertThat(compilation).generatedSourceFile("test.ArgumentsParser").contentsAsUtf8Iterable().containsExactlyElementsIn(expectedParser).inOrder();
    assertThat(compilation).generatedSourceFile("test.Arguments_Impl").contentsAsUtf8Iterable().containsExactlyElementsIn(expectedImpl).inOrder();
}
Also used : JavaFileObject(javax.tools.JavaFileObject) Compilation(io.jbock.testing.compile.Compilation) Test(org.junit.jupiter.api.Test)

Example 5 with Compilation

use of io.jbock.testing.compile.Compilation in project dapper by jbock-java.

the class ComponentProcessorTest method simpleComponent.

@EnumSource(CompilerMode.class)
@ParameterizedTest
void simpleComponent(CompilerMode compilerMode) {
    JavaFileObject injectableTypeFile = JavaFileObjects.forSourceLines("test.SomeInjectableType", "package test;", "", "import jakarta.inject.Inject;", "", "final class SomeInjectableType {", "  @Inject SomeInjectableType() {}", "}");
    JavaFileObject componentFile = JavaFileObjects.forSourceLines("test.SimpleComponent", "package test;", "", "import dagger.Component;", "import dagger.Lazy;", "import jakarta.inject.Provider;", "", "@Component", "interface SimpleComponent {", "  SomeInjectableType someInjectableType();", "  Lazy<SomeInjectableType> lazySomeInjectableType();", "  Provider<SomeInjectableType> someInjectableTypeProvider();", "}");
    JavaFileObject generatedComponent = compilerMode.javaFileBuilder("test.DaggerSimpleComponent").addLines("package test;", "").addLines(GeneratedLines.generatedImports("import dagger.Lazy;", "import dagger.internal.DoubleCheck;", "import jakarta.inject.Provider;")).addLines("").addLines(GeneratedLines.generatedAnnotations()).addLines("final class DaggerSimpleComponent implements SimpleComponent {", "  private final DaggerSimpleComponent simpleComponent = this;").addLinesIn(FAST_INIT_MODE, "  @Override", "  public SomeInjectableType someInjectableType() {", "    return someInjectableTypeProvider.get();", "  }", "", "  @Override", "  public Lazy<SomeInjectableType> lazySomeInjectableType() {", "    return DoubleCheck.lazy(someInjectableTypeProvider);", "  }", "", "  @Override", "  public Provider<SomeInjectableType> someInjectableTypeProvider() {", "    return someInjectableTypeProvider;", "  }", "", "  @SuppressWarnings(\"unchecked\")", "  private void initialize() {", "    this.someInjectableTypeProvider = new SwitchingProvider<>(simpleComponent, 0);", "  }", "", "  private static final class SwitchingProvider<T> implements Provider<T> {", "    private final DaggerSimpleComponent simpleComponent;", "", "    @SuppressWarnings(\"unchecked\")", "    @Override", "    public T get() {", "      switch (id) {", "        case 0: // test.SomeInjectableType ", "        return (T) new SomeInjectableType();", "        default: throw new AssertionError(id);", "      }", "    }").addLinesIn(DEFAULT_MODE, "  @Override", "  public SomeInjectableType someInjectableType() {", "    return new SomeInjectableType();", "  }", "", "  @Override", "  public Lazy<SomeInjectableType> lazySomeInjectableType() {", "    return DoubleCheck.lazy(SomeInjectableType_Factory.create());", "  }", "", "  @Override", "  public Provider<SomeInjectableType> someInjectableTypeProvider() {", "    return SomeInjectableType_Factory.create();", "  }", "}").build();
    Compilation compilation = compilerWithOptions(compilerMode.javacopts()).compile(injectableTypeFile, componentFile);
    assertThat(compilation).succeeded();
    assertThat(compilation).generatedSourceFile("test.DaggerSimpleComponent").containsLines(generatedComponent);
}
Also used : JavaFileObject(javax.tools.JavaFileObject) Compilation(io.jbock.testing.compile.Compilation) EnumSource(org.junit.jupiter.params.provider.EnumSource) ParameterizedTest(org.junit.jupiter.params.ParameterizedTest)

Aggregations

Compilation (io.jbock.testing.compile.Compilation)356 JavaFileObject (javax.tools.JavaFileObject)320 Test (org.junit.jupiter.api.Test)186 ParameterizedTest (org.junit.jupiter.params.ParameterizedTest)176 EnumSource (org.junit.jupiter.params.provider.EnumSource)107 MethodSource (org.junit.jupiter.params.provider.MethodSource)55 ArrayList (java.util.ArrayList)28 Disabled (org.junit.jupiter.api.Disabled)20 ValueSource (org.junit.jupiter.params.provider.ValueSource)6 Builder (dagger.internal.codegen.validation.ValidationReport.Builder)3 ValidationReport (dagger.internal.codegen.validation.ValidationReport)1 BindingGraph (dagger.spi.model.BindingGraph)1 Pattern (java.util.regex.Pattern)1