package lux.xpath;
import static org.junit.Assert.*;
import lux.Compiler;
import lux.compiler.SaxonTranslator;
import lux.index.IndexConfiguration;
import net.sf.saxon.s9api.SaxonApiException;
import org.junit.Before;
import org.junit.Test;
public class TestEquals {
private Compiler compiler;
private SaxonTranslator translator;
@Before
public void startup() {
compiler = new Compiler (new IndexConfiguration());
translator = new SaxonTranslator (compiler.getProcessor().getUnderlyingConfiguration());
}
@Test
public void testEquivalent () throws Exception {
// It's no longer possible to create a PathStep this way; as of saxon 9.5 this compiles
// to a path: ./a
// assertEquivalent ("a", "a");
// assertNotEquivalent ("c", "a");
assertEquivalent ("/a/b/c", "/a/b/c");
assertEquivalent ("/a/b/c", "/x");
assertEquivalent ("xs:double(1)", "xs:double(1.0)");
assertNotEquivalent ("xs:double(1)", "1");
assertEquivalent ("current-dateTime()", "current-dateTime()");
assertNotEquivalent ("current-dateTime()", "not(true())");
// operators
assertEquivalent ("a=b", "c=d");
assertNotEquivalent ("a=b", "a!=b");
// functions
assertEquivalent ("concat(a,b)", "concat(b,c)");
assertNotEquivalent ("concat(a,b)", "substring-after(a,b)");
assertNotEquivalent ("string(a)", "a/string()");
// predicates
assertEquivalent ("a[b]", "a[b]");
assertEquivalent ("a[b]", "b[a]"); // all we do is check that this is a predicate
// sequence, subsequence
assertEquivalent ("(0,1,2)", "('x','y','z')");
assertEquivalent ("(0,1,2)[1]", "subsequence((0,1,2),1,1)");
assertEquivalent ("subsequence((0,1,2),1,3)", "subsequence((0,1,2),1,3)");
assertEquivalent ("subsequence((0,1,2),x,y)", "subsequence((0,1,2),a,b)");
}
private void assertEquivalent (String xp1, String xp2) throws Exception {
AbstractExpression cx1 = compile(xp1);
AbstractExpression cx2 = compile(xp2);
assertTrue (xp1 + " != " + xp2, cx1.equivalent(cx2));
assertTrue (xp2 + " != " + xp1, cx2.equivalent(cx1));
}
private void assertNotEquivalent (String xp1, String xp2) throws Exception {
AbstractExpression cx1 = compile(xp1);
AbstractExpression cx2 = compile(xp2);
assertTrue (xp1 + " = " + xp2, ! cx1.equivalent(cx2));
assertTrue (xp2 + " = " + xp1, ! cx2.equivalent(cx1));
}
@Test
public void testDeepEquals () throws Exception {
assertDeepEquals ("a", "a");
assertNotDeepEquals ("c", "a");
assertDeepEquals ("/a/b/c", "/a/b/c");
assertNotDeepEquals ("/a/b/c", "/x");
assertDeepEquals ("xs:double(1)", "xs:double(1.0)");
assertNotDeepEquals ("xs:double(1)", "1");
assertDeepEquals ("current-dateTime()", "current-dateTime()");
assertNotDeepEquals ("current-dateTime()", "not(true())");
// operators
assertDeepEquals ("a=b", "a=b");
assertNotDeepEquals ("a=b", "c=d");
assertNotDeepEquals ("a=b", "a!=b");
// functions
assertDeepEquals ("concat(a,b)", "concat(a,b)");
assertNotDeepEquals ("concat(a,b)", "concat(b,c)");
assertNotDeepEquals ("concat(a,b)", "substring-after(a,b)");
assertNotDeepEquals ("string(a)", "a/string()");
// predicates
assertDeepEquals ("a[b]", "a[b]");
assertNotDeepEquals ("a[b]", "b[a]");
// sequence, subsequence
assertNotDeepEquals ("(0,1,2)", "('x')");
assertDeepEquals ("(0,1,2)[1]", "subsequence((0,1,2),1,1)");
assertDeepEquals ("subsequence((0,1,2),1,3)", "subsequence((0,1,2),1,3)");
assertNotDeepEquals ("subsequence((0,1,2),1,2)", "subsequence((0,1,2),1,1)");
}
private void assertDeepEquals (String xp1, String xp2) throws Exception {
AbstractExpression cx1 = compile(xp1);
AbstractExpression cx2 = compile(xp2);
assertTrue (xp1 + " != " + xp2, cx1.deepEquals(cx2));
assertTrue (xp2 + " != " + xp1, cx2.deepEquals(cx1));
}
private void assertNotDeepEquals (String xp1, String xp2) throws Exception {
AbstractExpression cx1 = compile(xp1);
AbstractExpression cx2 = compile(xp2);
assertTrue (xp1 + " = " + xp2, ! cx1.deepEquals(cx2));
assertTrue (xp2 + " = " + xp1, ! cx2.deepEquals(cx1));
}
private AbstractExpression compile (String xpath) throws SaxonApiException {
return translator.exprFor (compiler.getXPathCompiler().compile(xpath).getUnderlyingExpression().getInternalExpression());
}
}
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this file,
* You can obtain one at http://mozilla.org/MPL/2.0/. */