From ddbf4ac4b63674eba497566dd2464cdd2326699d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9l=C3=A8ne=20Martin?= Date: Tue, 6 Jan 2026 12:25:00 -0800 Subject: [PATCH 1/2] Add intersects handler --- .../opendatakit/validate/FormValidator.java | 24 ++++++++ .../validate/CollectFunctionHandlerTest.java | 23 ++++++++ .../java/org/opendatakit/validate/Output.java | 48 ++++++++++++++++ .../org/opendatakit/validate/TestUtils.java | 11 ++++ ...alidateExternalSecondaryInstancesTest.java | 57 +++---------------- src/test/resources/intersects_function.xml | 20 +++++++ 6 files changed, 133 insertions(+), 50 deletions(-) create mode 100644 src/test/java/org/opendatakit/validate/CollectFunctionHandlerTest.java create mode 100644 src/test/java/org/opendatakit/validate/Output.java create mode 100644 src/test/java/org/opendatakit/validate/TestUtils.java create mode 100644 src/test/resources/intersects_function.xml diff --git a/src/org/opendatakit/validate/FormValidator.java b/src/org/opendatakit/validate/FormValidator.java index 1421253..2fa2590 100644 --- a/src/org/opendatakit/validate/FormValidator.java +++ b/src/org/opendatakit/validate/FormValidator.java @@ -493,6 +493,30 @@ public Object eval(Object[] args, EvaluationContext ec) { return args[0]; }}); + fd.getEvaluationContext().addFunctionHandler(new IFunctionHandler() { + + public String getName() { + return "intersects"; + } + + public List getPrototypes() { + return new ArrayList(); + } + + public boolean rawArgs() { + return true; + } + + public boolean realTime() { + return false; + } + + public Object eval(Object[] args, EvaluationContext ec) { + // stub for validation + return args[0]; + } + }); + // check for runtime errors fd.initialize(true, new InstanceInitializationFactory()); diff --git a/src/test/java/org/opendatakit/validate/CollectFunctionHandlerTest.java b/src/test/java/org/opendatakit/validate/CollectFunctionHandlerTest.java new file mode 100644 index 0000000..e79986d --- /dev/null +++ b/src/test/java/org/opendatakit/validate/CollectFunctionHandlerTest.java @@ -0,0 +1,23 @@ +package org.opendatakit.validate; + +import org.junit.Test; + +import java.net.URISyntaxException; +import java.nio.file.Path; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.isEmptyString; + +public class CollectFunctionHandlerTest { + + @Test + public void acceptsIntersects() throws URISyntaxException { + final Path path = TestUtils.getPathOf("intersects_function.xml"); + final FormValidator validator = new FormValidator(); + + Output output = Output.runAndGet(() -> validator.validate(path.toString())); + assertThat(output.getErr(), isEmptyString()); + assertThat(output.getStd(), containsString("Xform is valid")); + } +} diff --git a/src/test/java/org/opendatakit/validate/Output.java b/src/test/java/org/opendatakit/validate/Output.java new file mode 100644 index 0000000..367a48b --- /dev/null +++ b/src/test/java/org/opendatakit/validate/Output.java @@ -0,0 +1,48 @@ +package org.opendatakit.validate; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; + +public class Output { + private final String std; + private final String err; + + Output(String std, String err) { + this.std = std; + this.err = err; + } + + static Output runAndGet(Runnable runnable) { + PrintStream outBackup = System.out; + ByteArrayOutputStream stdBaos = new ByteArrayOutputStream(); + PrintStream stdPs = new PrintStream(stdBaos); + System.setOut(stdPs); + + PrintStream errBackup = System.err; + ByteArrayOutputStream errBaos = new ByteArrayOutputStream(); + PrintStream errPs = new PrintStream(errBaos); + System.setErr(errPs); + + runnable.run(); + + stdPs.flush(); + String std = stdBaos.toString(); + System.setOut(outBackup); + System.out.print(std); + + errPs.flush(); + String err = errBaos.toString(); + System.setErr(errBackup); + System.err.print(err); + + return new Output(std, err); + } + + public String getStd() { + return std; + } + + public String getErr() { + return err; + } +} diff --git a/src/test/java/org/opendatakit/validate/TestUtils.java b/src/test/java/org/opendatakit/validate/TestUtils.java new file mode 100644 index 0000000..ab3e5f0 --- /dev/null +++ b/src/test/java/org/opendatakit/validate/TestUtils.java @@ -0,0 +1,11 @@ +package org.opendatakit.validate; + +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; + +public class TestUtils { + public static Path getPathOf(String filename) throws URISyntaxException { + return Paths.get(ValidateExternalSecondaryInstancesTest.class.getResource(filename.startsWith("/") ? filename : "/" + filename).toURI()); + } +} diff --git a/src/test/java/org/opendatakit/validate/ValidateExternalSecondaryInstancesTest.java b/src/test/java/org/opendatakit/validate/ValidateExternalSecondaryInstancesTest.java index c19b09e..47c6d00 100644 --- a/src/test/java/org/opendatakit/validate/ValidateExternalSecondaryInstancesTest.java +++ b/src/test/java/org/opendatakit/validate/ValidateExternalSecondaryInstancesTest.java @@ -3,12 +3,10 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.isEmptyString; +import static org.opendatakit.validate.TestUtils.getPathOf; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; import java.net.URISyntaxException; import java.nio.file.Path; -import java.nio.file.Paths; import org.junit.Test; public class ValidateExternalSecondaryInstancesTest { @@ -18,8 +16,8 @@ public void supportsXlsformsDefaultValueAndLabelRefs_inItemsets_usingXMLExternal final FormValidator validator = new FormValidator(); Output output = Output.runAndGet(() -> validator.validate(path.toString())); - assertThat(output.err, isEmptyString()); - assertThat(output.std, containsString("Xform is valid")); + assertThat(output.getErr(), isEmptyString()); + assertThat(output.getStd(), containsString("Xform is valid")); } @Test @@ -28,8 +26,8 @@ public void supportsXlsformsDefaultValueAndLabelRefs_inItemsets_usingCsvSecondar final FormValidator validator = new FormValidator(); Output output = Output.runAndGet(() -> validator.validate(path.toString())); - assertThat(output.err, isEmptyString()); - assertThat(output.std, containsString("Xform is valid")); + assertThat(output.getErr(), isEmptyString()); + assertThat(output.getStd(), containsString("Xform is valid")); } @Test @@ -38,48 +36,7 @@ public void supportsCustomValueAndLabelRefs_inItemsets_usingExternalSecondaryIns final FormValidator validator = new FormValidator(); Output output = Output.runAndGet(() -> validator.validate(path.toString())); - assertThat(output.err, isEmptyString()); - assertThat(output.std, containsString("Xform is valid")); + assertThat(output.getErr(), isEmptyString()); + assertThat(output.getStd(), containsString("Xform is valid")); } - - private Path getPathOf(String filename) throws URISyntaxException { - return Paths.get(ValidateExternalSecondaryInstancesTest.class.getResource(filename.startsWith("/") ? filename : "/" + filename).toURI()); - } - - static class Output { - private final String std; - private final String err; - - Output(String std, String err) { - this.std = std; - this.err = err; - } - - static Output runAndGet(Runnable runnable) { - PrintStream outBackup = System.out; - ByteArrayOutputStream stdBaos = new ByteArrayOutputStream(); - PrintStream stdPs = new PrintStream(stdBaos); - System.setOut(stdPs); - - PrintStream errBackup = System.err; - ByteArrayOutputStream errBaos = new ByteArrayOutputStream(); - PrintStream errPs = new PrintStream(errBaos); - System.setErr(errPs); - - runnable.run(); - - stdPs.flush(); - String std = stdBaos.toString(); - System.setOut(outBackup); - System.out.print(std); - - errPs.flush(); - String err = errBaos.toString(); - System.setErr(errBackup); - System.err.print(err); - - return new Output(std, err); - } - } - } diff --git a/src/test/resources/intersects_function.xml b/src/test/resources/intersects_function.xml new file mode 100644 index 0000000..12c266e --- /dev/null +++ b/src/test/resources/intersects_function.xml @@ -0,0 +1,20 @@ + + + + Form with intersects + + + + + + + + + + + + + + From 9d60fb2bb06c1570ea135b4e5b9763fe391b2f83 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?H=C3=A9l=C3=A8ne=20Martin?= Date: Wed, 7 Jan 2026 22:56:23 -0800 Subject: [PATCH 2/2] Return true from stub --- src/org/opendatakit/validate/FormValidator.java | 4 ++-- src/test/resources/intersects_function.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/org/opendatakit/validate/FormValidator.java b/src/org/opendatakit/validate/FormValidator.java index 2fa2590..1cb208d 100644 --- a/src/org/opendatakit/validate/FormValidator.java +++ b/src/org/opendatakit/validate/FormValidator.java @@ -500,7 +500,7 @@ public String getName() { } public List getPrototypes() { - return new ArrayList(); + return new ArrayList<>(); } public boolean rawArgs() { @@ -513,7 +513,7 @@ public boolean realTime() { public Object eval(Object[] args, EvaluationContext ec) { // stub for validation - return args[0]; + return true; } }); diff --git a/src/test/resources/intersects_function.xml b/src/test/resources/intersects_function.xml index 12c266e..c8d65ae 100644 --- a/src/test/resources/intersects_function.xml +++ b/src/test/resources/intersects_function.xml @@ -11,7 +11,7 @@ - +