/*
* 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 static org.apache.jena.sparql.expr.LibTestExpr.* ;
import org.apache.jena.atlas.junit.BaseTest ;
import org.apache.jena.sparql.ARQException ;
import org.junit.Test ;
/** Expression evaluation involving math: */
public class TestExpressionsMath extends BaseTest
{
@Test public void pi_01() { testDouble("math:pi()", "3.1415926", 0.00001) ; }
@Test(expected=ARQException.class)
public void pi_02() { testDouble("math:pi(1)", "3.1415926", 0.00001) ; }
@Test public void exp_01() { testDouble("math:exp(2)", Math.exp(2.0e0), 0.00001) ; }
@Test public void exp_02() { testDouble("math:exp(2.0)", Math.exp(2.0e0), 0.00001) ; }
@Test public void exp_03() { testDouble("math:exp(-2e1)", Math.exp(-2e1), 0.00001) ; }
@Test public void exp_04() { test("math:exp(1e0/0)", "'INF'^^xsd:double") ; }
@Test public void exp_05() { test("math:exp('INF'^^xsd:double)", "'INF'^^xsd:double") ; }
@Test public void exp_06() { test("math:exp('-INF'^^xsd:double)", "'0.0e0'^^xsd:double") ; }
@Test public void exp_07() { test("math:exp('NaN'^^xsd:double)", "'NaN'^^xsd:double") ; }
@Test public void exp10_01() { test("math:exp10(2)", "100") ; }
@Test public void exp10_02() { testDouble("math:exp10(-1)", 0.1, 0.00001) ; }
@Test public void exp10_03() { testDouble("math:exp10(2.0)", 100, 0.00001) ; }
@Test public void exp10_04() { test("math:exp10(0)", "1") ; }
@Test public void exp10_05() { testDouble("math:exp10('NaN'^^xsd:double)", Double.NaN, 0.0000001 ) ; }
@Test public void log_01() { testDouble("math:log(1)", Math.log(1), 0.0000001 ) ; }
@Test public void log_02() { testDouble("math:log('NaN'^^xsd:double)", Double.NaN, 0.0000001 ) ; }
@Test public void log_03() { test("math:log('INF'^^xsd:double)", "'INF'^^xsd:double") ; }
@Test public void log_04() { test("math:log(0)", "'-INF'^^xsd:double") ; }
@Test public void log_05() { test("math:exp('INF'^^xsd:double)", "'INF'^^xsd:double") ; }
@Test public void log_06() { test("math:exp('-INF'^^xsd:double)", "'0.0e0'^^xsd:double") ; }
@Test public void log_07() { test("math:exp('NaN'^^xsd:double)", "'NaN'^^xsd:double") ; }
@Test public void pow_01() { test("math:pow(2,2)", "4") ; }
@Test public void pow_02() { testDouble("math:pow(2,-2)", 0.25, 0.00001) ; }
@Test public void pow_03() { test("math:pow(2,0)", "1") ; }
@Test public void pow_10() { test("math:pow('INF'^^xsd:double, 1)", "'INF'^^xsd:double") ; }
@Test public void pow_11() { test("math:pow(1, 'INF'^^xsd:double)", "1") ; }
@Test public void pow_12() { test("math:pow(1e0, 'INF'^^xsd:double)", "'1.0e0'^^xsd:double") ; }
@Test public void pow_13() { test("math:pow('INF'^^xsd:double,0)", "'1.0e0'^^xsd:double") ; }
@Test public void pow_14() { test("math:pow('-INF'^^xsd:double, 0)", "'1.0e0'^^xsd:double") ; }
@Test public void pow_15() { test("math:pow('NaN'^^xsd:double, 1)", "'NaN'^^xsd:double") ; }
@Test public void pow_16() { test("math:pow(1, 'NaN'^^xsd:double)", "'NaN'^^xsd:double") ; }
@Test public void sqrt_01() { test("math:sqrt(1)", "'1.0e0'^^xsd:double") ; }
@Test public void sqrt_02() { testDouble("math:sqrt(2)", Math.sqrt(2), 0.000001) ; }
@Test public void sqrt_03() { test("math:sqrt(-2)", "'NaN'^^xsd:double") ; }
@Test(expected=ARQException.class)
public void sqrt_04() { test("math:sqrt('TWO')", "'dummy'") ; }
@Test public void sqrt_10() { test("math:sqrt('INF'^^xsd:double)", "'INF'^^xsd:double") ; }
@Test public void sqrt_11() { test("math:sqrt('-INF'^^xsd:double)", "'NaN'^^xsd:double") ; }
@Test public void sqrt_12() { test("math:sqrt('NaN'^^xsd:double)", "'NaN'^^xsd:double") ; }
// 4.8.7 math:sqrt
// 4.8.8 math:sin
// 4.8.9 math:cos
// 4.8.10 math:tan
// 4.8.11 math:asin
// 4.8.12 math:acos
// 4.8.13 math:atan
// 4.8.14 math:atan2
// Yes - atan uses (Y,X)
@Test public void atan2_01() { testDouble("math:atan2(0,1)", "0.0e0", 0.00001) ; }
@Test public void atan2_02() { testDouble("math:atan2(1,0)", Math.PI/2, 0.00001) ; }
@Test public void atan2_03() { testDouble("math:atan2(2.0,0.0)", Math.PI/2, 0.00001) ; }
@Test public void atan2_04() { testDouble("math:atan2(-2.0e1, 0.0)", - Math.PI/2, 0.00001) ; }
}