Skip to content

Commit

Permalink
XPTH-79 tests added (#59)
Browse files Browse the repository at this point in the history
Signed-off-by: Wojciech Diakowski <wojciech.diakowski@fingo.pl>
  • Loading branch information
wojciech-diakowski authored Jul 12, 2023
1 parent d823193 commit 4d8685c
Show file tree
Hide file tree
Showing 2 changed files with 375 additions and 0 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
package info.fingo.xactus.processor.test;

import static org.junit.jupiter.api.Assertions.assertEquals;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;

import info.fingo.xactus.api.ResultSequence;

/**
* Inspired by NodeTestTest
* but do not use variables and tests several context values instead
*
* '_B' - run on root as context
*
* @author Wojciech Diakowski <wojciech.diakowski@fingo.pl>
*
*/
public class ConformanceNodeTest extends ConformanceTestAbstract {

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
public void test_NodeTest001(int context) throws Exception {

String inputFile = "/TestSources/bib2.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest001.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest001.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "/comment()";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = buildXMLResultString(rs);
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
public void test_NodeTest002(int context) throws Exception {

String inputFile = "/TestSources/bib2.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest002.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest002.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "/processing-instruction()";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = buildXMLResultString(rs);
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
public void test_NodeTest006(int context) throws Exception {

String inputFile = "/TestSources/bib.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest006.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest006.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "/bib/book/editor/affiliation/text()";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<result>" + buildXMLResultString(rs) + "</result>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 1 })
public void test_NodeTest006_B(int context) throws Exception {

String inputFile = "/TestSources/bib.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest006.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest006.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "book/editor/affiliation/text()";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<result>" + buildXMLResultString(rs) + "</result>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1 })
// processing-instruction() finds no descendant PIs of the given name anywhere.
public void test_NodeTest007_1(int context) throws Exception {

String inputFile = "/TestSources/TreeEmpty.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest007.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest007-1.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(//processing-instruction('a-pi'))";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
// processing-instruction() gets all PIs of the given name, including those off
// root.
public void test_NodeTest007_2(int context) throws Exception {

String inputFile = "/TestSources/TopMany.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest007.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest007-2.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(//processing-instruction('a-pi'))";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
// text() gets no descendant text nodes.
public void test_NodeTest008_1(int context) throws Exception {

String inputFile = "/TestSources/Tree1Child.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest008.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest008-1.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(//center/text())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 1 })
// text() gets no descendant text nodes.
public void test_NodeTest008_1_B(int context) throws Exception {

String inputFile = "/TestSources/Tree1Child.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest008.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest008-1.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(north/near-north/center/text())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
// text() gets text nodes.
public void test_NodeTest008_2(int context) throws Exception {

String inputFile = "/TestSources/TreeCompass.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest008.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest008-2.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(//center/text())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 1 })
// text() gets text nodes.
public void test_NodeTest008_2_B(int context) throws Exception {

String inputFile = "/TestSources/TreeCompass.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest008.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest008-2.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(north/near-north/center/text())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
// comment() gets no descendant comment nodes.
public void test_NodeTest009_1(int context) throws Exception {

String inputFile = "/TestSources/Tree1Child.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest009.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest009-1.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(//center/comment())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 1 })
// comment() gets no descendant comment nodes.
public void test_NodeTest009_1_B(int context) throws Exception {

String inputFile = "/TestSources/Tree1Child.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest009.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest009-1.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(north/near-north/center/comment())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 0, 1, 2 })
// comment() gets comment nodes.
public void test_NodeTest009_2(int context) throws Exception {

String inputFile = "/TestSources/TreeCompass.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest009.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest009-2.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(//center/comment())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

@ParameterizedTest
@ValueSource(ints = { 1 })
// comment() gets comment nodes.
public void test_NodeTest009_2_B(int context) throws Exception {

String inputFile = "/TestSources/TreeCompass.xml";
// String xqFile =
// "/Queries/XQuery/Expressions/PathExpr/Steps/NodeTest/NodeTest009.xq";
String resultFile = "/ExpectedTestResults/Expressions/PathExpr/Steps/NodeTest/NodeTest009-2.xml";
String expectedResult = getExpectedResult(resultFile);

String xpath = "fn:count(north/near-north/center/comment())";
ResultSequence rs = evaluate(inputFile, xpath, context);

String actual = "<out>" + buildResultString(rs) + "</out>";
assertEquals(expectedResult, actual);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
package info.fingo.xactus.processor.test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import info.fingo.xactus.api.DynamicContext;
import info.fingo.xactus.api.ResultSequence;
import info.fingo.xactus.api.XPath2Expression;
import info.fingo.xactus.processor.DOMLoader;
import info.fingo.xactus.processor.Engine;
import info.fingo.xactus.processor.XercesLoader;
import info.fingo.xactus.processor.testutil.ResultSequenceFormatter;
import info.fingo.xactus.processor.testutil.bundle.Bundle;
import info.fingo.xactus.processor.testutil.bundle.Platform;
import info.fingo.xactus.processor.util.DynamicContextBuilder;
import info.fingo.xactus.processor.util.StaticContextBuilder;

public abstract class ConformanceTestAbstract {

private final Bundle bundle;

public ConformanceTestAbstract() {
bundle = Platform
.getBundle("org.w3c.xqts.testsuite");
}

protected String getExpectedResult(String resultFile) throws IOException {

try (InputStream isrf = bundle.getEntry(resultFile).openStream();
BufferedReader rfreader = new BufferedReader(new InputStreamReader(isrf, "UTF-8"))) {

int bufferLength = 40000;
char[] cbuf = new char[bufferLength];
rfreader.read(cbuf);

return new String(cbuf).trim();
}
}

private Document loadInputFile(String inputFile) throws IOException {

try (InputStream is = bundle.getEntry(inputFile).openStream()) {

DOMLoader domloader = new XercesLoader();
domloader.set_validating(false);
return domloader.load(is);
}
}

protected String buildResultString(ResultSequence rs) {
return ResultSequenceFormatter.buildResultString(rs);
}

protected String buildXMLResultString(ResultSequence rs) throws Exception {
return ResultSequenceFormatter.buildXMLResultString(rs);
}

protected ResultSequence evaluate(String inputFile, String xpath) {
return evaluate(inputFile, xpath);
}

protected ResultSequence evaluate(String inputFile, String xpath, int context) throws IOException {

StaticContextBuilder staticContextBuilder = new StaticContextBuilder();
staticContextBuilder.withNamespace("xs", "http://www.w3.org/2001/XMLSchema");
staticContextBuilder.withNamespace("xsd", "http://www.w3.org/2001/XMLSchema");
staticContextBuilder.withNamespace("fn", "http://www.w3.org/2005/xpath-functions");
staticContextBuilder.withNamespace("xml", "http://www.w3.org/XML/1998/namespace");

XPath2Expression xpathExp = new Engine().parseExpression(xpath, staticContextBuilder);

DynamicContext dynamicContextBuilder = new DynamicContextBuilder(staticContextBuilder);

final Document document = loadInputFile(inputFile);
final Node contextNode;
if (context > 0) {
Element elem = document.getDocumentElement();
for (int i = 1; i < context; i++) {
elem = findFirstChildElement(elem);
}
contextNode = elem;
} else {
contextNode = document;
}
return xpathExp.evaluate(dynamicContextBuilder, new Object[] { contextNode });
}

private static Element findFirstChildElement(Element elem) {

NodeList childNodes = elem.getChildNodes();
for (int i = 0; i < childNodes.getLength(); i++) {
if (childNodes.item(i) instanceof Element)
return (Element) childNodes.item(i);
}
return null;
}

}

0 comments on commit 4d8685c

Please sign in to comment.