From f8ee09c97a6a20cc791d6eeccf2ce928e5b4e8d7 Mon Sep 17 00:00:00 2001 From: Andreas Isler Date: Tue, 25 Nov 2025 05:58:25 +0100 Subject: [PATCH] Added isSubset for testing nodes --- .../example/parser/FlowableExcelMapper.java | 49 ++++++++++++++++++ .../parser/FlowableExcelMapperTest.java | 8 ++- .../flowableExcelMapperTestData.xlsx | Bin 9034 -> 9733 bytes 3 files changed, 55 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/parser/FlowableExcelMapper.java b/src/main/java/com/example/parser/FlowableExcelMapper.java index e2a5ee1..14246c1 100644 --- a/src/main/java/com/example/parser/FlowableExcelMapper.java +++ b/src/main/java/com/example/parser/FlowableExcelMapper.java @@ -175,4 +175,53 @@ public class FlowableExcelMapper { } return -1; } + + public boolean isSubset(JsonNode asIs, JsonNode toBe) { + // If toBe is null, it is always a subset + if (toBe == null) { + return true; + } + // If asIs is null, but toBe is not, toBe is not a subset + if (asIs == null) { + return false; + } + // If toBo is a value node, compare values + if (toBe.isValueNode()) { + return asIs.isValueNode() && asIs.asText().equals(toBe.asText()); + } + // If toBe is an array node, check is all elements of toBe exist in asIs + if(toBe.isArray()){ + if (!asIs.isArray() || toBe.size() > asIs.size()) { + return false; + } + for (JsonNode toBeElement : toBe) { + boolean found = false; + for (JsonNode asIsElement : asIs) { + if (isSubset(asIsElement, toBeElement)) { + found = true; + break; + } + } + if (!found) { + return false; + } + } + return true; + } + // If toBe is an object node, check if all fields in toBe exist in asIs + if (toBe.isObject()){ + if (!asIs.isObject()){ + return false; + } + for (Iterator iterator = toBe.fieldNames(); iterator.hasNext(); ) { + String fieldName = iterator.next(); + if (!asIs.has(fieldName) || !isSubset(asIs.get(fieldName), toBe.get(fieldName))){ + return false; + } + } + return true; + } + // If none of the above matches, return false + return false; + } } diff --git a/src/test/java/com/example/parser/FlowableExcelMapperTest.java b/src/test/java/com/example/parser/FlowableExcelMapperTest.java index 035c9a1..415cc8d 100644 --- a/src/test/java/com/example/parser/FlowableExcelMapperTest.java +++ b/src/test/java/com/example/parser/FlowableExcelMapperTest.java @@ -1,6 +1,7 @@ package com.example.parser; import com.fasterxml.jackson.databind.JsonNode; +import org.assertj.core.api.Assertions; import org.junit.jupiter.api.TestInstance; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; @@ -40,7 +41,10 @@ class FlowableExcelMapperTest { } @ParameterizedTest @MethodSource("excelMapperTestData") - public void excelMapperTest(JsonNode sheet) { - logger.info("node2={}{}", System.lineSeparator(), sheet.toPrettyString()); + public void excelMapperTest(JsonNode row) { + JsonNode asIs = row.get("root"); + JsonNode toBe = row.get("test"); + logger.info("{}asIs= {}{}toBe= {}{}", System.lineSeparator(), asIs.toPrettyString(), System.lineSeparator(), toBe.toPrettyString(), System.lineSeparator()); + Assertions.assertThat(flowableExcelMapper.isSubset(asIs, toBe)).isTrue(); } } diff --git a/src/test/resources/flowableExcelMapperTestData.xlsx b/src/test/resources/flowableExcelMapperTestData.xlsx index cdb53f0e6bbe4f662b2a92b93e2303ac1e0c7819..0cd15195ea8b800f40f10bd3cca645172bde4dbf 100644 GIT binary patch delta 5948 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 W8NU0l{xJsGl36)8@$!Mceg6T=*4bJB delta 5357 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