aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJens Nyman <jnyman@google.com>2024-04-25 12:05:08 +0000
committerJens Nyman <jnyman@google.com>2024-04-25 12:05:08 +0000
commit95395415fdbef966f37cc2d7bc5939eacadb2df8 (patch)
treeb8d35b70125495c65d9981a1435010222df55234
parente7f3d29c6482b230d3c6afa94684291249e49d71 (diff)
downloadTestParameterInjector-95395415fdbef966f37cc2d7bc5939eacadb2df8.tar.gz
Support protobuf enum aliases by allowing the parsing of static fields on the enum
-rw-r--r--junit4/src/main/java/com/google/testing/junit/testparameterinjector/ParameterValueParsing.java31
-rw-r--r--junit5/src/main/java/com/google/testing/junit/testparameterinjector/junit5/ParameterValueParsing.java31
2 files changed, 60 insertions, 2 deletions
diff --git a/junit4/src/main/java/com/google/testing/junit/testparameterinjector/ParameterValueParsing.java b/junit4/src/main/java/com/google/testing/junit/testparameterinjector/ParameterValueParsing.java
index a013ebf..cfd68f8 100644
--- a/junit4/src/main/java/com/google/testing/junit/testparameterinjector/ParameterValueParsing.java
+++ b/junit4/src/main/java/com/google/testing/junit/testparameterinjector/ParameterValueParsing.java
@@ -17,6 +17,7 @@ package com.google.testing.junit.testparameterinjector;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verify;
import static com.google.common.collect.Iterables.getOnlyElement;
import com.google.common.base.CharMatcher;
@@ -29,6 +30,7 @@ import com.google.common.primitives.UnsignedLong;
import com.google.common.reflect.TypeToken;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.lang.reflect.Array;
+import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.math.BigInteger;
import java.nio.charset.Charset;
@@ -49,7 +51,34 @@ final class ParameterValueParsing {
@SuppressWarnings("unchecked")
static <E extends Enum<E>> Enum<?> parseEnum(String str, Class<?> enumType) {
- return Enum.valueOf((Class<E>) enumType, str);
+ try {
+ return Enum.valueOf((Class<E>) enumType, str);
+ } catch (IllegalArgumentException e) {
+ Optional<Enum<?>> enumValue = maybeGetStaticConstant(enumType, str);
+ if (enumValue.isPresent()) {
+ return enumValue.get();
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static Optional<Enum<?>> maybeGetStaticConstant(Class<?> enumType, String fieldName) {
+ verify(enumType.isEnum(), "Given type %s is not a enum.", enumType.getSimpleName());
+ try {
+ Field field = enumType.getField(fieldName);
+ Object valueCandidate = field.get(null);
+ checkArgument(
+ enumType.isInstance(valueCandidate),
+ "The field %s.%s exists, but is not of expected type %s.",
+ enumType.getSimpleName(),
+ fieldName,
+ enumType.getSimpleName());
+ return Optional.of((Enum<?>) valueCandidate);
+ } catch (SecurityException | ReflectiveOperationException e) {
+ return Optional.absent();
+ }
}
static boolean isValidYamlString(String yamlString) {
diff --git a/junit5/src/main/java/com/google/testing/junit/testparameterinjector/junit5/ParameterValueParsing.java b/junit5/src/main/java/com/google/testing/junit/testparameterinjector/junit5/ParameterValueParsing.java
index fc26088..998d284 100644
--- a/junit5/src/main/java/com/google/testing/junit/testparameterinjector/junit5/ParameterValueParsing.java
+++ b/junit5/src/main/java/com/google/testing/junit/testparameterinjector/junit5/ParameterValueParsing.java
@@ -17,6 +17,7 @@ package com.google.testing.junit.testparameterinjector.junit5;
import static com.google.common.base.Preconditions.checkArgument;
import static com.google.common.base.Preconditions.checkNotNull;
import static com.google.common.base.Preconditions.checkState;
+import static com.google.common.base.Verify.verify;
import static com.google.common.collect.Iterables.getOnlyElement;
import com.google.common.base.CharMatcher;
@@ -29,6 +30,7 @@ import com.google.common.primitives.UnsignedLong;
import com.google.common.reflect.TypeToken;
import com.google.errorprone.annotations.CanIgnoreReturnValue;
import java.lang.reflect.Array;
+import java.lang.reflect.Field;
import java.lang.reflect.ParameterizedType;
import java.math.BigInteger;
import java.nio.charset.Charset;
@@ -49,7 +51,34 @@ final class ParameterValueParsing {
@SuppressWarnings("unchecked")
static <E extends Enum<E>> Enum<?> parseEnum(String str, Class<?> enumType) {
- return Enum.valueOf((Class<E>) enumType, str);
+ try {
+ return Enum.valueOf((Class<E>) enumType, str);
+ } catch (IllegalArgumentException e) {
+ Optional<Enum<?>> enumValue = maybeGetStaticConstant(enumType, str);
+ if (enumValue.isPresent()) {
+ return enumValue.get();
+ } else {
+ throw e;
+ }
+ }
+ }
+
+ @SuppressWarnings("unchecked")
+ private static Optional<Enum<?>> maybeGetStaticConstant(Class<?> enumType, String fieldName) {
+ verify(enumType.isEnum(), "Given type %s is not a enum.", enumType.getSimpleName());
+ try {
+ Field field = enumType.getField(fieldName);
+ Object valueCandidate = field.get(null);
+ checkArgument(
+ enumType.isInstance(valueCandidate),
+ "The field %s.%s exists, but is not of expected type %s.",
+ enumType.getSimpleName(),
+ fieldName,
+ enumType.getSimpleName());
+ return Optional.of((Enum<?>) valueCandidate);
+ } catch (SecurityException | ReflectiveOperationException e) {
+ return Optional.absent();
+ }
}
static boolean isValidYamlString(String yamlString) {