From 85af901ea7d7bc6cbdc52952211df76fc290f426 Mon Sep 17 00:00:00 2001 From: Filip Hrisafov Date: Sat, 6 Feb 2021 09:05:40 +0100 Subject: [PATCH] #2350 Generate core string to enum mapping when AnyRemaining or AnyUnmapped is not used --- .../ap/internal/model/ValueMappingMethod.java | 9 +++------ .../string2enum/StringToEnumMappingTest.java | 16 +++++++++++++++- 2 files changed, 18 insertions(+), 7 deletions(-) diff --git a/processor/src/main/java/org/mapstruct/ap/internal/model/ValueMappingMethod.java b/processor/src/main/java/org/mapstruct/ap/internal/model/ValueMappingMethod.java index c26dd5df6..627a4b728 100644 --- a/processor/src/main/java/org/mapstruct/ap/internal/model/ValueMappingMethod.java +++ b/processor/src/main/java/org/mapstruct/ap/internal/model/ValueMappingMethod.java @@ -262,8 +262,8 @@ public class ValueMappingMethod extends MappingMethod { List mappings = new ArrayList<>(); List unmappedSourceConstants = new ArrayList<>( targetType.getEnumConstants() ); boolean sourceErrorOccurred = !reportErrorIfMappedTargetEnumConstantsDontExist( method, targetType ); - boolean mandatoryMissing = !reportErrorIfAnyRemainingOrAnyUnMappedMissing( method ); - if ( sourceErrorOccurred || mandatoryMissing ) { + reportWarningIfAnyRemainingOrAnyUnMappedMissing( method ); + if ( sourceErrorOccurred ) { return mappings; } Set mappedSources = new LinkedHashSet<>(); @@ -344,17 +344,14 @@ public class ValueMappingMethod extends MappingMethod { return !foundIncorrectMapping; } - private boolean reportErrorIfAnyRemainingOrAnyUnMappedMissing(Method method) { - boolean foundIncorrectMapping = false; + private void reportWarningIfAnyRemainingOrAnyUnMappedMissing(Method method) { if ( !( valueMappings.hasMapAnyUnmapped || valueMappings.hasMapAnyRemaining ) ) { ctx.getMessager().printMessage( method.getExecutable(), Message.VALUEMAPPING_ANY_REMAINING_OR_UNMAPPED_MISSING ); - foundIncorrectMapping = true; } - return !foundIncorrectMapping; } private boolean reportErrorIfMappedTargetEnumConstantsDontExist(Method method, Type targetType) { diff --git a/processor/src/test/java/org/mapstruct/ap/test/value/string2enum/StringToEnumMappingTest.java b/processor/src/test/java/org/mapstruct/ap/test/value/string2enum/StringToEnumMappingTest.java index 7bf06ab86..fea8efac1 100644 --- a/processor/src/test/java/org/mapstruct/ap/test/value/string2enum/StringToEnumMappingTest.java +++ b/processor/src/test/java/org/mapstruct/ap/test/value/string2enum/StringToEnumMappingTest.java @@ -16,6 +16,7 @@ import org.mapstruct.ap.testutil.compilation.annotation.ExpectedCompilationOutco import org.mapstruct.ap.testutil.runner.AnnotationProcessorTestRunner; import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; @IssueKey( "1557" ) @WithClasses({ OrderType.class, OrderMapper.class }) @@ -53,7 +54,20 @@ public class StringToEnumMappingTest { "type String to an enum type." ) } ) - public void shouldRaiseErrorWhenUsingAnyRemaining() { + public void shouldRaiseWarningWhenNotUsingAnyRemainingOrAnyUnmapped() { + + assertThatThrownBy( () -> ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( "unknown" ) ) + .isInstanceOf( IllegalArgumentException.class ) + .hasMessage( "Unexpected enum constant: unknown" ); + + assertThat( ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( null ) ) + .isEqualTo( OrderType.STANDARD ); + + assertThat( ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( "STANDARD" ) ) + .isNull(); + + assertThat( ErroneousOrderMapperUsingNoAnyRemainingAndNoAnyUnmapped.INSTANCE.map( "RETAIL" ) ) + .isEqualTo( OrderType.RETAIL ); } }