From e9b7b72c319297f037a353041582749b1f933cef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9l=C3=A8ne=20Martin?= Date: Mon, 15 Jul 2024 14:50:42 -0700 Subject: [PATCH 1/3] Document current verifyItemsetBindings behavior --- .../ExternalSecondaryInstanceParseTest.java | 57 ++++++++++++++++++- .../org/javarosa/xform/parse/mixed-schema.xml | 9 +++ .../javarosa/xform/parse/mixed-schema2.xml | 9 +++ 3 files changed, 73 insertions(+), 2 deletions(-) create mode 100644 src/test/resources/org/javarosa/xform/parse/mixed-schema.xml create mode 100644 src/test/resources/org/javarosa/xform/parse/mixed-schema2.xml diff --git a/src/test/java/org/javarosa/xform/parse/ExternalSecondaryInstanceParseTest.java b/src/test/java/org/javarosa/xform/parse/ExternalSecondaryInstanceParseTest.java index d135c20dd..dedf92145 100644 --- a/src/test/java/org/javarosa/xform/parse/ExternalSecondaryInstanceParseTest.java +++ b/src/test/java/org/javarosa/xform/parse/ExternalSecondaryInstanceParseTest.java @@ -6,9 +6,9 @@ import org.javarosa.core.model.data.helper.Selection; import org.javarosa.core.model.instance.AbstractTreeElement; import org.javarosa.core.model.instance.TreeReference; +import org.javarosa.core.util.externalizable.DeserializationException; import org.javarosa.test.FormParseInit; import org.javarosa.test.Scenario; -import org.javarosa.core.util.externalizable.DeserializationException; import org.javarosa.xpath.expr.XPathPathExpr; import org.javarosa.xpath.parser.XPathSyntaxException; import org.junit.Test; @@ -24,6 +24,7 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.javarosa.core.reference.ReferenceManagerTestUtils.setUpSimpleReferenceManager; import static org.javarosa.test.BindBuilderXFormsElement.bind; +import static org.javarosa.test.ResourcePathHelper.r; import static org.javarosa.test.XFormsElement.body; import static org.javarosa.test.XFormsElement.head; import static org.javarosa.test.XFormsElement.html; @@ -32,7 +33,6 @@ import static org.javarosa.test.XFormsElement.select1Dynamic; import static org.javarosa.test.XFormsElement.t; import static org.javarosa.test.XFormsElement.title; -import static org.javarosa.test.ResourcePathHelper.r; import static org.javarosa.xform.parse.FormParserHelper.deserializeAndCleanUpSerializedForm; import static org.javarosa.xform.parse.FormParserHelper.getSerializedFormPath; import static org.javarosa.xform.parse.FormParserHelper.parse; @@ -134,6 +134,59 @@ public void xformParseException_whenItemsetConfiguresValueOrLabelNotInExternalIn } } + @Test + public void itemsetBindingVerification_doesNotVerifySecondItem() throws IOException, XFormParser.ParseException { + configureReferenceManagerCorrectly(); + + Scenario.init("Some form", html( + head( + title("Some form"), + model( + mainInstance(t("data id=\"some-form\"", + t("first") + )), + + t("instance id=\"mixed-schema\" src=\"jr://file/mixed-schema.xml\""), + + bind("/data/first").type("string") + ) + ), + body( + // Define a select using value and label references that only exist for the first item + select1Dynamic("/data/first", "instance('mixed-schema')/root/item", "name", "label") + ))); + } + + @Test + public void itemsetBindingVerification_verifiesFirstItem() throws IOException { + configureReferenceManagerCorrectly(); + + try { + Scenario.init("Some form", html( + head( + title("Some form"), + model( + mainInstance(t("data id=\"some-form\"", + t("first") + )), + + t("instance id=\"mixed-schema\" src=\"jr://file/mixed-schema2.xml\""), + + bind("/data/first").type("string") + ) + ), + body( + // Define a select using value and label references that only exist for the second item + select1Dynamic("/data/first", "instance('mixed-schema')/root/item", "name", "label") + ))); + fail("Expected XFormParseException because itemset references don't exist in external instance"); + } catch (XFormParseException e) { + // pass + } catch (XFormParser.ParseException e) { + throw new RuntimeException(e); + } + } + @Test public void csvSecondaryInstanceWithHeaderOnly_parsesWithoutError() throws IOException, XFormParser.ParseException { configureReferenceManagerCorrectly(); diff --git a/src/test/resources/org/javarosa/xform/parse/mixed-schema.xml b/src/test/resources/org/javarosa/xform/parse/mixed-schema.xml new file mode 100644 index 000000000..07f55bee7 --- /dev/null +++ b/src/test/resources/org/javarosa/xform/parse/mixed-schema.xml @@ -0,0 +1,9 @@ + + + + a + + + bar + + diff --git a/src/test/resources/org/javarosa/xform/parse/mixed-schema2.xml b/src/test/resources/org/javarosa/xform/parse/mixed-schema2.xml new file mode 100644 index 000000000..5dae83d75 --- /dev/null +++ b/src/test/resources/org/javarosa/xform/parse/mixed-schema2.xml @@ -0,0 +1,9 @@ + + + bar + + + + a + + From 27d98465adf3bea9b9c99be1ee5e6254de26cba3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9l=C3=A8ne=20Martin?= Date: Thu, 5 Dec 2024 11:23:28 -0800 Subject: [PATCH 2/3] Verify itemset bindings for internal secondary instances --- .../xform/parse/FormInstanceParser.java | 2 +- .../javarosa/core/model/SelectChoiceTest.java | 71 ++++++++++++++++++- .../ExternalSecondaryInstanceParseTest.java | 53 -------------- .../org/javarosa/xform/parse/mixed-schema.xml | 9 --- .../javarosa/xform/parse/mixed-schema2.xml | 9 --- 5 files changed, 70 insertions(+), 74 deletions(-) delete mode 100644 src/test/resources/org/javarosa/xform/parse/mixed-schema.xml delete mode 100644 src/test/resources/org/javarosa/xform/parse/mixed-schema2.xml diff --git a/src/main/java/org/javarosa/xform/parse/FormInstanceParser.java b/src/main/java/org/javarosa/xform/parse/FormInstanceParser.java index 2be1bdfef..4c8629cb9 100644 --- a/src/main/java/org/javarosa/xform/parse/FormInstanceParser.java +++ b/src/main/java/org/javarosa/xform/parse/FormInstanceParser.java @@ -348,7 +348,7 @@ private void verifyItemsetBindings(FormInstance instance) { // Don't try to validate references if the external instance could not be resolved. We allow parsing a form // with placeholder external secondary instances for cases where a ReferenceManager can't be configured. - if (fi instanceof ExternalDataInstance && !((ExternalDataInstance) fi).isUsingPlaceholder()) { + if (!(fi instanceof ExternalDataInstance) || !((ExternalDataInstance) fi).isUsingPlaceholder()) { if (fi.getTemplatePath(itemset.labelRef) == null) { throw new XFormParseException("