Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 24 additions & 0 deletions src/org/opendatakit/validate/FormValidator.java
Original file line number Diff line number Diff line change
Expand Up @@ -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<Class[]> 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());

Expand Down
Original file line number Diff line number Diff line change
@@ -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"));
}
}
48 changes: 48 additions & 0 deletions src/test/java/org/opendatakit/validate/Output.java
Original file line number Diff line number Diff line change
@@ -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;
}
}
11 changes: 11 additions & 0 deletions src/test/java/org/opendatakit/validate/TestUtils.java
Original file line number Diff line number Diff line change
@@ -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());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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
Expand All @@ -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
Expand All @@ -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);
}
}

}
20 changes: 20 additions & 0 deletions src/test/resources/intersects_function.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0"?>
<h:html xmlns="http://www.w3.org/2002/xforms" xmlns:odk="http://www.opendatakit.org/xforms"
xmlns:jr="http://openrosa.org/javarosa" xmlns:h="http://www.w3.org/1999/xhtml"
xmlns:orx="http://openrosa.org/xforms">
<h:head>
<h:title>Form with intersects</h:title>
<model>
<instance>
<data id="intersects">
<q1/>
<calc/>
</data>
</instance>
<bind nodeset="/data/calc" calculate="if(intersects(/data/q1), 'y', 'n')" type="string"/>
Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I changed this test to nest the call so we're also verifying that there's nothing surprising in that case. It's somewhat verifying the return type change in the stub (though any value was being coerced to boolean anyway).

</model>
</h:head>
<h:body>
<input ref="/data/q1"/>
</h:body>
</h:html>