From fb97381e457d1656947edda999bcf5ea3e04eebd Mon Sep 17 00:00:00 2001 From: Inaam <144823278+iasmile@users.noreply.github.com> Date: Fri, 20 Oct 2023 15:47:45 -0230 Subject: [PATCH] #648: added tests for validating type inference through conditional (#1252) * chore/added tests for validating type inference through conditional * chore: removed unused imports from SemanticTests * chore: removed added whitespace * chore: updated the comparison using lists * chore: changed list type to set for choice types return comparison --------- Co-authored-by: JP --- .../gradle/wrapper/gradle-wrapper.properties | 5 +- Src/java/.vscode/settings.json | 5 +- .../cql/cql2elm/SemanticTests.java | 60 +++++++++++++++++++ .../org/cqframework/cql/cql2elm/Issue648.cql | 19 ++++++ 4 files changed, 85 insertions(+), 4 deletions(-) create mode 100644 Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/Issue648.cql diff --git a/Src/java-quickstart/gradle/wrapper/gradle-wrapper.properties b/Src/java-quickstart/gradle/wrapper/gradle-wrapper.properties index ffed3a254..4fb760a9f 100644 --- a/Src/java-quickstart/gradle/wrapper/gradle-wrapper.properties +++ b/Src/java-quickstart/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,6 @@ +#Wed Oct 18 04:59:14 NDT 2023 distributionBase=GRADLE_USER_HOME +distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip -zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists +zipStoreBase=GRADLE_USER_HOME diff --git a/Src/java/.vscode/settings.json b/Src/java/.vscode/settings.json index 6b969a7e5..f0692a8e5 100644 --- a/Src/java/.vscode/settings.json +++ b/Src/java/.vscode/settings.json @@ -1,7 +1,7 @@ { "java.configuration.updateBuildConfiguration": "automatic", "java.compile.nullAnalysis.mode": "automatic", - "java.jdt.ls.vmargs": "-noverify -Xmx4G -XX:+UseG1GC -XX:+UseStringDeduplication", + "java.jdt.ls.vmargs": "-noverify -Xmx8G -XX:+UseG1GC -XX:+UseStringDeduplication", "cSpell.words": [ "bools", "datumedge", @@ -11,5 +11,6 @@ "qicore", "testng", "trackback" - ] + ], + "java.debug.settings.onBuildFailureProceed": true } \ No newline at end of file diff --git a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java index 47a661f67..61641519b 100644 --- a/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java +++ b/Src/java/cql-to-elm/src/test/java/org/cqframework/cql/cql2elm/SemanticTests.java @@ -7,6 +7,8 @@ import org.testng.annotations.Test; import java.io.IOException; +import java.util.Set; +import java.util.HashSet; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -652,6 +654,64 @@ public void testNonExistentFileName() { assertThrows(IOException.class, () -> TestUtils.runSemanticTest("ThisFileDoesNotExist.cql", 0)); } + @Test + public void testCaseConditionalReturnTypes() throws IOException { + CqlTranslator translator = runSemanticTest("Issue648.cql", 0); + org.hl7.elm.r1.Library library = translator.toELM(); + Map defs = new HashMap<>(); + + if (library.getStatements() != null) { + for (ExpressionDef def : library.getStatements().getDef()) { + defs.put(def.getName(), def); + } + } + + ExpressionDef caseDef = defs.get("Cases"); + + assertThat(caseDef.getResultType(), instanceOf(ChoiceType.class)); + + ChoiceType choiceType = (ChoiceType)caseDef.getResultType(); + + Set expectedChoiceTypes = new HashSet<>(); + expectedChoiceTypes.add("System.String"); + expectedChoiceTypes.add("System.Boolean"); + expectedChoiceTypes.add("System.Integer"); + + Set actualChoiceTypes = new HashSet<>(); + for (DataType dt : choiceType.getTypes()) { + actualChoiceTypes.add(((NamedType)dt).getName()); + } + assertTrue("Expected types are String, Boolean, and Integer: ", actualChoiceTypes.equals(expectedChoiceTypes)); + } + + @Test + public void testIfConditionalReturnTypes() throws IOException { + CqlTranslator translator = runSemanticTest("Issue648.cql", 0); + org.hl7.elm.r1.Library library = translator.toELM(); + Map defs = new HashMap<>(); + + if (library.getStatements() != null) { + for (ExpressionDef def : library.getStatements().getDef()) { + defs.put(def.getName(), def); + } + } + + ExpressionDef ifDef = defs.get("If"); + assertThat(ifDef.getResultType(), instanceOf(ChoiceType.class)); + + ChoiceType choiceType = (ChoiceType)ifDef.getResultType(); + + Set expectedChoiceTypes = new HashSet<>(); + expectedChoiceTypes.add("System.String"); + expectedChoiceTypes.add("System.Boolean"); + + Set actualChoiceTypes = new HashSet<>(); + for (DataType dt : choiceType.getTypes()) { + actualChoiceTypes.add(((NamedType)dt).getName()); + } + assertTrue("Expected return types are String and Boolean: ", actualChoiceTypes.equals(expectedChoiceTypes)); + } + private CqlTranslator runSemanticTest(String testFileName) throws IOException { return runSemanticTest(testFileName, 0); } diff --git a/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/Issue648.cql b/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/Issue648.cql new file mode 100644 index 000000000..80107dbeb --- /dev/null +++ b/Src/java/cql-to-elm/src/test/resources/org/cqframework/cql/cql2elm/Issue648.cql @@ -0,0 +1,19 @@ +library Issue648 + +/* +https://github.com/cqframework/clinical_quality_language/issues/648 +Type inference through conditionals (case-when, if-else, etc) + */ + +define "Cases": + case + when true then 'true' + when false then false + when true then 5 + else null + end + +define "If": + if true then 'true' + else if false then false + else null \ No newline at end of file