/** * 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.graph.Node ; import org.apache.jena.query.ARQ ; import org.apache.jena.sparql.ARQConstants ; import org.apache.jena.sparql.engine.ExecutionContext ; 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.function.FunctionEnv ; import org.apache.jena.sparql.sse.SSE ; import org.apache.jena.sparql.util.ExprUtils ; import org.apache.jena.sparql.util.NodeFactoryExtra ; import org.junit.AfterClass ; import org.junit.Assert ; import org.junit.BeforeClass ; import org.junit.Test ; public class TestCastXSD { private static boolean origValue ; @BeforeClass public static void beforeClass() { origValue = NodeValue.VerboseWarnings; NodeValue.VerboseWarnings = false ; } @AfterClass public static void afterClass() { NodeValue.VerboseWarnings = origValue ; } @Test public void cast_to_integer_01() { testCast ("xsd:integer('1e0'^^xsd:double)", "'1'^^xsd:integer") ; } @Test public void cast_to_integer_02() { testCast ("xsd:byte('1e0'^^xsd:double)", "'1'^^xsd:byte") ; } @Test public void cast_to_integer_03() { testNoCast ("xsd:byte('HaHa'^^xsd:double)") ; } @Test public void cast_to_integer_04() { testCast ("xsd:byte('-1'^^xsd:double)", "'-1'^^xsd:byte") ; } @Test public void cast_to_integer_05() { testNoCast ("xsd:unsignedInt('-1'^^xsd:double)") ; } @Test public void cast_to_integer_06() { testNoCast ("xsd:byte('500'^^xsd:float)") ; } @Test public void cast_to_integer_07() { testCast ("xsd:integer('1e20'^^xsd:double)", "100000000000000000000") ; } @Test public void cast_to_integer_08() { testCast ("xsd:integer('1e19'^^xsd:double)", "10000000000000000000") ; } @Test public void cast_to_integer_09() { testCast ("xsd:integer('1e18'^^xsd:double)", "1000000000000000000") ; } @Test public void cast_to_integer_10() { testCast ("xsd:integer('+1'^^xsd:integer)", "'+1'^^xsd:integer") ; } @Test public void cast_to_integer_11() { testCast ("xsd:byte('+1'^^xsd:integer)", "'+1'^^xsd:byte") ; } @Test public void cast_to_integer_12() { testNoCast ("xsd:byte('HaHa'^^xsd:integer)") ; } @Test public void cast_to_integer_13() { testCast ("xsd:byte('-1'^^xsd:integer)", "'-1'^^xsd:byte") ; } @Test public void cast_to_integer_14() { testNoCast ("xsd:unsignedInt('-1'^^xsd:integer)") ; } @Test public void cast_to_integer_15() { testNoCast ("xsd:byte('500'^^xsd:integer)") ; } @Test public void cast_to_integer_16() { testCast ("xsd:decimal('1000000000000'^^xsd:integer)", "'1000000000000'^^xsd:decimal") ; } @Test public void cast_to_integer_17() { testCast ("xsd:int('1000'^^xsd:integer)", "'1000'^^xsd:int") ; } @Test public void cast_to_integer_18() { testCast ("xsd:integer('1000'^^xsd:int)", "'1000'^^xsd:integer") ; } @Test public void cast_to_integer_19() { testNoCast ("xsd:negativeInteger('1000'^^xsd:int)") ; } @Test public void cast_to_integer_20() { testCast ("xsd:integer('+1'^^xsd:decimal)", "'1'^^xsd:integer") ; } @Test public void cast_to_integer_21() { testNoCast ("xsd:integer('1.4'^^xsd:decimal)") ; } @Test public void cast_to_integer_22() { testCast ("xsd:byte('01.0'^^xsd:decimal)", "'1'^^xsd:byte") ; } @Test public void cast_to_integer_23() { testNoCast ("xsd:byte('HaHa'^^xsd:decimal)") ; } @Test public void cast_to_integer_24() { testCast ("xsd:byte('-1'^^xsd:decimal)", "'-1'^^xsd:byte") ; } @Test public void cast_to_integer_25() { testNoCast ("xsd:unsignedInt('-1'^^xsd:decimal)") ; } @Test public void cast_to_integer_26() { testNoCast ("xsd:byte('500'^^xsd:decimal)") ; } @Test public void cast_decimal_10() { testCast ("xsd:decimal('1e-20'^^xsd:double)", "0.00000000000000000001") ; } @Test public void cast_decimal_11() { testCast ("xsd:decimal('1e-19'^^xsd:double)", "0.0000000000000000001") ; } @Test public void cast_decimal_12() { testCast ("xsd:decimal('1e-18'^^xsd:double)", "0.000000000000000001") ; } @Test public void cast_decimal_13() { testCast ("xsd:decimal('1e0'^^xsd:double)", "1.0") ; } @Test public void cast_decimal_14() { testCast ("xsd:decimal('11e0'^^xsd:double)", "11.0") ; } @Test public void cast_decimal_15() { testCast ("xsd:decimal('-0.01'^^xsd:double)", "-0.01") ; } @Test public void cast_decimal_16() { testCast ("xsd:decimal('1'^^xsd:double)", "'1.0'^^xsd:decimal") ; } @Test public void cast_from_string_01() { testCast ("xsd:integer('+1'^^xsd:string)", "'+1'^^xsd:integer") ; } @Test public void cast_from_string_02() { testNoCast ("xsd:integer('a'^^xsd:string)") ; } @Test public void cast_from_string_03() { testCast ("xsd:integer('11')", "'11'^^xsd:integer") ; } @Test public void cast_from_string_04() { testCast ("xsd:double('12'^^xsd:string)", "'12'^^xsd:double") ; } @Test public void cast_from_string_05() { testNoCast ("xsd:double('abc'^^xsd:string)") ; } @Test public void cast_from_boolean_01() { testCast ("xsd:boolean('true'^^xsd:boolean)", "'true'^^xsd:boolean" ) ; } @Test public void cast_from_boolean_02() { testCast ("xsd:boolean('1'^^xsd:boolean)", "'1'^^xsd:boolean" ) ; } @Test public void cast_from_boolean_03() { testCast ("xsd:integer('1'^^xsd:boolean)", "1" ) ; } @Test public void cast_from_boolean_04() { testCast ("xsd:decimal('false'^^xsd:boolean)", "0.0" ) ; } @Test public void cast_from_boolean_05() { testCast ("xsd:double('false'^^xsd:boolean)", "0.0E0" ) ; } @Test public void cast_to_duration_01() { testCast ("xsd:duration('PT10S')", "'PT10S'^^xsd:duration") ; } @Test public void cast_to_duration_02() { testCast ("xsd:duration('P1DT10S'^^xsd:dayTimeDuration)", "'P1DT10S'^^xsd:duration") ; } @Test public void cast_to_duration_03() { testCast ("xsd:dayTimeDuration('P1Y2M3DT1H2M3S'^^xsd:duration)", "'P3DT1H2M3S'^^xsd:dayTimeDuration") ; } @Test public void cast_to_duration_04() { testCast ("xsd:dayTimeDuration('P1Y'^^xsd:duration)", "'PT0S'^^xsd:dayTimeDuration") ; } @Test public void cast_to_duration_05() { testCast ("xsd:yearMonthDuration('P1Y2M3DT1H2M3S'^^xsd:duration)", "'P1Y2M'^^xsd:yearMonthDuration") ; } // This is what the XSD spec says, not "no cast" @Test public void cast_to_duration_06() { testCast ("xsd:dayTimeDuration('P1Y2M'^^xsd:yearMonthDuration)", "'PT0S'^^xsd:dayTimeDuration") ; } @Test public void cast_to_duration_07() { testCast ("xsd:yearMonthDuration('P1DT10H'^^xsd:dayTimeDuration)", "'P0M'^^xsd:yearMonthDuration") ; } @Test public void cast_to_duration_08() { testCast ("xsd:yearMonthDuration('P1Y2M')", "'P1Y2M'^^xsd:yearMonthDuration") ; } @Test public void cast_to_duration_09() { testCast ("xsd:dayTimeDuration('P1DT10H')", "'P1DT10H'^^xsd:dayTimeDuration") ; } @Test public void cast_to_duration_10() { testCast ("xsd:duration('P1Y2M3DT1H2M3S')", "'P1Y2M3DT1H2M3S'^^xsd:duration") ; } @Test public void cast_to_temporal_01() { testCast ("xsd:date('2015-10-12T15:00:24'^^xsd:dateTime)", "'2015-10-12'^^xsd:date") ; } @Test public void cast_to_temporal_02() { testCast ("xsd:date('2015-10-12T15:00:24+01:00'^^xsd:dateTime)", "'2015-10-12+01:00'^^xsd:date") ; } @Test public void cast_to_temporal_03() { testCast ("xsd:dateTime('2015-10-12'^^xsd:date)", "'2015-10-12T00:00:00'^^xsd:dateTime") ; } @Test public void cast_to_temporal_04() { testCast ("xsd:dateTime('2015-10-12+01:00'^^xsd:date)", "'2015-10-12T00:00:00+01:00'^^xsd:dateTime") ; } @Test public void cast_to_temporal_05() { testCast ("xsd:time('2015-10-12T15:00:24'^^xsd:dateTime)", "'15:00:24'^^xsd:time") ; } @Test public void cast_to_temporal_06() { testCast ("xsd:dateTime('2015-10-12T15:00:24Z')", "'2015-10-12T15:00:24Z'^^xsd:dateTime") ; } @Test public void cast_to_gregorian_01() { testCast ("xsd:gYear('2015-10-12'^^xsd:date)", "'2015'^^xsd:gYear") ; } @Test public void cast_to_gregorian_02() { testCast ("xsd:gMonth('2015-10-12'^^xsd:date)", "'--10'^^xsd:gMonth") ; } @Test public void cast_to_gregorian_03() { testCast ("xsd:gMonthDay('2015-10-12'^^xsd:date)", "'--10-12'^^xsd:gMonthDay") ; } @Test public void cast_to_gregorian_04() { testCast ("xsd:gYearMonth('2015-10-12'^^xsd:date)", "'2015-10'^^xsd:gYearMonth") ; } private void testNoCast(String input) { try { cast(input) ; Assert.fail("Expected ExprEvalException") ; } catch (ExprEvalException ex) {} } private void testCast(String input, String output) { NodeValue nv2 = cast(input) ; Node expected = SSE.parseNode(output) ; Assert.assertEquals(expected, nv2.asNode()) ; } private NodeValue cast(String input$) { Expr input = ExprUtils.parse(input$) ; ARQ.getContext().set(ARQConstants.sysCurrentTime, NodeFactoryExtra.nowAsDateTime()) ; FunctionEnv env = new ExecutionContext(ARQ.getContext(), null, null, null) ; return input.eval(null, env) ; } }