feat: Add a test related to the challenge https://github.com/jakartaee/jsonb-api/issues/347
Signed-off-by: Jean-Louis Monteiro <jlmonteiro@tomitribe.com>
diff --git a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/polymorphism/JsonbPolymorphismTest.java b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/polymorphism/JsonbPolymorphismTest.java
index e3ebaf7..87d8389 100644
--- a/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/polymorphism/JsonbPolymorphismTest.java
+++ b/johnzon-jsonb/src/test/java/org/apache/johnzon/jsonb/polymorphism/JsonbPolymorphismTest.java
@@ -18,13 +18,22 @@
*/
package org.apache.johnzon.jsonb.polymorphism;
+import jakarta.json.bind.annotation.JsonbCreator;
+import jakarta.json.bind.annotation.JsonbDateFormat;
+import jakarta.json.bind.annotation.JsonbProperty;
import org.apache.johnzon.jsonb.test.JsonbRule;
+import org.hamcrest.CoreMatchers;
import org.junit.Rule;
import org.junit.Test;
import jakarta.json.bind.annotation.JsonbSubtype;
import jakarta.json.bind.annotation.JsonbTypeInfo;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.Locale;
+
+import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
@@ -74,6 +83,23 @@
assertEquals(3, dog.dogAge);
}
+ @Test
+ public void testCreatorDeserialization() {
+ SomeDateType deserialized = jsonb.fromJson("{\"@dateType\":\"constructor\",\"localDate\":\"26-02-2021\"}",
+ SomeDateType.class);
+
+ assertThat("Incorrectly deserialized according to the type information. Expected was DateConstructor instance. "
+ + "Got instance of class " + deserialized.getClass(),
+ deserialized, CoreMatchers.instanceOf(DateConstructor.class));
+
+ final DateTimeFormatter formatter =
+ DateTimeFormatter.ofPattern("dd-MM-yyyy").withLocale(Locale.forLanguageTag("nl-NL"));
+ assertThat("Date isn't the expected one",
+ ((DateConstructor) deserialized).getLocalDate(),
+ CoreMatchers.equalTo(LocalDate.parse("26-02-2021", formatter)));
+
+ }
+
@JsonbTypeInfo(key = "@animal", value = @JsonbSubtype(alias = "dog", type = Dog.class))
public interface Animal {
}
@@ -89,4 +115,25 @@
public static class Labrador extends Dog {
public String labradorName;
}
+
+ @JsonbTypeInfo(key = "@dateType", value = {
+ @JsonbSubtype(alias = "constructor", type = DateConstructor.class)
+ })
+ public interface SomeDateType {
+
+ }
+
+ public static final class DateConstructor implements SomeDateType {
+
+ private LocalDate localDate;
+
+ @JsonbCreator
+ public DateConstructor(@JsonbProperty("localDate") @JsonbDateFormat(value = "dd-MM-yyyy", locale = "nl-NL") LocalDate localDate) {
+ this.localDate = localDate;
+ }
+
+ public LocalDate getLocalDate() {
+ return localDate;
+ }
+ }
}