From 1c7cad39beaca2b53563fd4086aea7a005057f3c Mon Sep 17 00:00:00 2001 From: Marcel Otto Date: Tue, 21 Aug 2018 03:27:48 +0200 Subject: [PATCH] Fix datatype and lexical form of result of various numeric functions - to match SPARQL semantics --- lib/rdf/datatypes/numeric.ex | 15 +++++++++------ test/unit/datatypes/numeric_test.exs | 28 ++++++++++++++-------------- 2 files changed, 23 insertions(+), 20 deletions(-) diff --git a/lib/rdf/datatypes/numeric.ex b/lib/rdf/datatypes/numeric.ex index 5f8a830..6100644 100644 --- a/lib/rdf/datatypes/numeric.ex +++ b/lib/rdf/datatypes/numeric.ex @@ -283,6 +283,7 @@ defmodule RDF.Numeric do if RDF.Decimal.valid?(literal) do literal.value |> xpath_round(precision) + |> to_string() |> RDF.Decimal.new() end end @@ -333,8 +334,8 @@ defmodule RDF.Numeric do if RDF.Decimal.valid?(literal) do literal.value |> D.round(0, (if literal.value.sign == -1, do: :down, else: :up)) - |> D.to_integer() - |> RDF.Integer.new() + |> D.to_string() + |> RDF.Decimal.new() end end @@ -346,7 +347,8 @@ defmodule RDF.Numeric do literal.value |> Float.ceil() |> trunc() - |> RDF.Integer.new() + |> to_string() + |> RDF.Double.new() end end @@ -370,8 +372,8 @@ defmodule RDF.Numeric do if RDF.Decimal.valid?(literal) do literal.value |> D.round(0, (if literal.value.sign == -1, do: :up, else: :down)) - |> D.to_integer() - |> RDF.Integer.new() + |> D.to_string() + |> RDF.Decimal.new() end end @@ -383,7 +385,8 @@ defmodule RDF.Numeric do literal.value |> Float.floor() |> trunc() - |> RDF.Integer.new() + |> to_string() + |> RDF.Double.new() end end diff --git a/test/unit/datatypes/numeric_test.exs b/test/unit/datatypes/numeric_test.exs index b517017..b73d8ca 100644 --- a/test/unit/datatypes/numeric_test.exs +++ b/test/unit/datatypes/numeric_test.exs @@ -364,9 +364,9 @@ defmodule RDF.NumericTest do end test "with xsd:decimal" do - assert RDF.decimal(2.5) |> Numeric.round() == RDF.decimal(3.0) - assert RDF.decimal(2.4999) |> Numeric.round() == RDF.decimal(2.0) - assert RDF.decimal(-2.5) |> Numeric.round() == RDF.decimal(-2.0) + assert RDF.decimal(2.5) |> Numeric.round() == RDF.decimal("3") + assert RDF.decimal(2.4999) |> Numeric.round() == RDF.decimal("2") + assert RDF.decimal(-2.5) |> Numeric.round() == RDF.decimal("-2") end test "with invalid numeric literals" do @@ -397,9 +397,9 @@ defmodule RDF.NumericTest do end test "with xsd:decimal" do - assert RDF.decimal(1.125) |> Numeric.round(2) == RDF.decimal(1.13) - assert RDF.decimal(2.4999) |> Numeric.round(2) == RDF.decimal(2.5) - assert RDF.decimal(-2.55) |> Numeric.round(1) == RDF.decimal(-2.5) + assert RDF.decimal(1.125) |> Numeric.round(2) == RDF.decimal("1.13") + assert RDF.decimal(2.4999) |> Numeric.round(2) == RDF.decimal("2.50") + assert RDF.decimal(-2.55) |> Numeric.round(1) == RDF.decimal("-2.5") end test "with invalid numeric literals" do @@ -416,8 +416,8 @@ defmodule RDF.NumericTest do end test "with xsd:double" do - assert RDF.double(10.5) |> Numeric.ceil() == RDF.integer(11) - assert RDF.double(-10.5) |> Numeric.ceil() == RDF.integer(-10) + assert RDF.double(10.5) |> Numeric.ceil() == RDF.double("11") + assert RDF.double(-10.5) |> Numeric.ceil() == RDF.double("-10") assert RDF.double("INF") |> Numeric.ceil() == RDF.double("INF") assert RDF.double("-INF") |> Numeric.ceil() == RDF.double("-INF") @@ -425,8 +425,8 @@ defmodule RDF.NumericTest do end test "with xsd:decimal" do - assert RDF.decimal(10.5) |> Numeric.ceil() == RDF.integer(11) - assert RDF.decimal(-10.5) |> Numeric.ceil() == RDF.integer(-10) + assert RDF.decimal(10.5) |> Numeric.ceil() == RDF.decimal("11") + assert RDF.decimal(-10.5) |> Numeric.ceil() == RDF.decimal("-10") end test "with invalid numeric literals" do @@ -443,8 +443,8 @@ defmodule RDF.NumericTest do end test "with xsd:double" do - assert RDF.double(10.5) |> Numeric.floor() == RDF.integer(10) - assert RDF.double(-10.5) |> Numeric.floor() == RDF.integer(-11) + assert RDF.double(10.5) |> Numeric.floor() == RDF.double("10") + assert RDF.double(-10.5) |> Numeric.floor() == RDF.double("-11") assert RDF.double("INF") |> Numeric.floor() == RDF.double("INF") assert RDF.double("-INF") |> Numeric.floor() == RDF.double("-INF") @@ -452,8 +452,8 @@ defmodule RDF.NumericTest do end test "with xsd:decimal" do - assert RDF.decimal(10.5) |> Numeric.floor() == RDF.integer(10) - assert RDF.decimal(-10.5) |> Numeric.floor() == RDF.integer(-11) + assert RDF.decimal(10.5) |> Numeric.floor() == RDF.decimal("10") + assert RDF.decimal(-10.5) |> Numeric.floor() == RDF.decimal("-11") end test "with invalid numeric literals" do