/**
* The contents of this file are subject to the Open Software License
* Version 3.0 (the "License"); you may not use this file except in
* compliance with the License. You may obtain a copy of the License at
* http://www.opensource.org/licenses/osl-3.0.txt
*
* Software distributed under the License is distributed on an "AS IS"
* basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
* the License for the specific language governing rights and limitations
* under the License.
*/
package org.mulgara.query.filter;
import java.net.URI;
import org.jrdf.graph.Literal;
import org.jrdf.graph.Node;
import org.mulgara.query.QueryException;
import org.mulgara.query.filter.TestContext;
import org.mulgara.query.filter.TestContextOwner;
import org.mulgara.query.rdf.BlankNodeImpl;
import org.mulgara.query.rdf.LiteralImpl;
import org.mulgara.query.rdf.URIReferenceImpl;
import org.mulgara.query.filter.value.Bool;
import org.mulgara.query.filter.value.NumericLiteral;
import org.mulgara.query.filter.value.TypedLiteral;
import org.mulgara.query.filter.value.Var;
import junit.framework.Test;
import junit.framework.TestSuite;
/**
* Tests the AND operation.
*
* @created Apr 14, 2008
* @author Paula Gearon
* @copyright © 2008 <a href="http://www.topazproject.org/">The Topaz Project</a>
* @licence <a href="{@docRoot}/../../LICENCE.txt">Open Software License v3.0</a>
*/
public class AndUnitTest extends AbstractLogicUnitTest {
/**
* Build the unit test.
* @param name The name of the test
*/
public AndUnitTest(String name) {
super(name);
}
/**
* Hook for test runner to obtain a test suite from.
* @return The test suite
*/
public static Test suite() {
TestSuite suite = new TestSuite();
suite.addTest(new AndUnitTest("testLiteral"));
suite.addTest(new AndUnitTest("testVar"));
return suite;
}
public void testLiteral() throws Exception {
Bool t = Bool.TRUE;
Bool f = Bool.FALSE;
basicTest(t, t, t);
basicTest(f, t, f);
basicTest(t, f, f);
basicTest(f, f, f);
basicTest(new NumericLiteral(7), t, t);
basicTest(new NumericLiteral(0), t, f);
basicTest(new NumericLiteral(7), f, f);
basicTest(new NumericLiteral(0), f, f);
basicTest(TypedLiteral.newLiteral("foo"), t, t);
basicTest(TypedLiteral.newLiteral(""), t, f);
basicTest(TypedLiteral.newLiteral("foo"), f, f);
basicTest(TypedLiteral.newLiteral(""), f, f);
}
void basicTest(Filter lhs, Filter rhs, Bool result) throws Exception {
basicTest(new And(lhs, rhs), result);
}
public void testVar() throws Exception {
Var x = new Var("x");
Var y = new Var("y");
And fn = new And(x, y);
URI fooBar = URI.create("foo:bar");
Literal seven = new LiteralImpl("7", xsdInt);
Literal zero = new LiteralImpl("0", xsdInt);
Literal trueLiteral = new LiteralImpl("true", xsdBool);
Literal falseLiteral = new LiteralImpl("false", xsdBool);
Node[][] rows = {
new Node[] {seven, seven},
new Node[] {seven, zero},
new Node[] {seven, trueLiteral},
new Node[] {seven, falseLiteral},
new Node[] {falseLiteral, new LiteralImpl("foo", "en")},
new Node[] {trueLiteral, new LiteralImpl("foo", fooBar)},
new Node[] {new LiteralImpl(""), trueLiteral},
new Node[] {new LiteralImpl(""), falseLiteral},
new Node[] {trueLiteral, new URIReferenceImpl(fooBar)},
new Node[] {falseLiteral, new URIReferenceImpl(fooBar)},
new Node[] {trueLiteral, new BlankNodeImpl(1001)},
new Node[] {falseLiteral, new BlankNodeImpl(1002)},
new Node[] {trueLiteral, null},
new Node[] {falseLiteral, null}
};
TestContext c = new TestContext(new String[] {"x", "y"}, rows);
c.beforeFirst();
fn.setContextOwner(new TestContextOwner(c));
// check the context setting
fn.setCurrentContext(c);
Bool t = Bool.TRUE;
Bool f = Bool.FALSE;
assertTrue(c.next());
assertTrue(t.equals(fn));
assertTrue(c.next());
assertTrue(f.equals(fn));
assertTrue(c.next());
assertTrue(t.equals(fn));
assertTrue(c.next());
assertTrue(f.equals(fn));
assertTrue(c.next());
assertTrue(f.equals(fn));
assertTrue(c.next());
try {
fn.getValue();
fail("EBV on an unknown type of literal");
} catch (QueryException qe) { }
assertTrue(c.next());
assertTrue(f.equals(fn));
assertTrue(c.next());
assertTrue(f.equals(fn));
assertTrue(c.next());
try {
fn.getValue();
fail("Logic operation on a URI");
} catch (QueryException qe) { }
assertTrue(c.next());
assertTrue(f.equals(fn));
assertTrue(c.next());
try {
fn.getValue();
fail("Logic operation on a blank node");
} catch (QueryException qe) { }
assertTrue(c.next());
assertTrue(f.equals(fn));
assertTrue(c.next());
try {
fn.getValue();
fail("Logic operation on an unbound");
} catch (QueryException qe) { }
assertTrue(c.next());
assertTrue(f.equals(fn));
assertFalse(c.next());
}
}