Skip to content

Commit 4bf419f

Browse files
authored
fix: Support testing nested argument method signatures and 'double' field assertions (#1094)
* fix: Support testing nested argument method signatures and 'double' field assertions * fix: DRY refactor for consistent double+float assertions * fix: Remove unused parameter. * fix: Simplify and DRY getter creation * fix: format
1 parent ee5d7a5 commit 4bf419f

File tree

3 files changed

+74
-70
lines changed

3 files changed

+74
-70
lines changed

src/main/java/com/google/api/generator/gapic/composer/common/AbstractServiceClientTestClassComposer.java

+5-8
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,7 @@
8282
import org.junit.Test;
8383

8484
public abstract class AbstractServiceClientTestClassComposer implements ClassComposer {
85+
8586
protected static final Statement EMPTY_LINE_STATEMENT = EmptyLineStatement.create();
8687

8788
protected static final String CLIENT_VAR_NAME = "client";
@@ -689,19 +690,15 @@ private MethodDefinition createRpcTestMethod(
689690
methodExprs.clear();
690691
methodStatements.add(EMPTY_LINE_STATEMENT);
691692

692-
methodStatements.addAll(
693-
methodExprs.stream().map(e -> ExprStatement.withExpr(e)).collect(Collectors.toList()));
694-
methodExprs.clear();
695-
696693
methodStatements.addAll(
697694
constructRpcTestCheckerLogic(
698695
method,
696+
methodSignature,
699697
rpcService,
700698
isRequestArg,
701699
classMemberVarExprs,
702700
requestVarExpr,
703-
requestMessage,
704-
argExprs));
701+
requestMessage));
705702

706703
String testMethodName =
707704
String.format(
@@ -720,12 +717,12 @@ private MethodDefinition createRpcTestMethod(
720717

721718
protected abstract List<Statement> constructRpcTestCheckerLogic(
722719
Method method,
720+
List<MethodArgument> methodSignature,
723721
Service service,
724722
boolean isRequestArg,
725723
Map<String, VariableExpr> classMemberVarExprs,
726724
VariableExpr requestVarExpr,
727-
Message requestMessage,
728-
List<VariableExpr> argExprs);
725+
Message requestMessage);
729726

730727
protected abstract MethodDefinition createStreamingRpcTestMethod(
731728
Service service,

src/main/java/com/google/api/generator/gapic/composer/grpc/ServiceClientTestClassComposer.java

+66-60
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import java.util.stream.Collectors;
6767

6868
public class ServiceClientTestClassComposer extends AbstractServiceClientTestClassComposer {
69+
6970
private static final String SERVICE_HELPER_VAR_NAME = "mockServiceHelper";
7071
private static final String CHANNEL_PROVIDER_VAR_NAME = "channelProvider";
7172

@@ -359,12 +360,12 @@ protected MethodDefinition createTearDownMethod(
359360
@Override
360361
protected List<Statement> constructRpcTestCheckerLogic(
361362
Method method,
363+
List<MethodArgument> methodSignature,
362364
Service service,
363365
boolean isRequestArg,
364366
Map<String, VariableExpr> classMemberVarExprs,
365-
VariableExpr requestVarExpr,
366-
Message requestMessage,
367-
List<VariableExpr> argExprs) {
367+
VariableExpr requestVarExpr, // Nullable
368+
Message requestMessage) {
368369
List<Expr> methodExprs = new ArrayList<>();
369370
List<Statement> methodStatements = new ArrayList<>();
370371

@@ -435,71 +436,33 @@ protected List<Statement> constructRpcTestCheckerLogic(
435436
Preconditions.checkNotNull(requestVarExpr);
436437
Preconditions.checkNotNull(requestMessage);
437438
for (Field field : requestMessage.fields()) {
438-
String fieldGetterMethodNamePatternTemp = "get%s";
439-
if (field.isRepeated()) {
440-
fieldGetterMethodNamePatternTemp = field.isMap() ? "get%sMap" : "get%sList";
441-
}
442-
final String fieldGetterMethodNamePattern = fieldGetterMethodNamePatternTemp;
443-
Function<VariableExpr, Expr> checkExprFn =
444-
v ->
445-
MethodInvocationExpr.builder()
446-
.setExprReferenceExpr(v)
447-
.setMethodName(
448-
String.format(
449-
fieldGetterMethodNamePattern, JavaStyle.toUpperCamelCase(field.name())))
450-
.build();
451-
Expr expectedFieldExpr = checkExprFn.apply(requestVarExpr);
452-
Expr actualFieldExpr = checkExprFn.apply(actualRequestVarExpr);
453-
List<Expr> assertEqualsArguments = new ArrayList<>();
454-
assertEqualsArguments.add(expectedFieldExpr);
455-
assertEqualsArguments.add(actualFieldExpr);
456-
if (TypeNode.isFloatingPointType(field.type())) {
457-
boolean isFloat = field.type().equals(TypeNode.FLOAT);
458-
assertEqualsArguments.add(
459-
ValueExpr.withValue(
460-
PrimitiveValue.builder()
461-
.setType(isFloat ? TypeNode.FLOAT : TypeNode.DOUBLE)
462-
.setValue(String.format("0.0001%s", isFloat ? "f" : ""))
463-
.build()));
464-
}
465-
methodExprs.add(
466-
MethodInvocationExpr.builder()
467-
.setStaticReferenceType(FIXED_TYPESTORE.get("Assert"))
468-
.setMethodName("assertEquals")
469-
.setArguments(assertEqualsArguments)
470-
.build());
439+
Expr expectedFieldExpr = createGetter(requestVarExpr, field);
440+
Expr actualFieldExpr = createGetter(actualRequestVarExpr, field);
441+
methodExprs.add(createAssertEquals(expectedFieldExpr, actualFieldExpr, field.type()));
471442
}
472443
} else {
473-
for (VariableExpr argVarExpr : argExprs) {
474-
Variable variable = argVarExpr.variable();
475-
String fieldGetterMethodNamePattern = "get%s";
476-
if (LIST_TYPE.isSupertypeOrEquals(variable.type())) {
477-
fieldGetterMethodNamePattern = "get%sList";
478-
} else if (MAP_TYPE.isSupertypeOrEquals(variable.type())) {
479-
fieldGetterMethodNamePattern = "get%sMap";
444+
for (MethodArgument arg : methodSignature) {
445+
Expr root = actualRequestVarExpr;
446+
for (Field field : arg.nestedFields()) {
447+
root = createGetter(root, field);
480448
}
481-
Expr actualFieldExpr =
482-
MethodInvocationExpr.builder()
483-
.setExprReferenceExpr(actualRequestVarExpr)
484-
.setMethodName(
485-
String.format(
486-
fieldGetterMethodNamePattern,
487-
JavaStyle.toUpperCamelCase(variable.identifier().name())))
488-
.build();
489-
Expr expectedFieldExpr = argVarExpr;
490-
if (RESOURCE_NAME_TYPE.isSupertypeOrEquals(argVarExpr.type())) {
449+
MethodInvocationExpr actual = createGetter(root, arg.field());
450+
451+
Expr expectedFieldExpr =
452+
VariableExpr.withVariable(
453+
Variable.builder()
454+
.setName(JavaStyle.toLowerCamelCase(arg.name()))
455+
.setType(arg.type())
456+
.build());
457+
if (RESOURCE_NAME_TYPE.isSupertypeOrEquals(arg.type())) {
491458
expectedFieldExpr =
492459
MethodInvocationExpr.builder()
493-
.setExprReferenceExpr(argVarExpr)
460+
.setExprReferenceExpr(expectedFieldExpr)
494461
.setMethodName("toString")
495462
.build();
496463
}
497-
methodExprs.add(
498-
MethodInvocationExpr.builder()
499-
.setStaticReferenceType(FIXED_TYPESTORE.get("Assert"))
500-
.setMethodName("assertEquals")
501-
.setArguments(expectedFieldExpr, actualFieldExpr)
502-
.build());
464+
465+
methodExprs.add(createAssertEquals(expectedFieldExpr, actual, arg.type()));
503466
}
504467
}
505468

@@ -533,6 +496,49 @@ protected List<Statement> constructRpcTestCheckerLogic(
533496
return methodStatements;
534497
}
535498

499+
private static MethodInvocationExpr createAssertEquals(
500+
Expr expected, Expr actual, TypeNode type) {
501+
502+
ArrayList<Expr> assertionArgs = new ArrayList<>();
503+
assertionArgs.add(expected);
504+
assertionArgs.add(actual);
505+
506+
if (TypeNode.isFloatingPointType(type)) {
507+
boolean isFloat = type.equals(TypeNode.FLOAT);
508+
assertionArgs.add(
509+
ValueExpr.withValue(
510+
PrimitiveValue.builder()
511+
.setType(isFloat ? TypeNode.FLOAT : TypeNode.DOUBLE)
512+
.setValue(String.format("0.0001%s", isFloat ? "f" : ""))
513+
.build()));
514+
}
515+
516+
return MethodInvocationExpr.builder()
517+
.setStaticReferenceType(FIXED_TYPESTORE.get("Assert"))
518+
.setMethodName("assertEquals")
519+
.setArguments(assertionArgs)
520+
.build();
521+
}
522+
523+
private static MethodInvocationExpr createGetter(Expr exprReference, Field field) {
524+
return MethodInvocationExpr.builder()
525+
.setExprReferenceExpr(exprReference)
526+
.setMethodName(
527+
String.format(
528+
createGetterNamePattern(field.type()), JavaStyle.toUpperCamelCase(field.name())))
529+
.build();
530+
}
531+
532+
private static String createGetterNamePattern(TypeNode type) {
533+
String fieldGetterMethodNamePattern = "get%s";
534+
if (LIST_TYPE.isSupertypeOrEquals(type)) {
535+
fieldGetterMethodNamePattern = "get%sList";
536+
} else if (MAP_TYPE.isSupertypeOrEquals(type)) {
537+
fieldGetterMethodNamePattern = "get%sMap";
538+
}
539+
return fieldGetterMethodNamePattern;
540+
}
541+
536542
@Override
537543
protected MethodDefinition createStreamingRpcTestMethod(
538544
Service service,

src/main/java/com/google/api/generator/gapic/composer/rest/ServiceClientTestClassComposer.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@
6060
import java.util.stream.Collectors;
6161

6262
public class ServiceClientTestClassComposer extends AbstractServiceClientTestClassComposer {
63+
6364
private static final String MOCK_SERVICE_VAR_NAME = "mockService";
6465

6566
private static final ServiceClientTestClassComposer INSTANCE =
@@ -297,12 +298,12 @@ protected MethodDefinition createTearDownMethod(
297298
@Override
298299
protected List<Statement> constructRpcTestCheckerLogic(
299300
Method method,
301+
List<MethodArgument> methodSignature,
300302
Service service,
301303
boolean isRequestArg,
302304
Map<String, VariableExpr> classMemberVarExprs,
303305
VariableExpr requestVarExpr,
304-
Message requestMessage,
305-
List<VariableExpr> argExprs) {
306+
Message requestMessage) {
306307

307308
VariableExpr actualRequestsVarExpr =
308309
VariableExpr.withVariable(

0 commit comments

Comments
 (0)