diff --git a/lib/rdf/datatypes/numeric.ex b/lib/rdf/datatypes/numeric.ex index 255caeb..8f57e49 100644 --- a/lib/rdf/datatypes/numeric.ex +++ b/lib/rdf/datatypes/numeric.ex @@ -87,8 +87,8 @@ defmodule RDF.Numeric do def equal_value?(_, _), do: nil defp equal_decimal_value?(%D{} = left, %D{} = right), do: D.equal?(left, right) - defp equal_decimal_value?(%D{} = left, right), do: equal_decimal_value?(left, D.new(right)) - defp equal_decimal_value?(left, %D{} = right), do: equal_decimal_value?(D.new(left), right) + defp equal_decimal_value?(%D{} = left, right), do: equal_decimal_value?(left, new_decimal(right)) + defp equal_decimal_value?(left, %D{} = right), do: equal_decimal_value?(new_decimal(left), right) defp equal_decimal_value?(_, _), do: nil @@ -137,8 +137,8 @@ defmodule RDF.Numeric do def compare(_, _), do: nil defp compare_decimal_value(%D{} = left, %D{} = right), do: D.cmp(left, right) - defp compare_decimal_value(%D{} = left, right), do: compare_decimal_value(left, D.new(right)) - defp compare_decimal_value(left, %D{} = right), do: compare_decimal_value(D.new(left), right) + defp compare_decimal_value(%D{} = left, right), do: compare_decimal_value(left, new_decimal(right)) + defp compare_decimal_value(left, %D{} = right), do: compare_decimal_value(new_decimal(left), right) defp compare_decimal_value(_, _), do: nil @@ -359,7 +359,7 @@ defmodule RDF.Numeric do def round(%Literal{datatype: datatype} = literal, precision) when is_xsd_double(datatype) do if RDF.Double.valid?(literal) do literal.value - |> D.new() + |> new_decimal() |> xpath_round(precision) |> D.to_float() |> RDF.Double.new() @@ -370,7 +370,7 @@ defmodule RDF.Numeric do if type?(datatype) and Literal.valid?(literal) do if precision < 0 do literal.value - |> D.new() + |> new_decimal() |> xpath_round(precision) |> D.to_integer() |> RDF.Integer.new() @@ -559,4 +559,7 @@ defmodule RDF.Numeric do end end + defp new_decimal(value) when is_float(value), do: D.from_float(value) + defp new_decimal(value), do: D.new(value) + end diff --git a/test/unit/datatypes/decimal_test.exs b/test/unit/datatypes/decimal_test.exs index 70ac805..d346c56 100644 --- a/test/unit/datatypes/decimal_test.exs +++ b/test/unit/datatypes/decimal_test.exs @@ -3,36 +3,35 @@ defmodule RDF.DecimalTest do # alias Elixir.Decimal, as: D use RDF.Datatype.Test.Case, datatype: RDF.Decimal, id: RDF.NS.XSD.decimal, valid: %{ - # input => {value lexical canonicalized} - 0 => {Elixir.Decimal.new(0.0), nil, "0.0"}, - 1 => {Elixir.Decimal.new(1.0), nil, "1.0"}, - -1 => {Elixir.Decimal.new(-1.0), nil, "-1.0"}, - 1.0 => {Elixir.Decimal.new(1.0), nil, "1.0"}, - -3.14 => {Elixir.Decimal.new(-3.14), nil, "-3.14"}, - 0.0E2 => {Elixir.Decimal.new(0.0), nil, "0.0"}, - 1.2E3 => {Elixir.Decimal.new("1200.0"), nil, "1200.0"}, - Elixir.Decimal.new(1.0) => {Elixir.Decimal.new(1.0), nil, "1.0"}, - Elixir.Decimal.new(1) => {Elixir.Decimal.new(1.0), nil, "1.0"}, - Elixir.Decimal.new(1.2E3) => {Elixir.Decimal.new("1200.0"), nil, "1200.0"}, - "1" => {Elixir.Decimal.new(1.0), "1", "1.0" }, - "01" => {Elixir.Decimal.new(1.0), "01", "1.0" }, - "0123" => {Elixir.Decimal.new(123.0), "0123", "123.0" }, - "-1" => {Elixir.Decimal.new(-1.0), "-1", "-1.0" }, - "1." => {Elixir.Decimal.new(1.0), "1.", "1.0" }, - "1.0" => {Elixir.Decimal.new(1.0), nil, "1.0" }, - "1.000000000" => {Elixir.Decimal.new(1.0), "1.000000000", "1.0" }, - "+001.00" => {Elixir.Decimal.new(1.0), "+001.00", "1.0" }, - "123.456" => {Elixir.Decimal.new(123.456), nil, "123.456" }, - "0123.456" => {Elixir.Decimal.new(123.456), "0123.456", "123.456" }, - "010.020" => {Elixir.Decimal.new(10.02), "010.020", "10.02" }, - "2.3" => {Elixir.Decimal.new(2.3), nil, "2.3" }, - "2.345" => {Elixir.Decimal.new(2.345), nil, "2.345" }, - "2.234000005" => {Elixir.Decimal.new(2.234000005), nil, "2.234000005" }, - "1.234567890123456789012345789" - => {Elixir.Decimal.new("1.234567890123456789012345789"), - nil, "1.234567890123456789012345789" }, - ".3" => {Elixir.Decimal.new(0.3), ".3", "0.3" }, - "-.3" => {Elixir.Decimal.new(-0.3), "-.3", "-0.3" }, + # input => {value lexical canonicalized} + 0 => {Elixir.Decimal.from_float(0.0), nil, "0.0"}, + 1 => {Elixir.Decimal.from_float(1.0), nil, "1.0"}, + -1 => {Elixir.Decimal.from_float(-1.0), nil, "-1.0"}, + 1.0 => {Elixir.Decimal.from_float(1.0), nil, "1.0"}, + -3.14 => {Elixir.Decimal.from_float(-3.14), nil, "-3.14"}, + 0.0E2 => {Elixir.Decimal.from_float(0.0), nil, "0.0"}, + 1.2E3 => {Elixir.Decimal.new("1200.0"), nil, "1200.0"}, + Elixir.Decimal.from_float(1.0) => {Elixir.Decimal.from_float(1.0), nil, "1.0"}, + Elixir.Decimal.new(1) => {Elixir.Decimal.from_float(1.0), nil, "1.0"}, + Elixir.Decimal.from_float(1.2E3) => {Elixir.Decimal.new("1200.0"), nil, "1200.0"}, + "1" => {Elixir.Decimal.from_float(1.0), "1", "1.0" }, + "01" => {Elixir.Decimal.from_float(1.0), "01", "1.0" }, + "0123" => {Elixir.Decimal.from_float(123.0), "0123", "123.0" }, + "-1" => {Elixir.Decimal.from_float(-1.0), "-1", "-1.0" }, + "1." => {Elixir.Decimal.from_float(1.0), "1.", "1.0" }, + "1.0" => {Elixir.Decimal.from_float(1.0), nil, "1.0" }, + "1.000000000" => {Elixir.Decimal.from_float(1.0), "1.000000000", "1.0" }, + "+001.00" => {Elixir.Decimal.from_float(1.0), "+001.00", "1.0" }, + "123.456" => {Elixir.Decimal.from_float(123.456), nil, "123.456" }, + "0123.456" => {Elixir.Decimal.from_float(123.456), "0123.456", "123.456" }, + "010.020" => {Elixir.Decimal.from_float(10.02), "010.020", "10.02" }, + "2.3" => {Elixir.Decimal.from_float(2.3), nil, "2.3" }, + "2.345" => {Elixir.Decimal.from_float(2.345), nil, "2.345" }, + "2.234000005" => {Elixir.Decimal.from_float(2.234000005), nil, "2.234000005" }, + "1.234567890123456789012345789" => {Elixir.Decimal.new("1.234567890123456789012345789"), + nil, "1.234567890123456789012345789" }, + ".3" => {Elixir.Decimal.from_float(0.3), ".3", "0.3" }, + "-.3" => {Elixir.Decimal.from_float(-0.3), "-.3", "-0.3" }, }, invalid: ~w(foo 10.1e1 12.xyz 3,5 NaN Inf) ++ [true, false, "1.0 foo", "foo 1.0", Elixir.Decimal.new("NaN"), Elixir.Decimal.new("Inf")] diff --git a/test/unit/datatypes/numeric_test.exs b/test/unit/datatypes/numeric_test.exs index 18c7aed..819849c 100644 --- a/test/unit/datatypes/numeric_test.exs +++ b/test/unit/datatypes/numeric_test.exs @@ -388,7 +388,7 @@ defmodule RDF.NumericTest do assert Numeric.abs(42) == RDF.integer(42) assert Numeric.abs(-42) == RDF.integer(42) assert Numeric.abs(-3.14) == RDF.double(3.14) - assert Numeric.abs(D.new(-3.14)) == RDF.decimal(3.14) + assert Numeric.abs(D.from_float(-3.14)) == RDF.decimal(3.14) assert Numeric.abs("foo") == nil assert Numeric.abs(:foo) == nil end @@ -425,7 +425,7 @@ defmodule RDF.NumericTest do test "coercion" do assert Numeric.round(-42) == RDF.integer(-42) assert Numeric.round(-3.14) == RDF.double(-3.0) - assert Numeric.round(D.new(3.14)) == RDF.decimal("3") + assert Numeric.round(D.from_float(3.14)) == RDF.decimal("3") assert Numeric.round("foo") == nil assert Numeric.round(:foo) == nil end @@ -466,7 +466,7 @@ defmodule RDF.NumericTest do test "coercion" do assert Numeric.round(-42, 1) == RDF.integer(-42) assert Numeric.round(-3.14, 1) == RDF.double(-3.1) - assert Numeric.round(D.new(3.14), 1) == RDF.decimal("3.1") + assert Numeric.round(D.from_float(3.14), 1) == RDF.decimal("3.1") assert Numeric.round("foo", 1) == nil assert Numeric.round(:foo, 1) == nil end @@ -501,7 +501,7 @@ defmodule RDF.NumericTest do test "coercion" do assert Numeric.ceil(-42) == RDF.integer(-42) assert Numeric.ceil(-3.14) == RDF.double("-3") - assert Numeric.ceil(D.new(3.14)) == RDF.decimal("4") + assert Numeric.ceil(D.from_float(3.14)) == RDF.decimal("4") assert Numeric.ceil("foo") == nil assert Numeric.ceil(:foo) == nil end @@ -536,7 +536,7 @@ defmodule RDF.NumericTest do test "coercion" do assert Numeric.floor(-42) == RDF.integer(-42) assert Numeric.floor(-3.14) == RDF.double("-4") - assert Numeric.floor(D.new(3.14)) == RDF.decimal("3") + assert Numeric.floor(D.from_float(3.14)) == RDF.decimal("3") assert Numeric.floor("foo") == nil assert Numeric.floor(:foo) == nil end diff --git a/test/unit/equality_test.exs b/test/unit/equality_test.exs index 4b8931b..bf9be0f 100644 --- a/test/unit/equality_test.exs +++ b/test/unit/equality_test.exs @@ -188,14 +188,14 @@ defmodule RDF.EqualityTest do {RDF.integer(42), D.new(42)}, {RDF.decimal(42), 42}, {RDF.decimal(3.14), 3.14}, - {RDF.decimal(3.14), D.new(3.14)}, + {RDF.decimal(3.14), D.from_float(3.14)}, {RDF.double(42), 42}, {RDF.double(3.14), 3.14}, - {RDF.double(3.14), D.new(3.14)}, + {RDF.double(3.14), D.from_float(3.14)}, ] @value_unequal_numerics_by_coercion [ {RDF.integer(3), 3.14}, - {RDF.integer(3), D.new(3.14)}, + {RDF.integer(3), D.from_float(3.14)}, {RDF.double(3.14), 3}, {RDF.decimal(3.14), 3}, ] diff --git a/test/unit/term_test.exs b/test/unit/term_test.exs index 78c3b27..709224f 100644 --- a/test/unit/term_test.exs +++ b/test/unit/term_test.exs @@ -36,7 +36,7 @@ defmodule RDF.TermTest do end test "with decimal" do - assert D.new(3.14) |> RDF.Term.coerce() == RDF.decimal(3.14) + assert D.from_float(3.14) |> RDF.Term.coerce() == RDF.decimal(3.14) end test "with datetime" do @@ -101,7 +101,7 @@ defmodule RDF.TermTest do end test "with decimal" do - assert D.new(3.14) |> RDF.Term.value() == D.new(3.14) + assert D.from_float(3.14) |> RDF.Term.value() == D.from_float(3.14) end test "with datetime" do