Skip to content

Commit 0e910b8

Browse files
authored
ISSUES-4 factory use mockBuilder (#15)
* ISSUES-4 factory use mockBuilder * ISSUES-4 factory use mockBuilder * ISSUES-4 factory use mockBuilder
1 parent 0c66774 commit 0e910b8

File tree

9 files changed

+140
-56
lines changed

9 files changed

+140
-56
lines changed

compiler/src/main/java/io/jbock/simple/processor/writing/BuilderImpl.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ TypeSpec generate(BuilderElement builder, MockBuilder mockBuilder) {
5050
}
5151

5252
private TypeSpec generateMock(BuilderElement builder, MockBuilder mockBuilder) {
53-
TypeMirror builderType = builder.element().asType();
5453
TypeSpec.Builder spec = TypeSpec.classBuilder(builder.generatedClass());
5554
FieldSpec mockBuilderField = FieldSpec.builder(mockBuilder.getClassName(), "mockBuilder", FINAL).build();
5655
spec.addField(mockBuilderField);
@@ -80,7 +79,7 @@ private TypeSpec generateMock(BuilderElement builder, MockBuilder mockBuilder) {
8079
spec.addFields(fields());
8180
spec.addMethods(setterMethods(builder));
8281
spec.addModifiers(PRIVATE, STATIC, FINAL);
83-
spec.addSuperinterface(builderType);
82+
spec.addSuperinterface(builder.element().asType());
8483
buildMethod.addAnnotation(Override.class);
8584
buildMethod.addModifiers(builder.buildMethod().getModifiers().stream()
8685
.filter(m -> m == PUBLIC || m == PROTECTED).collect(Collectors.toList()));

compiler/src/main/java/io/jbock/simple/processor/writing/ComponentImpl.java

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ TypeSpec generate() {
7676
}
7777
component.factoryElement().ifPresent(factory -> {
7878
spec.addMethod(generateFactoryMethod(factory));
79-
spec.addType(factoryImpl.generate(factory));
79+
spec.addType(factoryImpl.generate(factory, mockBuilder));
8080
});
8181
component.builderElement().ifPresent(builder -> {
8282
spec.addMethod(generateBuilderMethod(builder));
@@ -99,12 +99,16 @@ TypeSpec generate() {
9999
}
100100

101101
private MethodSpec generateFactoryMethod(FactoryElement factory) {
102-
return MethodSpec.methodBuilder(FACTORY_METHOD)
102+
MethodSpec.Builder spec = MethodSpec.methodBuilder(FACTORY_METHOD)
103103
.addModifiers(STATIC)
104104
.addModifiers(modifiers)
105-
.returns(TypeName.get(factory.element().asType()))
106-
.addStatement("return new $T()", factory.generatedClass())
107-
.build();
105+
.returns(TypeName.get(factory.element().asType()));
106+
if (component.omitMockBuilder()) {
107+
spec.addStatement("return new $T()", factory.generatedClass());
108+
} else {
109+
spec.addStatement("return new $T(null)", factory.generatedClass());
110+
}
111+
return spec.build();
108112
}
109113

110114
private MethodSpec generateBuilderMethod(BuilderElement builder) {

compiler/src/main/java/io/jbock/simple/processor/writing/FactoryImpl.java

Lines changed: 79 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package io.jbock.simple.processor.writing;
22

33
import io.jbock.javapoet.CodeBlock;
4+
import io.jbock.javapoet.FieldSpec;
45
import io.jbock.javapoet.MethodSpec;
56
import io.jbock.javapoet.ParameterSpec;
67
import io.jbock.javapoet.TypeName;
@@ -40,7 +41,56 @@ private FactoryImpl(
4041
this.names = names;
4142
}
4243

43-
TypeSpec generate(FactoryElement factory) {
44+
TypeSpec generate(FactoryElement factory, MockBuilder mockBuilder) {
45+
if (component.omitMockBuilder()) {
46+
return generateNoMock(factory);
47+
} else {
48+
return generateMock(factory, mockBuilder);
49+
}
50+
}
51+
52+
private TypeSpec generateMock(FactoryElement factory, MockBuilder mockBuilder) {
53+
TypeSpec.Builder spec = TypeSpec.classBuilder(factory.generatedClass());
54+
FieldSpec mockBuilderField = FieldSpec.builder(mockBuilder.getClassName(), "mockBuilder", FINAL).build();
55+
spec.addField(mockBuilderField);
56+
ParameterSpec mockBuilderParam = ParameterSpec.builder(mockBuilder.getClassName(), "mockBuilder").build();
57+
spec.addMethod(MethodSpec.constructorBuilder()
58+
.addParameter(mockBuilderParam)
59+
.addStatement("this.$N = $N", mockBuilderField, mockBuilderParam)
60+
.build());
61+
ExecutableElement abstractMethod = factory.singleAbstractMethod();
62+
MethodSpec.Builder method = MethodSpec.methodBuilder(abstractMethod.getSimpleName().toString());
63+
method.addAnnotation(Override.class);
64+
method.addModifiers(abstractMethod.getModifiers().stream()
65+
.filter(m -> m == PUBLIC || m == PROTECTED).collect(Collectors.toList()));
66+
method.returns(TypeName.get(component.element().asType()));
67+
for (NamedBinding namedBinding : sorted.values()) {
68+
Binding b = namedBinding.binding();
69+
if (b instanceof ParameterBinding) {
70+
continue;
71+
}
72+
Key key = b.key();
73+
CodeBlock invocation = b.invocation(names);
74+
ParameterSpec param = names.apply(key);
75+
if (!key.typeName().isPrimitive()) {
76+
method.addStatement("$1T $2N = this.$3N != null && this.$3N.$2N != null ? this.$3N.$2N : $4L",
77+
key.typeName(), param, mockBuilderField, invocation);
78+
} else {
79+
FieldSpec auxField = FieldSpec.builder(TypeName.BOOLEAN, namedBinding.auxName(), PRIVATE).build();
80+
method.addStatement("$1T $2N = this.$3N != null && this.$3N.$4N ? this.$3N.$2N : $5L",
81+
key.typeName(), param, mockBuilderField, auxField, invocation);
82+
}
83+
}
84+
method.addParameters(parameters());
85+
spec.addModifiers(PRIVATE, STATIC, FINAL);
86+
spec.addSuperinterface(factory.element().asType());
87+
method.addStatement("return new $T($L)", component.generatedClass(), constructorParameters().stream()
88+
.collect(CodeBlock.joining(", ")));
89+
spec.addMethod(method.build());
90+
return spec.build();
91+
}
92+
93+
private TypeSpec generateNoMock(FactoryElement factory) {
4494
TypeSpec.Builder spec = TypeSpec.classBuilder(factory.generatedClass());
4595
spec.addModifiers(PRIVATE, STATIC, FINAL);
4696
spec.addSuperinterface(factory.element().asType());
@@ -50,27 +100,47 @@ TypeSpec generate(FactoryElement factory) {
50100
method.addModifiers(abstractMethod.getModifiers().stream()
51101
.filter(m -> m == PUBLIC || m == PROTECTED).collect(Collectors.toList()));
52102
method.returns(TypeName.get(component.element().asType()));
53-
List<CodeBlock> constructorParameters = new ArrayList<>();
54103
for (NamedBinding namedBinding : sorted.values()) {
55104
Binding b = namedBinding.binding();
56105
Key key = b.key();
57106
CodeBlock invocation = b.invocation(names);
58107
ParameterSpec param = names.apply(key);
59-
if (namedBinding.isComponentRequest()) {
60-
constructorParameters.add(CodeBlock.of("$N", names.apply(key)));
61-
}
62-
if (b instanceof ParameterBinding) {
63-
method.addParameter(names.apply(b.key()));
64-
} else {
108+
if (!(b instanceof ParameterBinding)) {
65109
method.addStatement("$T $N = $L", key.typeName(), param, invocation);
66110
}
67111
}
68-
method.addStatement("return new $T($L)", component.generatedClass(), constructorParameters.stream()
112+
method.addParameters(parameters());
113+
method.addStatement("return new $T($L)", component.generatedClass(), constructorParameters().stream()
69114
.collect(CodeBlock.joining(", ")));
70115
spec.addMethod(method.build());
71116
return spec.build();
72117
}
73118

119+
120+
private List<CodeBlock> constructorParameters() {
121+
List<CodeBlock> result = new ArrayList<>();
122+
for (NamedBinding namedBinding : sorted.values()) {
123+
Binding b = namedBinding.binding();
124+
Key key = b.key();
125+
if (namedBinding.isComponentRequest()) {
126+
result.add(CodeBlock.of("$N", names.apply(key)));
127+
}
128+
}
129+
return result;
130+
}
131+
132+
private List<ParameterSpec> parameters() {
133+
List<ParameterSpec> result = new ArrayList<>();
134+
for (NamedBinding namedBinding : sorted.values()) {
135+
Binding b = namedBinding.binding();
136+
Key key = b.key();
137+
if (b instanceof ParameterBinding) {
138+
result.add(names.apply(key));
139+
}
140+
}
141+
return result;
142+
}
143+
74144
public static final class Factory {
75145
private final ComponentElement component;
76146

compiler/src/main/java/io/jbock/simple/processor/writing/MockBuilder.java

Lines changed: 30 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -62,32 +62,39 @@ ClassName getClassName() {
6262
}
6363

6464
private MethodSpec buildMethod() {
65-
List<CodeBlock> constructorParameters = new ArrayList<>();
6665
MethodSpec.Builder method = MethodSpec.methodBuilder("build");
67-
for (NamedBinding namedBinding : sorted.values()) {
68-
Binding b = namedBinding.binding();
69-
Key key = b.key();
70-
CodeBlock invocation = b.invocation(names);
71-
ParameterSpec param = names.apply(key);
72-
if (namedBinding.isComponentRequest()) {
73-
constructorParameters.add(CodeBlock.of("$N", names.apply(key)));
74-
}
75-
if (b instanceof ParameterBinding) {
76-
method.addParameter(names.apply(b.key()));
77-
} else if (!key.typeName().isPrimitive()) {
78-
method.addStatement("$1T $2N = this.$2N != null ? this.$2N : $3L", key.typeName(), param, invocation);
79-
} else {
80-
FieldSpec auxField = FieldSpec.builder(TypeName.BOOLEAN, namedBinding.auxName(), PRIVATE).build();
81-
method.addStatement("$1T $2N = this.$3N ? this.$2N : $4L", key.typeName(), param, auxField, invocation);
66+
method.addModifiers(modifiers);
67+
component.factoryElement().ifPresent(factory -> {
68+
method.returns(TypeName.get(factory.element().asType()));
69+
method.addStatement("return new $T(this)", factory.generatedClass());
70+
});
71+
component.builderElement().ifPresent(builder -> {
72+
method.returns(TypeName.get(builder.element().asType()));
73+
method.addStatement("return new $T(this)", builder.generatedClass());
74+
});
75+
if (component.factoryElement().isEmpty() && component.builderElement().isEmpty()) {
76+
method.returns(TypeName.get(component.element().asType()));
77+
List<CodeBlock> constructorParameters = new ArrayList<>();
78+
for (NamedBinding namedBinding : sorted.values()) {
79+
Binding b = namedBinding.binding();
80+
Key key = b.key();
81+
CodeBlock invocation = b.invocation(names);
82+
ParameterSpec param = names.apply(key);
83+
if (namedBinding.isComponentRequest()) {
84+
constructorParameters.add(CodeBlock.of("$N", names.apply(key)));
85+
}
86+
if (!key.typeName().isPrimitive()) {
87+
method.addStatement("$1T $2N = this.$2N != null ? this.$2N : $3L", key.typeName(), param, invocation);
88+
} else {
89+
FieldSpec auxField = FieldSpec.builder(TypeName.BOOLEAN, namedBinding.auxName(), PRIVATE).build();
90+
method.addStatement("$1T $2N = this.$3N ? this.$2N : $4L", key.typeName(), param, auxField, invocation);
91+
}
8292
}
93+
method.addStatement("return new $T($L)",
94+
component.generatedClass(),
95+
constructorParameters.stream().collect(CodeBlock.joining(", ")));
8396
}
84-
return method
85-
.addModifiers(modifiers)
86-
.returns(TypeName.get(component.element().asType()))
87-
.addStatement("return new $T($L)",
88-
component.generatedClass(),
89-
constructorParameters.stream().collect(CodeBlock.joining(", ")))
90-
.build();
97+
return method.build();
9198
}
9299

93100
private List<FieldSpec> getFields() {

compiler/src/test/java/io/jbock/simple/processor/FactoryTest.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -54,13 +54,13 @@ void noParameters() {
5454
" }",
5555
"",
5656
" static TestClass.AComponent.Factory factory() {",
57-
" return new Factory_Impl();",
57+
" return new Factory_Impl(null);",
5858
" }",
5959
"",
6060
" private static final class Factory_Impl implements TestClass.AComponent.Factory {",
6161
" @Override",
6262
" public TestClass.AComponent create() {",
63-
" TestClass.A a = new TestClass.A();",
63+
" TestClass.A a = this.mockBuilder != null && this.mockBuilder.a != null ? this.mockBuilder.a : new TestClass.A();",
6464
" return new TestClass_AComponent_Impl(a);",
6565
" }",
6666
" }",
@@ -106,7 +106,7 @@ void factoryParameterIdentity() {
106106
" }",
107107
"",
108108
" public static TestClass.AComponent.Factory factory() {",
109-
" return new Factory_Impl();",
109+
" return new Factory_Impl(null);",
110110
" }",
111111
"",
112112
" private static final class Factory_Impl implements TestClass.AComponent.Factory {",
@@ -161,13 +161,19 @@ void factoryParameter() {
161161
" }",
162162
"",
163163
" static TestClass.AComponent.Factory factory() {",
164-
" return new Factory_Impl();",
164+
" return new Factory_Impl(null);",
165165
" }",
166166
"",
167167
" private static final class Factory_Impl implements TestClass.AComponent.Factory {",
168+
" final MockBuilder mockBuilder;",
169+
"",
170+
" Factory_Impl(MockBuilder mockBuilder) {",
171+
" this.mockBuilder = mockBuilder;",
172+
" }",
173+
"",
168174
" @Override",
169175
" public TestClass.AComponent create(String s) {",
170-
" TestClass.A a = new TestClass.A(s);",
176+
" TestClass.A a = this.mockBuilder != null && this.mockBuilder.a != null ? this.mockBuilder.a : new TestClass.A(s);",
171177
" return new TestClass_AComponent_Impl(a);",
172178
" }",
173179
" }",

compiler/src/test/java/io/jbock/simple/processor/JakartaQualifierTest.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void qualifiedIdentity() {
5151
" }",
5252
"",
5353
" static TestClass.AComponent.Factory factory() {",
54-
" return new Factory_Impl();",
54+
" return new Factory_Impl(null);",
5555
" }",
5656
"",
5757
" private static final class Factory_Impl implements TestClass.AComponent.Factory {",
@@ -62,8 +62,8 @@ void qualifiedIdentity() {
6262
" }",
6363
"",
6464
" static final class MockBuilder {",
65-
" TestClass.AComponent build(String a, String b) {",
66-
" return new TestClass_AComponent_Impl(a);",
65+
" TestClass.AComponent.Factory build() {",
66+
" return new Factory_Impl(this);",
6767
" }",
6868
" }",
6969
"}");

compiler/src/test/java/io/jbock/simple/processor/JavaxQualifierTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@ void qualifiedIdentity() {
5151
" }",
5252
"",
5353
" static TestClass.AComponent.Factory factory() {",
54-
" return new Factory_Impl();",
54+
" return new Factory_Impl(null);",
5555
" }",
5656
"",
5757
" private static final class Factory_Impl implements TestClass.AComponent.Factory {",

compiler/src/test/java/io/jbock/simple/processor/PrimitiveTest.java

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -87,14 +87,14 @@ void providesPrimitive() {
8787
" }",
8888
"",
8989
" static TestClass.AComponent.Factory factory() {",
90-
" return new Factory_Impl();",
90+
" return new Factory_Impl(null);",
9191
" }",
9292
"",
9393
" private static final class Factory_Impl implements TestClass.AComponent.Factory {",
9494
" @Override",
9595
" public TestClass.AComponent create(int i) {",
96-
" int b = TestClass.AComponent.getB(i);",
97-
" TestClass.A a = new TestClass.A(b);",
96+
" int b = this.mockBuilder != null && this.mockBuilder.b_isSet ? this.mockBuilder.b : TestClass.AComponent.getB(i);",
97+
" TestClass.A a = this.mockBuilder != null && this.mockBuilder.a != null ? this.mockBuilder.a : new TestClass.A(b);",
9898
" return new TestClass_AComponent_Impl(a);",
9999
" }",
100100
" }",
@@ -104,10 +104,8 @@ void providesPrimitive() {
104104
" private boolean b_isSet;",
105105
" private TestClass.A a;",
106106
"",
107-
" TestClass.AComponent build(int i) {",
108-
" int b = this.b_isSet ? this.b : TestClass.AComponent.getB(i);",
109-
" TestClass.A a = this.a != null ? this.a : new TestClass.A(b);",
110-
" return new TestClass_AComponent_Impl(a);",
107+
" TestClass.AComponent.Factory build() {",
108+
" return new Factory_Impl(this);",
111109
" }",
112110
"",
113111
" void b(int b) {",

compiler/src/test/java/io/jbock/simple/processor/QualifierTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ void qualifiedIdentity() {
8080
" }",
8181
"",
8282
" static TestClass.AComponent.Factory factory() {",
83-
" return new Factory_Impl();",
83+
" return new Factory_Impl(null);",
8484
" }",
8585
"",
8686
" private static final class Factory_Impl implements TestClass.AComponent.Factory {",

0 commit comments

Comments
 (0)