From bc9f2a745136f7ad0dd4dbab3a274fc530329e12 Mon Sep 17 00:00:00 2001 From: Andreas Isler Date: Thu, 27 Nov 2025 17:40:26 +0100 Subject: [PATCH] Added __N_A for negative tests --- .../example/parser/FlowableExcelMapper.java | 52 ++++++----- .../parser/FlowableExcelMapperTest.java | 82 ++++++++++++------ .../flowableExcelMapperTestData.xlsx | Bin 13433 -> 0 bytes .../flowableExcelMapperTestData_fail.xlsx | Bin 0 -> 16582 bytes .../flowableExcelMapperTestData_ok.xlsx | Bin 0 -> 16443 bytes 5 files changed, 86 insertions(+), 48 deletions(-) delete mode 100644 src/test/resources/flowableExcelMapperTestData.xlsx create mode 100644 src/test/resources/flowableExcelMapperTestData_fail.xlsx create mode 100644 src/test/resources/flowableExcelMapperTestData_ok.xlsx diff --git a/src/main/java/com/example/parser/FlowableExcelMapper.java b/src/main/java/com/example/parser/FlowableExcelMapper.java index b28515e..3a54ca0 100644 --- a/src/main/java/com/example/parser/FlowableExcelMapper.java +++ b/src/main/java/com/example/parser/FlowableExcelMapper.java @@ -62,7 +62,7 @@ public class FlowableExcelMapper { // The 1st row contains the paths paths.addAll(rows.get(rowNum)); } else if (rowNum == 1) { - // The 1st row contains the types of the variables + // The 2nd row contains the types of the variables types.addAll(rows.get(rowNum)); } else { // All other rows contain the values of the variables @@ -75,29 +75,41 @@ public class FlowableExcelMapper { protected JsonNode rowToJsonNode(ArrayList types, ArrayList paths, ArrayList row, JsonNode jsonNode) { for (int cellNum = 0; cellNum < row.size(); cellNum++) { String cellValue = row.get(cellNum); + // Empty cells are not added to node if (cellValue != null && !cellValue.isEmpty()) { String type = types.get(cellNum); Object content; - switch (type) { - case "String": content = cellValue; break; - case "Boolean": content = Boolean.parseBoolean(cellValue); break; - case "Integer": content = Integer.parseInt(cellValue); break; - case "Double": content = Double.parseDouble(cellValue); break; - case "Long": content = Long.parseLong(cellValue); break; - case "Date": - // Excel considers dates as local dates, but we want them as UTC - Instant instant; - try { - LocalDateTime localDateTime = LocalDateTime.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); - instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant(); - } catch (DateTimeParseException e) { - LocalDate localDate = LocalDate.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd")); - instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant(); - } - content = instant.plusSeconds(ZonedDateTime.now().getOffset().getTotalSeconds()); - break; + switch (cellValue) { + case "__NULL": content = null; break; + case "__N_A": content = "__N_A"; break; default: - throw new RuntimeException("Variable type not supported: " + type); + switch (type) { + case "String": + switch (cellValue) { + case "__EMPTY": content = ""; break; + case "__BLANK": content = " "; break; + default: content = cellValue; + } + break; + case "Boolean": content = Boolean.parseBoolean(cellValue); break; + case "Integer": content = Integer.parseInt(cellValue); break; + case "Double": content = Double.parseDouble(cellValue); break; + case "Long": content = Long.parseLong(cellValue); break; + case "Date": + // Excel considers dates as local dates, but we want them as UTC + Instant instant; + try { + LocalDateTime localDateTime = LocalDateTime.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")); + instant = localDateTime.atZone(ZoneId.systemDefault()).toInstant(); + } catch (DateTimeParseException e) { + LocalDate localDate = LocalDate.parse(cellValue, DateTimeFormatter.ofPattern("yyyy-MM-dd")); + instant = localDate.atStartOfDay(ZoneId.systemDefault()).toInstant(); + } + content = instant.plusSeconds(ZonedDateTime.now().getOffset().getTotalSeconds()); + break; + default: + throw new RuntimeException("Variable type not supported: " + type); + } } jsonNode = addNode(jsonNode, paths.get(cellNum), content); } diff --git a/src/test/java/com/example/parser/FlowableExcelMapperTest.java b/src/test/java/com/example/parser/FlowableExcelMapperTest.java index 0351650..2443988 100644 --- a/src/test/java/com/example/parser/FlowableExcelMapperTest.java +++ b/src/test/java/com/example/parser/FlowableExcelMapperTest.java @@ -23,34 +23,39 @@ class FlowableExcelMapperTest { @Autowired private FlowableExcelMapper flowableExcelMapper; + protected static final Logger logger = LoggerFactory.getLogger(FlowableExcelMapperTest.class); + public boolean isSubset(JsonNode root, JsonNode test) { // If test is null, it is always a subset of root if (test == null) { return true; } - // If root is null, but test is not, test is not a subset of root - if (root == null) { - return false; - } // If test is a value node, compare values if (test.isValueNode()) { + if (test.isTextual() && "__N_A".equals(test.asText())) { + return false; + } + if (root == null) { + return false; + } return root.isValueNode() && root.asText().equals(test.asText()); } // If test is an array node, check if all elements of test exist in root if(test.isArray()){ - if (!root.isArray() || test.size() > root.size()) { - return false; - } - for (JsonNode rootElement : test) { - boolean found = false; - for (JsonNode testElement : root) { - if (isSubset(testElement, rootElement)) { - found = true; - break; - } + for (int i = 0; i < test.size(); i++) { + JsonNode testElement = test.get(i); + JsonNode rootElement = null; + if (root != null) { + rootElement = root.get(i); } - if (!found) { + if (testElement.isTextual() && "__N_A".equals(testElement.asText())) { + if (rootElement != null && !rootElement.isNull()) { + return false; + } + continue; + } + if (!isSubset(rootElement, testElement)) { return false; } } @@ -58,12 +63,20 @@ class FlowableExcelMapperTest { } // If test is an object node, check if all fields in test exist in root if (test.isObject()){ - if (!root.isObject()){ - return false; - } for (Iterator iterator = test.fieldNames(); iterator.hasNext(); ) { String fieldName = iterator.next(); - if (!root.has(fieldName) || !isSubset(root.get(fieldName), test.get(fieldName))){ + JsonNode testValue = test.get(fieldName); + JsonNode rootValue = null; + if (root != null) { + rootValue = root.get(fieldName); + } + if (testValue.isTextual() && "__N_A".equals(testValue.asText())) { + if (rootValue != null && !rootValue.isNull()) { + return false; + } + continue; + } + if (!isSubset(rootValue, testValue)){ return false; } } @@ -84,16 +97,29 @@ class FlowableExcelMapperTest { return argumentList.stream(); } - protected Stream excelMapperTestData() { - return getArgumentsFromExcel("flowableExcelMapperTestData.xlsx"); + protected Stream excelMapperTestDataOk() { + return getArgumentsFromExcel("flowableExcelMapperTestData_ok.xlsx"); } @ParameterizedTest - @MethodSource("excelMapperTestData") - public void excelMapperTest(JsonNode row) { - JsonNode asIs = row.get("root"); - JsonNode toBe = row.get("test"); - //logger.info("{}root={}{}test={}", System.lineSeparator(), asIs, System.lineSeparator(), toBe); - Assertions.assertThat(isSubset(asIs, toBe)) - .withFailMessage(System.lineSeparator() + "root=" + asIs + System.lineSeparator() + "test=" + toBe).isTrue(); + @MethodSource("excelMapperTestDataOk") + public void excelMapperTestOk(JsonNode row) { + JsonNode root = row.get("root"); + JsonNode test = row.get("test"); + logger.info("{}root={}{}test={}", System.lineSeparator(), root, System.lineSeparator(), test); + Assertions.assertThat(isSubset(root, test)) + .withFailMessage(System.lineSeparator() + "root=" + root + System.lineSeparator() + "test=" + test).isTrue(); + } + + protected Stream excelMapperTestDataFail() { + return getArgumentsFromExcel("flowableExcelMapperTestData_fail.xlsx"); + } + @ParameterizedTest + @MethodSource("excelMapperTestDataFail") + public void excelMapperTestFail(JsonNode row) { + JsonNode root = row.get("root"); + JsonNode test = row.get("test"); + logger.info("{}root={}{}test={}", System.lineSeparator(), root, System.lineSeparator(), test); + Assertions.assertThat(isSubset(root, test)) + .withFailMessage(System.lineSeparator() + "root=" + root + System.lineSeparator() + "test=" + test).isFalse(); } } diff --git a/src/test/resources/flowableExcelMapperTestData.xlsx b/src/test/resources/flowableExcelMapperTestData.xlsx deleted file mode 100644 index b36a75f6fdf5d222541953b56e333ad2211eb629..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13433 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 o=kI2I588kJ9fizbVE(^b diff --git a/src/test/resources/flowableExcelMapperTestData_fail.xlsx b/src/test/resources/flowableExcelMapperTestData_fail.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..498685b1b218f195820b2126c976d749e2ad62f1 GIT binary patch literal 16582 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
    =)WiU0fQ9D$&HeA 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 literal 0 HcmV?d00001 diff --git a/src/test/resources/flowableExcelMapperTestData_ok.xlsx b/src/test/resources/flowableExcelMapperTestData_ok.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5c830ba6607e7e6d72966ed3e08fb7d6a9a1996c GIT binary patch literal 16443 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 fVafpj@Nbr4SqV_EkN1Lq|5