test: colliding property names with CASE_INSENSITVE
diff --git a/src/test/java/org/eclipse/yasson/internal/model/customization/naming/PropertyNamingStrategyTest.java b/src/test/java/org/eclipse/yasson/internal/model/customization/naming/PropertyNamingStrategyTest.java index d282097..00419b4 100644 --- a/src/test/java/org/eclipse/yasson/internal/model/customization/naming/PropertyNamingStrategyTest.java +++ b/src/test/java/org/eclipse/yasson/internal/model/customization/naming/PropertyNamingStrategyTest.java
@@ -19,6 +19,7 @@ import jakarta.json.bind.Jsonb; import jakarta.json.bind.JsonbBuilder; import jakarta.json.bind.JsonbConfig; +import jakarta.json.bind.JsonbException; import jakarta.json.bind.annotation.JsonbCreator; import jakarta.json.bind.annotation.JsonbProperty; import jakarta.json.bind.config.PropertyNamingStrategy; @@ -164,4 +165,64 @@ assertEquals("def", result._startingWithUnderscoreProperty); assertEquals("ghi", result.CAPS_UNDERSCORE_PROPERTY); } + + // ----- CASE_INSENSITIVE collision tests ----- + + public static class CollidingPojo { + public String foo; + public String FOO; + } + + @Test + public void testCaseInsensitivePojoCollisionThrows() throws Exception { + try (Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.CASE_INSENSITIVE))) { + JsonbException ex = assertThrows(JsonbException.class, () -> jsonb.fromJson("{\"foo\":\"a\"}", CollidingPojo.class)); + assertAll( + () -> assertTrue(ex.getMessage().contains("foo"), "message should contain first property name 'foo'"), + () -> assertTrue(ex.getMessage().contains("FOO"), "message should contain second property name 'FOO'"), + () -> assertTrue(ex.getMessage().contains(CollidingPojo.class.getName()), "message should contain the class name") + ); + } + } + + public static class CollidingCreator { + private final String firstName; + private final String FIRSTNAME; + + @JsonbCreator + public CollidingCreator(@JsonbProperty("firstName") String firstName, + @JsonbProperty("FIRSTNAME") String FIRSTNAME) { + this.firstName = firstName; + this.FIRSTNAME = FIRSTNAME; + } + + public String getFirstName() { return firstName; } + public String getFIRSTNAME() { return FIRSTNAME; } + } + + @Test + public void testCaseInsensitiveCreatorCollisionThrows() throws Exception { + try (Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.CASE_INSENSITIVE))) { + JsonbException ex = assertThrows(JsonbException.class, () -> jsonb.fromJson("{\"firstName\":\"Ann\"}", CollidingCreator.class)); + assertAll( + () -> assertTrue(ex.getMessage().contains("firstName"), "message should contain first parameter name 'firstName'"), + () -> assertTrue(ex.getMessage().contains("FIRSTNAME"), "message should contain second parameter name 'FIRSTNAME'"), + () -> assertTrue(ex.getMessage().contains(CollidingCreator.class.getName()), "message should contain the class name") + ); + } + } + + public record CollidingRecord(String value, String VALUE) {} + + @Test + public void testCaseInsensitiveRecordCollisionThrows() throws Exception { + try (Jsonb jsonb = JsonbBuilder.create(new JsonbConfig().withPropertyNamingStrategy(PropertyNamingStrategy.CASE_INSENSITIVE))) { + JsonbException ex = assertThrows(JsonbException.class, () -> jsonb.fromJson("{\"value\":\"x\"}", CollidingRecord.class)); + assertAll( + () -> assertTrue(ex.getMessage().contains("value"), "message should contain first component name 'value'"), + () -> assertTrue(ex.getMessage().contains("VALUE"), "message should contain second component name 'VALUE'"), + () -> assertTrue(ex.getMessage().contains(CollidingRecord.class.getName()), "message should contain the class name") + ); + } + } }