/** * 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.value; import java.net.URI; import org.jrdf.graph.Node; import org.mulgara.parser.MulgaraParserException; 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 static org.mulgara.query.rdf.XSD.*; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; /** * Tests the external function class for construction functions. * * @created Apr 30, 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 ExternalFnUnitTest extends TestCase { /** * Build the unit test. * @param name The name of the test */ public ExternalFnUnitTest(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 ExternalFnUnitTest("testValues")); suite.addTest(new ExternalFnUnitTest("testVarStr")); suite.addTest(new ExternalFnUnitTest("testVarInt")); return suite; } public void testValues() throws Exception { IRI xsdStr = new IRI(STRING_URI); IRI xsdInt = new IRI(INT_URI); IRI testUri = new IRI(URI.create("foo:bar")); ValueLiteral strData = TypedLiteral.newLiteral("42", xsdStr.getValue(), null); ValueLiteral intData = new NumericLiteral(Integer.valueOf(42)); ExternalFn fn = new ExternalFn(xsdInt, strData); assertTrue(fn.equals(intData)); assertEquals(xsdInt, fn.getType()); fn = new ExternalFn(xsdStr, intData); assertTrue(fn.equals(strData)); assertEquals(xsdStr, fn.getType()); fn = new ExternalFn(xsdStr, new ExternalFn(xsdInt, strData)); assertTrue(fn.equals(strData)); assertEquals(xsdStr, fn.getType()); fn = new ExternalFn(xsdStr, testUri); assertTrue(fn.equals(TypedLiteral.newLiteral(testUri.getValue().toString(), xsdStr.getValue(), null))); assertEquals(xsdStr, fn.getType()); fn = new ExternalFn(xsdInt, testUri); try { assertFalse(fn.equals(testUri)); fail("Unexpectedly converted an IRI to an integer"); } catch (QueryException qe) { } fn = new ExternalFn(xsdInt, new SimpleLiteral("42")); assertTrue(fn.equals(intData)); assertEquals(xsdInt, fn.getType()); fn = new ExternalFn(xsdInt, new SimpleLiteral("42", "en")); assertTrue(fn.equals(intData)); assertEquals(xsdInt, fn.getType()); try { fn = new ExternalFn(xsdInt, testUri, xsdInt); fail("Unexpectedly created an XSD function with 2 parameters"); } catch (MulgaraParserException qe) { } } public void testVarStr() throws Exception { URI fooBar = URI.create("foo:bar"); Node[][] rows = { new Node[] {new LiteralImpl("foo")}, new Node[] {new LiteralImpl("foo", STRING_URI)}, new Node[] {new LiteralImpl("5", INT_URI)}, new Node[] {new LiteralImpl("5.0", DOUBLE_URI)}, new Node[] {new LiteralImpl("foo", "en")}, new Node[] {new LiteralImpl("foo", fooBar)}, new Node[] {new URIReferenceImpl(fooBar)}, new Node[] {new BlankNodeImpl()}, }; String vData = "data"; TestContext c = new TestContext(new String[] {vData}, rows); c.beforeFirst(); IRI StringIri = new IRI(STRING_URI); ExternalFn fn = new ExternalFn(StringIri, new Var(vData)); fn.setContextOwner(new TestContextOwner(c)); ValueLiteral fooStr = TypedLiteral.newLiteral("foo"); ValueLiteral fiveInt = TypedLiteral.newLiteral(Integer.valueOf(5).toString()); ValueLiteral fiveDbl = TypedLiteral.newLiteral(Double.valueOf(5.0).toString()); ValueLiteral fooBarIriStr = TypedLiteral.newLiteral("foo:bar"); // check the context setting fn.setCurrentContext(c); assertTrue(c.next()); assertEquals("foo", fn.getValue()); assertTrue(fooStr.equals(fn)); assertTrue(fn.equals(fooStr)); assertEquals(StringIri, fn.getType()); assertTrue(c.next()); assertEquals("foo", fn.getValue()); assertTrue(fooStr.equals(fn)); assertTrue(fn.equals(fooStr)); assertEquals(StringIri, fn.getType()); assertTrue(c.next()); assertEquals("5", fn.getValue()); assertTrue(fiveInt.equals(fn)); assertTrue(fn.equals(fiveInt)); assertEquals(StringIri, fn.getType()); assertTrue(c.next()); assertEquals("5.0", fn.getValue()); assertTrue(fiveDbl.equals(fn)); assertTrue(fn.equals(fiveDbl)); assertEquals(StringIri, fn.getType()); assertTrue(c.next()); assertEquals("foo", fn.getValue()); assertTrue(fooStr.equals(fn)); assertTrue(fn.equals(fooStr)); assertEquals(StringIri, fn.getType()); assertTrue(c.next()); assertEquals("foo", fn.getValue()); assertTrue(fooStr.equals(fn)); assertTrue(fn.equals(fooStr)); assertEquals(StringIri, fn.getType()); assertTrue(c.next()); assertEquals("foo:bar", fn.getValue()); assertTrue(fooBarIriStr.equals(fn)); assertTrue(fn.equals(fooBarIriStr)); assertEquals(StringIri, fn.getType()); assertTrue(c.next()); try { Object o = fn.getValue(); fail("Converted a blank node to a string: " + o); } catch (QueryException qe) { } assertFalse(c.next()); } public void testVarInt() throws Exception { IRI intIri = new IRI(INT_URI); URI fooBar = URI.create("foo:bar"); Node[][] rows = { new Node[] {new LiteralImpl("42")}, new Node[] {new LiteralImpl("42", INT_URI)}, new Node[] {new LiteralImpl("42.0", DOUBLE_URI)}, new Node[] {new LiteralImpl("42.2", DOUBLE_URI)}, new Node[] {new LiteralImpl("foo", "en")}, new Node[] {new LiteralImpl("foo", fooBar)}, new Node[] {new URIReferenceImpl(fooBar)}, new Node[] {new BlankNodeImpl()}, }; String vData = "data"; TestContext c = new TestContext(new String[] {vData}, rows); c.beforeFirst(); ExternalFn fn = new ExternalFn(intIri, new Var(vData)); fn.setContextOwner(new TestContextOwner(c)); Integer ft = Integer.valueOf(42); ValueLiteral fortyTwo = new NumericLiteral(ft); // check the context setting fn.setCurrentContext(c); assertTrue(c.next()); // "42"^^xsd:string assertEquals(ft, fn.getValue()); assertTrue(fortyTwo.equals(fn)); assertTrue(fn.equals(fortyTwo)); assertEquals(intIri, fn.getType()); assertTrue(c.next()); // "42"^^xsd:int assertEquals(ft, fn.getValue()); assertTrue(fortyTwo.equals(fn)); assertTrue(fn.equals(fortyTwo)); assertEquals(intIri, fn.getType()); assertTrue(c.next()); // "42.0"^^xsd:double assertEquals(ft, fn.getValue()); assertTrue(fortyTwo.equals(fn)); assertTrue(fn.equals(fortyTwo)); assertEquals(intIri, fn.getType()); assertTrue(c.next()); // "42.2"^^xsd:double assertEquals(ft, fn.getValue()); assertTrue(fortyTwo.equals(fn)); assertTrue(fn.equals(fortyTwo)); assertEquals(intIri, fn.getType()); assertTrue(c.next()); try { Object o = fn.getValue(); fail("Converted a language coded string to an int: " + o); } catch (QueryException qe) { } assertTrue(c.next()); try { Object o = fn.getValue(); fail("Converted an unknown type to an int: " + o); } catch (QueryException qe) { } assertTrue(c.next()); try { Object o = fn.getValue(); fail("Converted a URI to an int: " + o); } catch (QueryException qe) { } assertTrue(c.next()); try { Object o = fn.getValue(); fail("Converted a blank node to an int: " + o); } catch (QueryException qe) { } assertFalse(c.next()); } }