Fix equality comparison of invalid literals

This commit is contained in:
Marcel Otto 2018-09-14 21:31:16 +02:00
parent 6d4c0b2a37
commit c746706a10
3 changed files with 46 additions and 10 deletions

View file

@ -204,6 +204,11 @@ defmodule RDF.Datatype do
def valid?(_), do: false def valid?(_), do: false
def equal_value?(%Literal{uncanonical_lexical: lexical1, datatype: @id, value: nil},
%Literal{uncanonical_lexical: lexical2, datatype: @id}) do
lexical1 == lexical2
end
def equal_value?(%Literal{datatype: @id} = literal1, %Literal{datatype: @id} = literal2) do def equal_value?(%Literal{datatype: @id} = literal1, %Literal{datatype: @id} = literal2) do
canonical(literal1).value == canonical(literal2).value canonical(literal1).value == canonical(literal2).value
end end

View file

@ -47,12 +47,6 @@ defmodule RDF.Numeric do
def literal?(%Literal{datatype: datatype}), do: type?(datatype) def literal?(%Literal{datatype: datatype}), do: type?(datatype)
def literal?(_), do: false def literal?(_), do: false
# @doc """
# Returns if a given datatype is a numeric datatype for integers.
# """
# def integer_type?(type), do: MapSet.member?(@integer_types, type)
@doc """ @doc """
Tests for numeric value equality of two numeric literals. Tests for numeric value equality of two numeric literals.
@ -66,6 +60,11 @@ defmodule RDF.Numeric do
""" """
def equal_value?(left, right) def equal_value?(left, right)
def equal_value?(%Literal{uncanonical_lexical: lexical1, datatype: dt, value: nil},
%Literal{uncanonical_lexical: lexical2, datatype: dt}) do
lexical1 == lexical2
end
def equal_value?(%Literal{datatype: left_datatype, value: left}, def equal_value?(%Literal{datatype: left_datatype, value: left},
%Literal{datatype: right_datatype, value: right}) %Literal{datatype: right_datatype, value: right})
when is_xsd_decimal(left_datatype) or is_xsd_decimal(right_datatype), when is_xsd_decimal(left_datatype) or is_xsd_decimal(right_datatype),

View file

