From 517190c15a5a1c9d20778a4f1f7715195f8ef5d9 Mon Sep 17 00:00:00 2001 From: sebastianMindee Date: Mon, 6 Jan 2025 13:30:22 +0100 Subject: [PATCH 1/3] :bug: add missing boolean field accessor for generated objects --- .../parsing/generated/GeneratedObject.java | 23 +++++++++++++++++++ .../product/generated/GeneratedV1Test.java | 17 ++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/main/java/com/mindee/parsing/generated/GeneratedObject.java b/src/main/java/com/mindee/parsing/generated/GeneratedObject.java index 8165f46d3..67490ee98 100644 --- a/src/main/java/com/mindee/parsing/generated/GeneratedObject.java +++ b/src/main/java/com/mindee/parsing/generated/GeneratedObject.java @@ -3,6 +3,7 @@ import com.mindee.geometry.Polygon; import com.mindee.geometry.PolygonUtils; import com.mindee.parsing.standard.AmountField; +import com.mindee.parsing.standard.BooleanField; import com.mindee.parsing.standard.ClassificationField; import com.mindee.parsing.standard.DateField; import com.mindee.parsing.standard.StringField; @@ -17,6 +18,7 @@ public class GeneratedObject extends HashMap { /** * Represent the object as a standard {@link StringField}. + * @return A {@link StringField} containing a string value. */ public StringField asStringField() { return new StringField( @@ -30,6 +32,7 @@ public StringField asStringField() { /** * Represent the object as a standard {@link AmountField}. + * @return An {@link AmountField} containing a double value. */ public AmountField asAmountField() { Double value; @@ -51,8 +54,21 @@ else if (rawValue instanceof Double) { ); } + /** + * Represent the object as a standard {@link BooleanField}. + * @return A {@link BooleanField} containing a boolean value. + */ + public BooleanField asBooleanField() { + Object rawValue = this.get("value"); + if (rawValue instanceof Boolean) { + return new BooleanField((Boolean)rawValue, this.getConfidence(), this.getPolygon(), this.getPageId()); + } + throw new ClassCastException("Cannot cast " + rawValue + " to Boolean"); + } + /** * Represent the object as a standard {@link DateField}. + * @return A {@link DateField} containing a date value. */ public DateField asDateField() { return new DateField( @@ -66,6 +82,7 @@ public DateField asDateField() { /** * Represent the object as a standard {@link ClassificationField}. + * @return A {@link ClassificationField} containing a string value. */ public ClassificationField asClassificationField() { return new ClassificationField( @@ -75,6 +92,7 @@ public ClassificationField asClassificationField() { /** * Get the polygon, if present. + * @return A {@link Polygon}. */ public Polygon getPolygon() { return this.getAsPolygon("polygon"); @@ -82,6 +100,8 @@ public Polygon getPolygon() { /** * Get the specified key as a {@link Polygon} object. + * @param key Key to retrieve the polygon from. + * @return A {@link Polygon}. */ public Polygon getAsPolygon(String key) { if (this.containsKey(key)) { @@ -92,6 +112,7 @@ public Polygon getAsPolygon(String key) { /** * Get the page ID, if present. + * @return A page ID, as an integer. */ public Integer getPageId() { return this.get("page_id") != null ? (Integer) this.get("page_id") : null; @@ -99,6 +120,7 @@ public Integer getPageId() { /** * Get the confidence score, if present. + * @return The confidence score, as a double. */ public Double getConfidence() { return this.get("confidence") != null ? (Double) this.get("confidence") : null; @@ -106,6 +128,7 @@ public Double getConfidence() { /** * Get the information on whether the date field was extracted. + * @return A boolean representation of the field. */ public Boolean getIsComputed(){ return (Boolean) this.get("is_computed"); diff --git a/src/test/java/com/mindee/product/generated/GeneratedV1Test.java b/src/test/java/com/mindee/product/generated/GeneratedV1Test.java index e8f1c8067..6bf944c0f 100644 --- a/src/test/java/com/mindee/product/generated/GeneratedV1Test.java +++ b/src/test/java/com/mindee/product/generated/GeneratedV1Test.java @@ -7,6 +7,7 @@ import com.mindee.parsing.generated.GeneratedFeature; import com.mindee.parsing.generated.GeneratedObject; import com.mindee.parsing.standard.AmountField; +import com.mindee.parsing.standard.BooleanField; import com.mindee.parsing.standard.ClassificationField; import com.mindee.parsing.standard.DateField; import com.mindee.parsing.standard.StringField; @@ -260,4 +261,20 @@ void whenAmountDeserialized_mustCastToDouble() { doubleObject.put("value", "I will fail miserably"); Assertions.assertThrows(ClassCastException.class, badStringObject::asAmountField); } + + void whenBooleanDeserialized_mustCastToBoolean() { + GeneratedObject boolObject = new GeneratedObject(); + boolObject.put("value", true); + BooleanField booleanField = boolObject.asBooleanField(); + Assertions.assertEquals(true, booleanField.getValue()); + + boolObject.put("value", false); + booleanField = boolObject.asBooleanField(); + Assertions.assertEquals(true, booleanField.getValue()); + + + boolObject.put("value", null); + booleanField = boolObject.asBooleanField(); + Assertions.assertNull(booleanField.getValue()); + } } From 1430266003c14e2364547ca06442a2b5af61a5bd Mon Sep 17 00:00:00 2001 From: sebastianMindee Date: Mon, 6 Jan 2025 13:32:33 +0100 Subject: [PATCH 2/3] fix lint --- src/main/java/com/mindee/parsing/generated/GeneratedObject.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/mindee/parsing/generated/GeneratedObject.java b/src/main/java/com/mindee/parsing/generated/GeneratedObject.java index 67490ee98..33d06ad77 100644 --- a/src/main/java/com/mindee/parsing/generated/GeneratedObject.java +++ b/src/main/java/com/mindee/parsing/generated/GeneratedObject.java @@ -61,7 +61,7 @@ else if (rawValue instanceof Double) { public BooleanField asBooleanField() { Object rawValue = this.get("value"); if (rawValue instanceof Boolean) { - return new BooleanField((Boolean)rawValue, this.getConfidence(), this.getPolygon(), this.getPageId()); + return new BooleanField((Boolean) rawValue, this.getConfidence(), this.getPolygon(), this.getPageId()); } throw new ClassCastException("Cannot cast " + rawValue + " to Boolean"); } From 0a73c95fa29da7e3ca13df420de7b417a00b15eb Mon Sep 17 00:00:00 2001 From: sebastianMindee Date: Mon, 6 Jan 2025 16:07:12 +0100 Subject: [PATCH 3/3] add accessors & test --- .../parsing/generated/GeneratedFeature.java | 16 ++++++++ .../product/generated/GeneratedV1Test.java | 40 ++++++++++++++----- 2 files changed, 45 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/mindee/parsing/generated/GeneratedFeature.java b/src/main/java/com/mindee/parsing/generated/GeneratedFeature.java index 292eb921e..56a4da469 100644 --- a/src/main/java/com/mindee/parsing/generated/GeneratedFeature.java +++ b/src/main/java/com/mindee/parsing/generated/GeneratedFeature.java @@ -2,6 +2,7 @@ import com.mindee.MindeeException; import com.mindee.parsing.standard.AmountField; +import com.mindee.parsing.standard.BooleanField; import com.mindee.parsing.standard.ClassificationField; import com.mindee.parsing.standard.DateField; import com.mindee.parsing.standard.StringField; @@ -34,6 +35,7 @@ public class GeneratedFeature extends ArrayList { /** * Whether the original feature is a list. + * @param isList Whether the feature is a list. */ public GeneratedFeature(boolean isList) { this.isList = isList; @@ -42,6 +44,7 @@ public GeneratedFeature(boolean isList) { /** * Represent the feature as a standard {@link StringField}. * Only works for non-list features. + * @return An instance of a {@link StringField}. */ public StringField asStringField() { if (this.isList) { @@ -50,9 +53,20 @@ public StringField asStringField() { return this.get(0).asStringField(); } + /** + * @return An instance of a {@link BooleanField}. + */ + public BooleanField asBooleanField() { + if (this.isList) { + throw new MindeeException("Cannot convert a list feature into a BooleanField."); + } + return this.get(0).asBooleanField(); + } + /** * Represent the feature as a standard {@link AmountField}. * Only works for non-list features. + * @return An instance of a {@link AmountField}. */ public AmountField asAmountField() { if (this.isList) { @@ -64,6 +78,7 @@ public AmountField asAmountField() { /** * Represent the feature as a standard {@link DateField}. * Only works for non-list features. + * @return An instance of a {@link DateField}. */ public DateField asDateField() { if (this.isList) { @@ -75,6 +90,7 @@ public DateField asDateField() { /** * Represent the feature as a standard {@link ClassificationField}. * Only works for non-list features. + * @return An instance of a {@link ClassificationField}. */ public ClassificationField asClassificationField() { if (this.isList) { diff --git a/src/test/java/com/mindee/product/generated/GeneratedV1Test.java b/src/test/java/com/mindee/product/generated/GeneratedV1Test.java index 6bf944c0f..096a164c3 100644 --- a/src/test/java/com/mindee/product/generated/GeneratedV1Test.java +++ b/src/test/java/com/mindee/product/generated/GeneratedV1Test.java @@ -25,12 +25,26 @@ protected AsyncPredictResponse getAsyncPrediction(String name) thro objectMapper.findAndRegisterModules(); JavaType type = objectMapper.getTypeFactory().constructParametricType( - AsyncPredictResponse.class, - GeneratedV1.class + AsyncPredictResponse.class, + GeneratedV1.class ); return objectMapper.readValue( - new File("src/test/resources/products/generated/response_v1/" + name + "_international_id_v1.json"), - type + new File("src/test/resources/products/generated/response_v1/" + name + "_international_id_v1.json"), + type + ); + } + + protected AsyncPredictResponse getUsMailPrediction() throws IOException { + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.findAndRegisterModules(); + + JavaType type = objectMapper.getTypeFactory().constructParametricType( + AsyncPredictResponse.class, + GeneratedV1.class + ); + return objectMapper.readValue( + new File("src/test/resources/products/us_mail/response_v3/complete.json"), + type ); } @@ -245,6 +259,14 @@ else if (featureValue.isList()) { } } + @Test + void whenCompleteDeserializedWithBoolean_mustHaveValidProperties() throws IOException { + AsyncPredictResponse response = getUsMailPrediction(); + GeneratedV1Document docPrediction = response.getDocumentObj().getInference().getPrediction(); + Map features = docPrediction.getFields(); + Assertions.assertFalse(features.get("is_return_to_sender").asBooleanField().getValue()); + } + @Test void whenAmountDeserialized_mustCastToDouble() { GeneratedObject intObject = new GeneratedObject(); @@ -262,19 +284,15 @@ void whenAmountDeserialized_mustCastToDouble() { Assertions.assertThrows(ClassCastException.class, badStringObject::asAmountField); } + @Test void whenBooleanDeserialized_mustCastToBoolean() { GeneratedObject boolObject = new GeneratedObject(); boolObject.put("value", true); BooleanField booleanField = boolObject.asBooleanField(); - Assertions.assertEquals(true, booleanField.getValue()); + Assertions.assertTrue(booleanField.getValue()); boolObject.put("value", false); booleanField = boolObject.asBooleanField(); - Assertions.assertEquals(true, booleanField.getValue()); - - - boolObject.put("value", null); - booleanField = boolObject.asBooleanField(); - Assertions.assertNull(booleanField.getValue()); + Assertions.assertFalse(booleanField.getValue()); } }