/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.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.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.jena.sparql.expr;
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.query.QueryParseException ;
import org.apache.jena.sparql.expr.Expr ;
import org.apache.jena.sparql.expr.ExprEvalException ;
import org.apache.jena.sparql.expr.NodeValue ;
import org.apache.jena.sparql.expr.nodevalue.XSDFuncOp ;
import org.apache.jena.sparql.function.FunctionEnvBase ;
import org.apache.jena.sparql.util.ExprUtils ;
import org.junit.Test ;
/** Break expression testing suite into parts
* @see TestExpressions
* @see TestExprLib
* @see TestNodeValue
*/
public class TestExpressions2 extends BaseTest
{
@Test public void gregorian_eq_01() { eval("'1999'^^xsd:gYear = '1999'^^xsd:gYear", true) ; }
@Test public void gregorian_eq_02() { eval("'1999'^^xsd:gYear != '1999'^^xsd:gYear", false) ; }
@Test (expected=ExprEvalException.class)
public void gregorian_eq_03() { eval("'1999'^^xsd:gYear = '1999Z'^^xsd:gYear") ; }
@Test public void gregorian_eq_04() { eval("'1999'^^xsd:gYear = '2001Z'^^xsd:gYear", false) ; }
// Different value spaces => different.
@Test public void gregorian_eq_05() { eval("'1999-01'^^xsd:gYearMonth != '2001Z'^^xsd:gYear", true) ; }
@Test public void gregorian_eq_06() { eval("'--01'^^xsd:gMonth != '--01-25'^^xsd:gMonthDay", true) ; }
@Test public void gregorian_eq_07() { eval("'---25'^^xsd:gDay = '---25'^^xsd:gDay", true) ; }
@Test public void gregorian_eq_08() { eval("'1999-01'^^xsd:gYearMonth != '2001Z'^^xsd:gYear", true) ; }
@Test public void gregorian_eq_09() { eval("'1999-01'^^xsd:gYearMonth != '2001Z'^^xsd:gYear", true) ; }
@Test public void gregorian_cmp_01() { eval("'1999'^^xsd:gYear < '2001'^^xsd:gYear", true) ; }
@Test public void gregorian_cmp_02() { eval("'1999'^^xsd:gYear > '2001'^^xsd:gYear", false) ; }
@Test public void gregorian_cmp_03() { eval("'1999'^^xsd:gYear < '2001+01:00'^^xsd:gYear", true) ; }
@Test (expected=ExprEvalException.class)
public void gregorian_cmp_04() { eval("'1999'^^xsd:gYear < '1999+05:00'^^xsd:gYear") ; }
public void gregorian_cast_01() { eval("xsd:gYear('2010-03-22'^^xsd:date) = '2010'^^xsd:gYear", true ) ; }
@Test (expected=ExprEvalException.class)
public void coalesce_01() { eval("COALESCE()") ; }
@Test public void coalesce_02() { eval("COALESCE(1) = 1", true) ; }
@Test public void coalesce_03() { eval("COALESCE(?x,1) = 1", true) ; }
@Test public void coalesce_04() { eval("COALESCE(9,1) = 9", true) ; }
// IF
@Test public void if_01() { eval("IF(1+2=3, 'yes', 'no') = 'yes'", true) ; }
@Test public void if_02() { eval("IF(1+2=4, 'yes', 'no') = 'no'", true) ; }
@Test public void if_03() { eval("IF(true, 'yes', 1/0) = 'yes'", true) ; }
@Test (expected=ExprEvalException.class)
public void if_04() { eval("IF(true, 1/0, 'no') = 'no'") ; }
// NOT IN, IN
@Test public void in_01() { eval("1 IN(1,2,3)", true) ; }
@Test public void in_02() { eval("1 IN(<x>,2,1)", true) ; }
@Test public void in_03() { eval("1 IN()", false) ; }
@Test public void in_04() { eval("1 IN(7)", false) ; }
@Test public void not_in_01() { eval("1 NOT IN(1,2,3)", false) ; }
@Test public void not_in_02() { eval("1 NOT IN(<x>,2,1)", false) ; }
@Test public void not_in_03() { eval("1 NOT IN()", true) ; }
@Test public void not_in_04() { eval("1 NOT IN(7)", true) ; }
// Term constructors
@Test public void term_constructor_iri_01() { eval("IRI('http://example/') = <http://example/>", true) ; }
@Test (expected=ExprEvalException.class)
public void term_constructor_iri_02() { eval("IRI(123)") ; }
@Test public void term_constructor_iri_03() { eval("IRI(<http://example/>) = <http://example/>", true) ; }
@Test public void term_constructor_iri_04() { eval("isIRI(IRI(BNODE()))", true) ; } // SPARQL extension
@Test public void term_constructor_iri_05() { eval("regex(str(IRI(BNODE())), '^_:' )", true) ; } // SPARQL extension
@Test public void term_constructor_bnode_01() { eval("isBlank(BNODE())", true) ; }
@Test public void term_constructor_bnode_02() { eval("isBlank(BNODE('abc'))", true) ; }
@Test public void term_constructor_bnode_03() { eval("isBlank(BNODE('abc'))", true) ; }
@Test public void term_constructor_bnode_04() { eval("BNODE('abc') = BNODE('abc')", true) ; }
@Test public void term_constructor_bnode_05() { eval("BNODE('abc') = BNODE('def')", false) ; }
@Test public void term_constructor_strdt_01() { eval("STRDT('123',xsd:integer) = 123", true) ; }
@Test public void term_constructor_strdt_02() { eval("STRDT('123',<http://example/DT>) = '123'^^<http://example/DT>", true) ; }
@Test (expected=ExprEvalException.class)
public void term_constructor_strdt_03() { eval("STRDT('123','abc') = '123'") ; }
@Test (expected=ExprEvalException.class)
public void term_constructor_strdt_04() { eval("STRDT('123'^^xsd:integer,<http://example/DT>) = '123'^^<http://example/DT>") ; }
@Test public void term_constructor_strlang_01() { eval("STRLANG('abc', 'en') = 'abc'@en", true) ; }
@Test (expected=ExprEvalException.class)
public void term_constructor_strlang_02() { eval("STRLANG(<http://example/>, 'en') = 'abc'@en") ; }
@Test (expected=ExprEvalException.class)
public void term_constructor_strlang_03() { eval("STRLANG('abc'@en, 'en') = 'abc'@en") ; }
// XSD casts
@Test public void xsd_cast_01() { eval("xsd:integer('1') = 1", true) ; }
@Test public void xsd_cast_02() { eval("xsd:boolean('1') = true", true) ; }
@Test public void xsd_cast_03() { eval("sameTerm(xsd:double('1.0e0'),1.0e0)", true) ; }
@Test public void xsd_cast_04() { eval("xsd:double('1') = 1", true) ; }
@Test (expected=ExprEvalException.class)
public void xsd_cast_10() { eval("xsd:integer(' 1')") ; }
@Test (expected=ExprEvalException.class)
public void xsd_cast_11() { eval("xsd:boolean(' 1')") ; }
@Test (expected=ExprEvalException.class)
public void xsd_cast_12() { eval("xsd:double(' 1.0e0')") ; }
@Test (expected=ExprEvalException.class)
public void xsd_cast_13() { eval("xsd:double(' 1.0e0')") ; }
// Dynamic Function Calls
@Test (expected=QueryParseException.class)
public void dynamic_call_01() { eval("CALL()", false); }
@Test public void dynamic_call_02() { eval("CALL(xsd:double, '1') = 1") ; }
@Test public void dynamic_call_03() { eval("CALL(fn:concat, 'A', 2+3 ) = 'A5'") ; }
@Test (expected=ExprEvalException.class)
public void dynamic_call_10() { eval("CALL(xsd:double)") ; }
@Test (expected=ExprEvalException.class)
public void dynamic_call_11() { eval("CALL(xsd:noSuchFunc)") ; }
// ---- Workers
/*package*/ static void eval(String string)
{
eval(string, true) ;
}
// It's easier to write tests that simply are expected to return true/false
/*package*/ static void eval(String string, boolean result)
{
Expr expr = ExprUtils.parse(string) ;
NodeValue nv = expr.eval(null, FunctionEnvBase.createTest()) ;
boolean b = XSDFuncOp.booleanEffectiveValue(nv) ;
assertEquals(string, result, b) ;
}
}