From 530cec5a2760ee844d19876f336513fc8c2f0ba3 Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Tue, 15 Oct 2024 09:40:23 +0200 Subject: [PATCH 1/6] Updated FakeFileInstanceParser to reflect what collect's LocalEntitiesInstanceAdapter does --- .../org/javarosa/plugins/InstancePluginTest.java | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/src/test/java/org/javarosa/plugins/InstancePluginTest.java b/src/test/java/org/javarosa/plugins/InstancePluginTest.java index ed90c7f60..de6e67b19 100644 --- a/src/test/java/org/javarosa/plugins/InstancePluginTest.java +++ b/src/test/java/org/javarosa/plugins/InstancePluginTest.java @@ -331,17 +331,18 @@ public boolean isSupported(@NotNull String instanceId, @NotNull String instanceS TreeElement root = new TreeElement("root", 0); for (int i = 0; i < items.size(); i++) { - TreeElement value = new TreeElement("value"); - TreeElement label = new TreeElement("label"); + TreeElement item = new TreeElement("item", i, isPartial); + + if (!isPartial || i == 0) { + TreeElement value = new TreeElement("value"); + TreeElement label = new TreeElement("label"); - if (!isPartial) { value.setValue(new StringData(items.get(i).getFirst())); label.setValue(new StringData(items.get(i).getSecond())); - } - TreeElement item = new TreeElement("item", i, isPartial); - item.addChild(value); - item.addChild(label); + item.addChild(value); + item.addChild(label); + } root.addChild(item); } From 9292a81274367941b9c6d67f409fd32923de9104 Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Tue, 15 Oct 2024 09:50:32 +0200 Subject: [PATCH 2/6] Fixed and improved tests in InstancePluginTest --- .../javarosa/plugins/InstancePluginTest.java | 67 +++++++++++++------ 1 file changed, 47 insertions(+), 20 deletions(-) diff --git a/src/test/java/org/javarosa/plugins/InstancePluginTest.java b/src/test/java/org/javarosa/plugins/InstancePluginTest.java index de6e67b19..588b2eb64 100644 --- a/src/test/java/org/javarosa/plugins/InstancePluginTest.java +++ b/src/test/java/org/javarosa/plugins/InstancePluginTest.java @@ -86,14 +86,21 @@ public void instanceProvider_supportsPartialElements() throws IOException, XForm assertThat(firstItem.isPartial(), equalTo(true)); assertThat(firstItem.getNumChildren(), equalTo(2)); assertThat(firstItem.getChildAt(0).getName(), equalTo("value")); - assertThat(firstItem.getChildAt(0).getValue(), equalTo(null)); + assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); assertThat(firstItem.getChildAt(1).getName(), equalTo("label")); - assertThat(firstItem.getChildAt(1).getValue(), equalTo(null)); + assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); + + TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); + assertThat(secondItem.isPartial(), equalTo(true)); + assertThat(secondItem.getNumChildren(), equalTo(0)); List selectChoices = scenario.choicesOf("/data/question"); assertThat(selectChoices.size(), equalTo(2)); - + assertThat(selectChoices.get(0).getLabelInnerText(), equalTo("Item 0")); assertThat(selectChoices.get(0).getValue(), equalTo("0")); + assertThat(selectChoices.get(1).getLabelInnerText(), equalTo("Item 1")); + assertThat(selectChoices.get(1).getValue(), equalTo("1")); + firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0); assertThat(firstItem.isPartial(), equalTo(false)); assertThat(firstItem.getNumChildren(), equalTo(2)); @@ -101,6 +108,14 @@ public void instanceProvider_supportsPartialElements() throws IOException, XForm assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); assertThat(firstItem.getChildAt(1).getName(), equalTo("label")); assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); + + secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); + assertThat(secondItem.isPartial(), equalTo(false)); + assertThat(secondItem.getNumChildren(), equalTo(2)); + assertThat(secondItem.getChildAt(0).getName(), equalTo("value")); + assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1"))); + assertThat(secondItem.getChildAt(1).getName(), equalTo("label")); + assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1"))); } @Test @@ -140,14 +155,21 @@ public void fileInstanceParser_supportsPartialElements() throws IOException, XFo assertThat(firstItem.isPartial(), equalTo(true)); assertThat(firstItem.getNumChildren(), equalTo(2)); assertThat(firstItem.getChildAt(0).getName(), equalTo("value")); - assertThat(firstItem.getChildAt(0).getValue(), equalTo(null)); + assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); assertThat(firstItem.getChildAt(1).getName(), equalTo("label")); - assertThat(firstItem.getChildAt(1).getValue(), equalTo(null)); + assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); + + TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); + assertThat(secondItem.isPartial(), equalTo(true)); + assertThat(secondItem.getNumChildren(), equalTo(0)); List selectChoices = scenario.choicesOf("/data/question"); assertThat(selectChoices.size(), equalTo(2)); - + assertThat(selectChoices.get(0).getLabelInnerText(), equalTo("Item 0")); assertThat(selectChoices.get(0).getValue(), equalTo("0")); + assertThat(selectChoices.get(1).getLabelInnerText(), equalTo("Item 1")); + assertThat(selectChoices.get(1).getValue(), equalTo("1")); + firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0); assertThat(firstItem.isPartial(), equalTo(false)); assertThat(firstItem.getNumChildren(), equalTo(2)); @@ -155,6 +177,14 @@ public void fileInstanceParser_supportsPartialElements() throws IOException, XFo assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); assertThat(firstItem.getChildAt(1).getName(), equalTo("label")); assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); + + secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); + assertThat(secondItem.isPartial(), equalTo(false)); + assertThat(secondItem.getNumChildren(), equalTo(2)); + assertThat(secondItem.getChildAt(0).getName(), equalTo("value")); + assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1"))); + assertThat(secondItem.getChildAt(1).getName(), equalTo("label")); + assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1"))); } @Test @@ -189,29 +219,26 @@ public void supportsReplacingPartialElements() throws IOException, XFormParser.P HashMap instances = scenario.getFormDef().getFormInstances(); DataInstance fakeInstance = instances.get("fake-instance"); - TreeElement item = new TreeElement("item", 0); + TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); + assertThat(secondItem.isPartial(), equalTo(true)); + assertThat(secondItem.getNumChildren(), equalTo(0)); + + TreeElement item = new TreeElement("item", 1); TreeElement value = new TreeElement("value"); TreeElement label = new TreeElement("label"); - value.setValue(new StringData("0")); - label.setValue(new StringData("Item 0")); + value.setValue(new StringData("1")); + label.setValue(new StringData("Item 1")); item.addChild(value); item.addChild(label); fakeInstance.replacePartialElements(asList(item)); - TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0); - assertThat(firstItem.isPartial(), equalTo(false)); - assertThat(firstItem.getNumChildren(), equalTo(2)); - assertThat(firstItem.getChildAt(0).getName(), equalTo("value")); - assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); - assertThat(firstItem.getChildAt(1).getName(), equalTo("label")); - assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); - TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); - assertThat(secondItem.isPartial(), equalTo(true)); + secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); + assertThat(secondItem.isPartial(), equalTo(false)); assertThat(secondItem.getNumChildren(), equalTo(2)); assertThat(secondItem.getChildAt(0).getName(), equalTo("value")); - assertThat(secondItem.getChildAt(0).getValue(), equalTo(null)); + assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1"))); assertThat(secondItem.getChildAt(1).getName(), equalTo("label")); - assertThat(secondItem.getChildAt(1).getValue(), equalTo(null)); + assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1"))); } @Test From 015c3852665ae1481e44a2c2543f501ec1aa34dc Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Tue, 15 Oct 2024 09:57:24 +0200 Subject: [PATCH 3/6] Added failing test --- .../javarosa/plugins/InstancePluginTest.java | 65 +++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/src/test/java/org/javarosa/plugins/InstancePluginTest.java b/src/test/java/org/javarosa/plugins/InstancePluginTest.java index 588b2eb64..64e308433 100644 --- a/src/test/java/org/javarosa/plugins/InstancePluginTest.java +++ b/src/test/java/org/javarosa/plugins/InstancePluginTest.java @@ -290,6 +290,71 @@ public void replacePartialElements_DoesNotOverrideNonPartialElements() throws IO assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); } + @Test + public void replacingTheFirstPartialElement_doesNotBlockSupportingRestPartialElements() throws IOException, XFormParser.ParseException { + externalInstanceParserFactory.setFileInstanceParser(new FakeFileInstanceParser(asList( + new Pair<>("0", "Item 0"), + new Pair<>("1", "Item 1") + ), true)); + + File tempFile = TempFileUtils.createTempFile("fake-instance", "fake"); + setUpSimpleReferenceManager(tempFile, "file-csv", "file"); + + Scenario scenario = Scenario.init("Fake instance form", html( + head( + title("Fake instance form"), + model( + mainInstance( + t("data id=\"fake-instance-form\"", + t("question") + ) + ), + t("instance id=\"fake-instance\" src=\"jr://file-csv/fake-instance.fake\""), + bind("/data/question").type("string") + ) + ), + body( + select1Dynamic("/data/question", "instance('fake-instance')/root/item") + ) + ) + ); + + HashMap instances = scenario.getFormDef().getFormInstances(); + DataInstance fakeInstance = instances.get("fake-instance"); + + TreeElement item = new TreeElement("item", 0); + TreeElement value = new TreeElement("value"); + TreeElement label = new TreeElement("label"); + value.setValue(new StringData("0")); + label.setValue(new StringData("Item 0")); + item.addChild(value); + item.addChild(label); + fakeInstance.replacePartialElements(asList(item)); + + List selectChoices = scenario.choicesOf("/data/question"); + assertThat(selectChoices.size(), equalTo(2)); + assertThat(selectChoices.get(0).getLabelInnerText(), equalTo("Item 0")); + assertThat(selectChoices.get(0).getValue(), equalTo("0")); + assertThat(selectChoices.get(1).getLabelInnerText(), equalTo("Item 1")); + assertThat(selectChoices.get(1).getValue(), equalTo("1")); + + TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0); + assertThat(firstItem.isPartial(), equalTo(false)); + assertThat(firstItem.getNumChildren(), equalTo(2)); + assertThat(firstItem.getChildAt(0).getName(), equalTo("value")); + assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); + assertThat(firstItem.getChildAt(1).getName(), equalTo("label")); + assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); + + TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); + assertThat(secondItem.isPartial(), equalTo(false)); + assertThat(secondItem.getNumChildren(), equalTo(2)); + assertThat(secondItem.getChildAt(0).getName(), equalTo("value")); + assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1"))); + assertThat(secondItem.getChildAt(1).getName(), equalTo("label")); + assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1"))); + } + private static class SwitchableExternalInstanceParserFactory implements ExternalInstanceParserFactory { private ExternalInstanceParser.FileInstanceParser fileInstanceParser; private ExternalInstanceParser.InstanceProvider instanceProvider; From dd85eb4c4a0a0bd266f9d1723d95561ff2def578 Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Tue, 15 Oct 2024 09:57:57 +0200 Subject: [PATCH 4/6] Fixed detecting partial elements in #resolveReference --- .../javarosa/core/model/instance/DataInstance.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/javarosa/core/model/instance/DataInstance.java b/src/main/java/org/javarosa/core/model/instance/DataInstance.java index 49d6ce0e6..4b3946084 100644 --- a/src/main/java/org/javarosa/core/model/instance/DataInstance.java +++ b/src/main/java/org/javarosa/core/model/instance/DataInstance.java @@ -81,10 +81,6 @@ public T resolveReference(TreeReference ref) { AbstractTreeElement node = getBase(); T result = null; for (int i = 0; i < ref.size(); i++) { - if (node instanceof TreeElement && ((TreeElement) node).isPartial()) { - throw new PartialElementEncounteredException(); - } - String name = ref.getName(i); int mult = ref.getMultiplicity(i); @@ -110,7 +106,13 @@ public T resolveReference(TreeReference ref) { } } - return (node == getBase() ? null : result); // never return a reference to '/' + if (node == getBase() || result == null) { + return null; // never return a reference to '/' + } else if (((TreeElement) result).isPartial()) { + throw new PartialElementEncounteredException(); + } else { + return result; + } } public List> explodeReference(TreeReference ref) { From 17ac96652215960f2aa04d4aaab437d1122565a1 Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Wed, 16 Oct 2024 17:04:02 +0200 Subject: [PATCH 5/6] Do not mark the first element as partial --- .../java/org/javarosa/plugins/InstancePluginTest.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/test/java/org/javarosa/plugins/InstancePluginTest.java b/src/test/java/org/javarosa/plugins/InstancePluginTest.java index 64e308433..02f87a199 100644 --- a/src/test/java/org/javarosa/plugins/InstancePluginTest.java +++ b/src/test/java/org/javarosa/plugins/InstancePluginTest.java @@ -83,7 +83,7 @@ public void instanceProvider_supportsPartialElements() throws IOException, XForm assertThat(fakeInstance.getRoot().getNumChildren(), equalTo(2)); TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0); - assertThat(firstItem.isPartial(), equalTo(true)); + assertThat(firstItem.isPartial(), equalTo(false)); assertThat(firstItem.getNumChildren(), equalTo(2)); assertThat(firstItem.getChildAt(0).getName(), equalTo("value")); assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); @@ -152,7 +152,7 @@ public void fileInstanceParser_supportsPartialElements() throws IOException, XFo assertThat(fakeInstance.getRoot().getNumChildren(), equalTo(2)); TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0); - assertThat(firstItem.isPartial(), equalTo(true)); + assertThat(firstItem.isPartial(), equalTo(false)); assertThat(firstItem.getNumChildren(), equalTo(2)); assertThat(firstItem.getChildAt(0).getName(), equalTo("value")); assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); @@ -419,13 +419,14 @@ public boolean isSupported(@NotNull String instanceId, @NotNull String instanceS } private @NotNull TreeElement createRoot(boolean partial) { - boolean isPartial = partialParse && partial; TreeElement root = new TreeElement("root", 0); for (int i = 0; i < items.size(); i++) { + boolean isPartial = partialParse && partial && i != 0; + TreeElement item = new TreeElement("item", i, isPartial); - if (!isPartial || i == 0) { + if (!isPartial) { TreeElement value = new TreeElement("value"); TreeElement label = new TreeElement("label"); From 4102e51d53493e991a3d2ac9de685702782b7a9a Mon Sep 17 00:00:00 2001 From: Grzegorz Orczykowski Date: Wed, 16 Oct 2024 17:10:12 +0200 Subject: [PATCH 6/6] Removed redundant test --- .../javarosa/plugins/InstancePluginTest.java | 65 ------------------- 1 file changed, 65 deletions(-) diff --git a/src/test/java/org/javarosa/plugins/InstancePluginTest.java b/src/test/java/org/javarosa/plugins/InstancePluginTest.java index 02f87a199..cc54fcb49 100644 --- a/src/test/java/org/javarosa/plugins/InstancePluginTest.java +++ b/src/test/java/org/javarosa/plugins/InstancePluginTest.java @@ -290,71 +290,6 @@ public void replacePartialElements_DoesNotOverrideNonPartialElements() throws IO assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); } - @Test - public void replacingTheFirstPartialElement_doesNotBlockSupportingRestPartialElements() throws IOException, XFormParser.ParseException { - externalInstanceParserFactory.setFileInstanceParser(new FakeFileInstanceParser(asList( - new Pair<>("0", "Item 0"), - new Pair<>("1", "Item 1") - ), true)); - - File tempFile = TempFileUtils.createTempFile("fake-instance", "fake"); - setUpSimpleReferenceManager(tempFile, "file-csv", "file"); - - Scenario scenario = Scenario.init("Fake instance form", html( - head( - title("Fake instance form"), - model( - mainInstance( - t("data id=\"fake-instance-form\"", - t("question") - ) - ), - t("instance id=\"fake-instance\" src=\"jr://file-csv/fake-instance.fake\""), - bind("/data/question").type("string") - ) - ), - body( - select1Dynamic("/data/question", "instance('fake-instance')/root/item") - ) - ) - ); - - HashMap instances = scenario.getFormDef().getFormInstances(); - DataInstance fakeInstance = instances.get("fake-instance"); - - TreeElement item = new TreeElement("item", 0); - TreeElement value = new TreeElement("value"); - TreeElement label = new TreeElement("label"); - value.setValue(new StringData("0")); - label.setValue(new StringData("Item 0")); - item.addChild(value); - item.addChild(label); - fakeInstance.replacePartialElements(asList(item)); - - List selectChoices = scenario.choicesOf("/data/question"); - assertThat(selectChoices.size(), equalTo(2)); - assertThat(selectChoices.get(0).getLabelInnerText(), equalTo("Item 0")); - assertThat(selectChoices.get(0).getValue(), equalTo("0")); - assertThat(selectChoices.get(1).getLabelInnerText(), equalTo("Item 1")); - assertThat(selectChoices.get(1).getValue(), equalTo("1")); - - TreeElement firstItem = (TreeElement) fakeInstance.getRoot().getChild("item", 0); - assertThat(firstItem.isPartial(), equalTo(false)); - assertThat(firstItem.getNumChildren(), equalTo(2)); - assertThat(firstItem.getChildAt(0).getName(), equalTo("value")); - assertThat(firstItem.getChildAt(0).getValue(), equalTo(new StringData("0"))); - assertThat(firstItem.getChildAt(1).getName(), equalTo("label")); - assertThat(firstItem.getChildAt(1).getValue(), equalTo(new StringData("Item 0"))); - - TreeElement secondItem = (TreeElement) fakeInstance.getRoot().getChild("item", 1); - assertThat(secondItem.isPartial(), equalTo(false)); - assertThat(secondItem.getNumChildren(), equalTo(2)); - assertThat(secondItem.getChildAt(0).getName(), equalTo("value")); - assertThat(secondItem.getChildAt(0).getValue(), equalTo(new StringData("1"))); - assertThat(secondItem.getChildAt(1).getName(), equalTo("label")); - assertThat(secondItem.getChildAt(1).getValue(), equalTo(new StringData("Item 1"))); - } - private static class SwitchableExternalInstanceParserFactory implements ExternalInstanceParserFactory { private ExternalInstanceParser.FileInstanceParser fileInstanceParser; private ExternalInstanceParser.InstanceProvider instanceProvider;