diff options
author | Jens Nyman <jnyman@google.com> | 2024-04-25 12:05:08 +0000 |
---|---|---|
committer | Jens Nyman <jnyman@google.com> | 2024-04-25 12:05:08 +0000 |
commit | 95395415fdbef966f37cc2d7bc5939eacadb2df8 (patch) | |
tree | b8d35b70125495c65d9981a1435010222df55234 | |
parent | e7f3d29c6482b230d3c6afa94684291249e49d71 (diff) | |
download | TestParameterInjector-95395415fdbef966f37cc2d7bc5939eacadb2df8.tar.gz |
Support protobuf enum aliases by allowing the parsing of static fields on the enum
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) { |