From 2d45427b8fd888beceb1a750d9568752e0188cb9 Mon Sep 17 00:00:00 2001 From: dotasek Date: Fri, 6 May 2022 16:01:46 -0400 Subject: [PATCH 1/3] Better error reporting for unexpected exceptions in test --- .../java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java index 101050f17..d1ab798fa 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java @@ -1,6 +1,7 @@ package org.hl7.fhir.r5.test; import static org.junit.Assert.assertTrue; +import static org.junit.jupiter.api.Assertions.fail; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; @@ -101,7 +102,8 @@ public class FHIRMappingLanguageTests { new org.hl7.fhir.r5.elementmodel.XmlParser(context).compose(element, s, IParser.OutputStyle.PRETTY, null); context.dropResource(r); } catch (Exception e) { - assertTrue(e.getMessage(), false); + e.printStackTrace(); + fail(e.getMessage()); } if (output.endsWith("json")) { msg = CompareUtilities.checkJsonSrcIsSame(s.toString(), outputJson); From cd7142faa1fc7d8445aae3af22231ec981dcb5c3 Mon Sep 17 00:00:00 2001 From: dotasek Date: Wed, 11 May 2022 12:01:23 -0400 Subject: [PATCH 2/3] Repair output of GraphQL response to include only idPart (#808) * Repair output of GraphQL response to include only idPart * Fix for breaking test. Co-authored-by: dotasek --- .../org/hl7/fhir/r5/utils/GraphQLEngine.java | 22 +++++-------------- 1 file changed, 6 insertions(+), 16 deletions(-) diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java index fb0d8aeb8..277b9321f 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/GraphQLEngine.java @@ -2,10 +2,7 @@ package org.hl7.fhir.r5.utils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; /* Copyright (c) 2011+, HL7, Inc. @@ -41,20 +38,9 @@ import java.util.Map; import org.hl7.fhir.exceptions.FHIRException; import org.hl7.fhir.instance.model.api.IBaseResource; import org.hl7.fhir.r5.context.IWorkerContext; -import org.hl7.fhir.r5.model.BackboneElement; -import org.hl7.fhir.r5.model.Base; -import org.hl7.fhir.r5.model.Bundle; +import org.hl7.fhir.r5.model.*; import org.hl7.fhir.r5.model.Bundle.BundleEntryComponent; import org.hl7.fhir.r5.model.Bundle.BundleLinkComponent; -import org.hl7.fhir.r5.model.CanonicalType; -import org.hl7.fhir.r5.model.DomainResource; -import org.hl7.fhir.r5.model.Element; -import org.hl7.fhir.r5.model.ExpressionNode; -import org.hl7.fhir.r5.model.IntegerType; -import org.hl7.fhir.r5.model.Property; -import org.hl7.fhir.r5.model.Reference; -import org.hl7.fhir.r5.model.Resource; -import org.hl7.fhir.r5.model.StringType; import org.hl7.fhir.utilities.Utilities; import org.hl7.fhir.utilities.graphql.Argument; import org.hl7.fhir.utilities.graphql.Argument.ArgumentListStatus; @@ -571,6 +557,10 @@ public class GraphQLEngine implements IGraphQLEngine { if (!isPrimitive(prop.getTypeCode()) && sel.getField().getName().startsWith("_")) throw new EGraphQLException("Unknown property "+sel.getField().getName()+" on "+source.fhirType()); + if ("id".equals(prop.getName()) && context != null) { + prop.getValues().set(0, new IdType(context.getIdPart())); + } + List vl = filter(context, prop, sel.getField().getName(), sel.getField().getArguments(), prop.getValues(), sel.getField().getName().startsWith("_")); if (!vl.isEmpty()) processValues(context, sel, prop, target, vl, sel.getField().getName().startsWith("_"), inheritedList, suffix); From 8a8bbb730831b56201afaeb60f422c5ace16ec33 Mon Sep 17 00:00:00 2001 From: dotasek Date: Wed, 11 May 2022 12:52:47 -0400 Subject: [PATCH 3/3] Add tests for evaluate transforms using json StructureMap (#807) * Add tests for evaluate transforms using json StructureMap Fixes issues/802 * Reduce test chatter, fix missing ',' in EVALUATE render Co-authored-by: dotasek --- .../r4b/test/StructureMapUtilitiesTest.java | 4 +-- .../structuremap/StructureMapUtilities.java | 24 +++++++------- .../r5/test/StructureMapUtilitiesTest.java | 6 ++-- ...eTests.java => StructureMappingTests.java} | 31 +++++++++++-------- 4 files changed, 37 insertions(+), 28 deletions(-) rename org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/{FHIRMappingLanguageTests.java => StructureMappingTests.java} (84%) diff --git a/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/test/StructureMapUtilitiesTest.java b/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/test/StructureMapUtilitiesTest.java index 9e6e768ec..663e1374d 100644 --- a/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/test/StructureMapUtilitiesTest.java +++ b/org.hl7.fhir.r4b/src/test/java/org/hl7/fhir/r4b/test/StructureMapUtilitiesTest.java @@ -31,7 +31,7 @@ public class StructureMapUtilitiesTest implements ITransformerServices { @Test public void testParseRuleName() throws IOException, FHIRException { StructureMapUtilities scu = new StructureMapUtilities(context, this); - String fileMap = TestingUtilities.loadTestResource("r5", "fml", "ActivityDefinition.map"); + String fileMap = TestingUtilities.loadTestResource("r5", "structure-mapping", "ActivityDefinition.map"); StructureMap structureMap = scu.parse(fileMap, "ActivityDefinition3To4"); // StructureMap/ActivityDefinition3to4: StructureMap.group[3].rule[2].name error id value '"expression"' is not valid @@ -59,7 +59,7 @@ public class StructureMapUtilitiesTest implements ITransformerServices { @Test public void testSyntax() throws IOException, FHIRException { StructureMapUtilities scu = new StructureMapUtilities(context, this); - String fileMap = TestingUtilities.loadTestResource("r5", "fml", "syntax.map"); + String fileMap = TestingUtilities.loadTestResource("r5", "structure-mapping", "syntax.map"); System.out.println(fileMap); StructureMap structureMap = scu.parse(fileMap, "Syntax"); diff --git a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java index e818c3e87..a73b95d6e 100644 --- a/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java +++ b/org.hl7.fhir.r5/src/main/java/org/hl7/fhir/r5/utils/structuremap/StructureMapUtilities.java @@ -338,18 +338,19 @@ public class StructureMapUtilities { for (int i = 0; i < indent; i++) b.append(' '); boolean canBeAbbreviated = checkisSimple(r); - - boolean first = true; - for (StructureMapGroupRuleSourceComponent rs : r.getSource()) { - if (first) - first = false; - else - b.append(", "); - renderSource(b, rs, canBeAbbreviated); + { + boolean first = true; + for (StructureMapGroupRuleSourceComponent rs : r.getSource()) { + if (first) + first = false; + else + b.append(", "); + renderSource(b, rs, canBeAbbreviated); + } } if (r.getTarget().size() > 1) { b.append(" -> "); - first = true; + boolean first = true; for (StructureMapGroupRuleTargetComponent rt : r.getTarget()) { if (first) first = false; @@ -379,7 +380,7 @@ public class StructureMapUtilities { } else { if (r.hasDependent()) { b.append(" then "); - first = true; + boolean first = true; for (StructureMapGroupRuleDependentComponent rd : r.getDependent()) { if (first) first = false; @@ -524,6 +525,7 @@ public class StructureMapUtilities { b.append(rt.getTransform().toCode()); b.append("("); b.append(((IdType) rt.getParameter().get(0).getValue()).asStringValue()); + b.append(", "); b.append(((StringType) rt.getParameter().get(1).getValue()).asStringValue()); b.append(")"); } else { @@ -1679,7 +1681,7 @@ public class StructureMapUtilities { case EVALUATE: ExpressionNode expr = (ExpressionNode) tgt.getUserData(MAP_EXPRESSION); if (expr == null) { - expr = fpe.parse(getParamStringNoNull(vars, tgt.getParameter().get(0), tgt.toString())); + expr = fpe.parse(getParamStringNoNull(vars, tgt.getParameter().get(1), tgt.toString())); tgt.setUserData(MAP_WHERE_EXPRESSION, expr); } List v = fpe.evaluate(vars, null, null, tgt.getParameter().size() == 2 ? getParam(vars, tgt.getParameter().get(0)) : new BooleanType(false), expr); diff --git a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java index 5cc6871c8..eeb9dc21b 100644 --- a/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java +++ b/org.hl7.fhir.r5/src/test/java/org/hl7/fhir/r5/test/StructureMapUtilitiesTest.java @@ -31,7 +31,7 @@ public class StructureMapUtilitiesTest implements ITransformerServices { @Test public void testParseRuleName() throws IOException, FHIRException { StructureMapUtilities scu = new StructureMapUtilities(context, this); - String fileMap = TestingUtilities.loadTestResource("r5", "fml", "ActivityDefinition.map"); + String fileMap = TestingUtilities.loadTestResource("r5", "structure-mapping", "ActivityDefinition.map"); StructureMap structureMap = scu.parse(fileMap, "ActivityDefinition3To4"); // StructureMap/ActivityDefinition3to4: StructureMap.group[3].rule[2].name error id value '"expression"' is not valid @@ -59,7 +59,7 @@ public class StructureMapUtilitiesTest implements ITransformerServices { @Test public void testSyntax() throws IOException, FHIRException { StructureMapUtilities scu = new StructureMapUtilities(context, this); - String fileMap = TestingUtilities.loadTestResource("r5", "fml", "syntax.map"); + String fileMap = TestingUtilities.loadTestResource("r5", "structure-mapping", "syntax.map"); System.out.println(fileMap); StructureMap structureMap = scu.parse(fileMap, "Syntax"); @@ -71,6 +71,8 @@ public class StructureMapUtilitiesTest implements ITransformerServices { assertSerializeDeserialize(map); } + + @Override public void log(String message) { } diff --git a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/StructureMappingTests.java similarity index 84% rename from org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java rename to org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/StructureMappingTests.java index d1ab798fa..82f2235eb 100644 --- a/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/FHIRMappingLanguageTests.java +++ b/org.hl7.fhir.validation/src/test/java/org/hl7/fhir/r5/test/StructureMappingTests.java @@ -3,10 +3,7 @@ package org.hl7.fhir.r5.test; import static org.junit.Assert.assertTrue; import static org.junit.jupiter.api.Assertions.fail; -import java.io.ByteArrayOutputStream; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; +import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.stream.Stream; @@ -35,7 +32,7 @@ import org.w3c.dom.Document; import org.w3c.dom.Element; import org.xml.sax.SAXException; -public class FHIRMappingLanguageTests { +public class StructureMappingTests { private List outputs = new ArrayList(); @@ -45,7 +42,7 @@ public class FHIRMappingLanguageTests { public static Stream data() throws FileNotFoundException, IOException, ParserConfigurationException, SAXException { - Document tests = XMLUtil.parseToDom(TestingUtilities.loadTestResource("r5", "fml", "manifest.xml")); + Document tests = XMLUtil.parseToDom(TestingUtilities.loadTestResource("r5", "structure-mapping", "manifest.xml")); Element test = XMLUtil.getFirstChild(tests.getDocumentElement()); List objects = new ArrayList<>(); while (test != null && test.getNodeName().equals("test")) { @@ -77,22 +74,30 @@ public class FHIRMappingLanguageTests { context.setValidatorFactory(new InstanceValidatorFactory()); } } - + private StructureMap loadStructureMap(String map) throws Exception { + String stringMap = TestingUtilities.loadTestResource("r5", "structure-mapping", map); + if (map.endsWith(".json")) { + return (StructureMap) new org.hl7.fhir.r5.formats.JsonParser().parse(stringMap); + } else if (map.endsWith(".map")) { + return new StructureMapUtilities(context).parse(stringMap, map); + } + throw new Exception("File extension for StuctureMap is not a recognized type (should be one of: '.map', '.json')"); + } @ParameterizedTest(name = "{index}: {0}") @MethodSource("data") public void test(String name, String source, String map, String output) throws Exception { - byte[] byteSource = TestingUtilities.loadTestResourceBytes("r5", "fml", source); - String stringMap = TestingUtilities.loadTestResource("r5", "fml", map); - String outputJson = TestingUtilities.loadTestResource("r5", "fml", output); - String fileOutputRes = TestingUtilities.tempFile("fml", output) + ".out"; - String fileOutputResOrig = TestingUtilities.tempFile("fml", output) + ".orig.out"; + byte[] byteSource = TestingUtilities.loadTestResourceBytes("r5", "structure-mapping", source); + + String outputJson = TestingUtilities.loadTestResource("r5", "structure-mapping", output); + String fileOutputRes = TestingUtilities.tempFile("structure-mapping", output) + ".out"; + String fileOutputResOrig = TestingUtilities.tempFile("structure-mapping", output) + ".orig.out"; ByteArrayOutputStream s = null; outputs.clear(); String msg = null; try { - StructureMap r = new StructureMapUtilities(context).parse(stringMap, map); + StructureMap r = loadStructureMap(map); context.cacheResource(r); org.hl7.fhir.r5.elementmodel.Element element = validationEngine.transform(byteSource, FhirFormat.JSON, r.getUrl()); s = new ByteArrayOutputStream();