@ -87,20 +87,28 @@ defmodule RDF.EqualityTest do
describe "RDF.Boolean" do describe "RDF.Boolean" do
@term_equal_booleans [ @term_equal_booleans [
{RDF.true, RDF.true}, {RDF.true, RDF.true},
{RDF.false, RDF.false}, {RDF.false, RDF.false},
# invalid literals
{RDF.boolean("foo"), RDF.boolean("foo")},
] ]
@term_unequal_booleans [ @term_unequal_booleans [
{RDF.true, RDF.false}, {RDF.true, RDF.false},
{RDF.false, RDF.true}, {RDF.false, RDF.true},
# invalid literals
{RDF.boolean("foo"), RDF.boolean("bar")},
] ]
@value_equal_booleans [ @value_equal_booleans [
{RDF.true, RDF.boolean("TRUE")}, {RDF.true, RDF.boolean("TRUE")},
{RDF.boolean(1), RDF.true}, {RDF.boolean(1), RDF.true},
# invalid literals
{RDF.boolean("foo"), RDF.boolean("foo")},
] ]
@value_unequal_booleans [ @value_unequal_booleans [
{RDF.true, RDF.boolean("FALSE")}, {RDF.true, RDF.boolean("FALSE")},
{RDF.boolean(0), RDF.true}, {RDF.boolean(0), RDF.true},
# invalid literals
{RDF.boolean("foo"), RDF.boolean("bar")},
] ]
@incomparable_booleans [ @incomparable_booleans [
{RDF.true, nil}, {RDF.true, nil},
@ -120,9 +128,17 @@ defmodule RDF.EqualityTest do
@term_equal_numerics [ @term_equal_numerics [
{RDF.integer(42), RDF.integer(42)}, {RDF.integer(42), RDF.integer(42)},
{RDF.integer("042"), RDF.integer("042")}, {RDF.integer("042"), RDF.integer("042")},
# invalid literals
{RDF.integer("foo"), RDF.integer("foo")},
{RDF.decimal("foo"), RDF.decimal("foo")},
{RDF.double("foo"), RDF.double("foo")},
] ]
@term_unequal_numerics [ @term_unequal_numerics [
{RDF.integer(1), RDF.integer(2)}, {RDF.integer(1), RDF.integer(2)},
# invalid literals
{RDF.integer("foo"), RDF.integer("bar")},
{RDF.decimal("foo"), RDF.decimal("bar")},
{RDF.double("foo"), RDF.double("bar")},
] ]
@value_equal_numerics [ @value_equal_numerics [
{RDF.integer("42"), RDF.integer("042")}, {RDF.integer("42"), RDF.integer("042")},
@ -133,10 +149,18 @@ defmodule RDF.EqualityTest do
{RDF.double(3.14), RDF.decimal(3.14)}, {RDF.double(3.14), RDF.decimal(3.14)},
{RDF.double("+0"), RDF.double("-0")}, {RDF.double("+0"), RDF.double("-0")},
{RDF.decimal("+0"), RDF.decimal("-0")}, {RDF.decimal("+0"), RDF.decimal("-0")},
# invalid literals
{RDF.integer("foo"), RDF.integer("foo")},
{RDF.decimal("foo"), RDF.decimal("foo")},
{RDF.double("foo"), RDF.double("foo")},
] ]
@value_unequal_numerics [ @value_unequal_numerics [
{RDF.integer("1"), RDF.double("1.1")}, {RDF.integer("1"), RDF.double("1.1")},
{RDF.integer("1"), RDF.decimal("1.1")}, {RDF.integer("1"), RDF.decimal("1.1")},
# invalid literals
{RDF.integer("foo"), RDF.integer("bar")},
{RDF.decimal("foo"), RDF.decimal("bar")},
{RDF.double("foo"), RDF.double("bar")},
] ]
@incomparable_numerics [ @incomparable_numerics [
{RDF.string("42"), RDF.integer(42)}, {RDF.string("42"), RDF.integer(42)},
@ -154,9 +178,13 @@ defmodule RDF.EqualityTest do
@term_equal_datetimes [ @term_equal_datetimes [
{RDF.date_time("2002-04-02T12:00:00-01:00"), RDF.date_time("2002-04-02T12:00:00-01:00")}, {RDF.date_time("2002-04-02T12:00:00-01:00"), RDF.date_time("2002-04-02T12:00:00-01:00")},
{RDF.date_time("2002-04-02T12:00:00"), RDF.date_time("2002-04-02T12:00:00")}, {RDF.date_time("2002-04-02T12:00:00"), RDF.date_time("2002-04-02T12:00:00")},
# invalid literals
{RDF.date_time("foo"), RDF.date_time("foo")},
] ]
@term_unequal_datetimes [ @term_unequal_datetimes [
{RDF.date_time("2002-04-02T12:00:00"), RDF.date_time("2002-04-02T17:00:00")}, {RDF.date_time("2002-04-02T12:00:00"), RDF.date_time("2002-04-02T17:00:00")},
# invalid literals
{RDF.date_time("foo"), RDF.date_time("bar")},
] ]
@value_equal_datetimes [ @value_equal_datetimes [
{RDF.date_time("2002-04-02T12:00:00-01:00"), RDF.date_time("2002-04-02T17:00:00+04:00")}, {RDF.date_time("2002-04-02T12:00:00-01:00"), RDF.date_time("2002-04-02T17:00:00+04:00")},
@ -164,9 +192,13 @@ defmodule RDF.EqualityTest do
{RDF.date_time("1999-12-31T24:00:00"), RDF.date_time("2000-01-01T00:00:00")}, {RDF.date_time("1999-12-31T24:00:00"), RDF.date_time("2000-01-01T00:00:00")},
# TODO: Assume that the dynamic context provides an implicit timezone value of -05:00 # TODO: Assume that the dynamic context provides an implicit timezone value of -05:00
# {RDF.date_time("2002-04-02T12:00:00"), RDF.date_time("2002-04-02T23:00:00+06:00")}, # {RDF.date_time("2002-04-02T12:00:00"), RDF.date_time("2002-04-02T23:00:00+06:00")},
# invalid literals
{RDF.date_time("foo"), RDF.date_time("foo")},
] ]
@value_unequal_datetimes [ @value_unequal_datetimes [
{RDF.date_time("2005-04-04T24:00:00"), RDF.date_time("2005-04-04T00:00:00")}, {RDF.date_time("2005-04-04T24:00:00"), RDF.date_time("2005-04-04T00:00:00")},
# invalid literals
{RDF.date_time("foo"), RDF.date_time("bar")},
] ]
@incomparable_datetimes [ @incomparable_datetimes [
{RDF.string("2002-04-02T12:00:00-01:00"), RDF.date_time("2002-04-02T12:00:00-01:00")}, {RDF.string("2002-04-02T12:00:00-01:00"), RDF.date_time("2002-04-02T12:00:00-01:00")},