diff --git a/src/org/opendatakit/validate/FormValidator.java b/src/org/opendatakit/validate/FormValidator.java index 1421253..1cb208d 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 true; + } + }); + // 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..c8d65ae --- /dev/null +++ b/src/test/resources/intersects_function.xml @@ -0,0 +1,20 @@ + + + + Form with intersects + + + + + + + + + + + + + +