Add minExclusive and maxExclusive XSD datatype facets

This commit is contained in:
Marcel Otto 2020-05-17 21:51:03 +02:00
parent 09dceb0e35
commit 2c4b5f604a
21 changed files with 189 additions and 32 deletions

View file

@ -14,6 +14,8 @@ defmodule RDF.XSD.Decimal do
def_applicable_facet RDF.XSD.Facets.MinInclusive
def_applicable_facet RDF.XSD.Facets.MaxInclusive
def_applicable_facet RDF.XSD.Facets.MinExclusive
def_applicable_facet RDF.XSD.Facets.MaxExclusive
@doc false
def min_inclusive_conform?(min_inclusive, value, _lexical) do
@ -25,6 +27,16 @@ defmodule RDF.XSD.Decimal do
not (D.cmp(value, D.new(max_inclusive)) == :gt)
end
@doc false
def min_exclusive_conform?(min_exclusive, value, _lexical) do
D.cmp(value, D.new(min_exclusive)) == :gt
end
@doc false
def max_exclusive_conform?(max_exclusive, value, _lexical) do
D.cmp(value, D.new(max_exclusive)) == :lt
end
@impl RDF.XSD.Datatype
def lexical_mapping(lexical, opts) do

View file

@ -15,6 +15,8 @@ defmodule RDF.XSD.Double do
def_applicable_facet RDF.XSD.Facets.MinInclusive
def_applicable_facet RDF.XSD.Facets.MaxInclusive
def_applicable_facet RDF.XSD.Facets.MinExclusive
def_applicable_facet RDF.XSD.Facets.MaxExclusive
@doc false
def min_inclusive_conform?(min_inclusive, value, _lexical) do
@ -26,6 +28,17 @@ defmodule RDF.XSD.Double do
value <= max_inclusive
end
@doc false
def min_exclusive_conform?(min_exclusive, value, _lexical) do
value > min_exclusive
end
@doc false
def max_exclusive_conform?(max_exclusive, value, _lexical) do
value < max_exclusive
end
@impl RDF.XSD.Datatype
def lexical_mapping(lexical, opts) do
case Float.parse(lexical) do

View file

@ -14,6 +14,9 @@ defmodule RDF.XSD.Integer do
def_applicable_facet RDF.XSD.Facets.MinInclusive
def_applicable_facet RDF.XSD.Facets.MaxInclusive
def_applicable_facet RDF.XSD.Facets.MinExclusive
def_applicable_facet RDF.XSD.Facets.MaxExclusive
@doc false
def min_inclusive_conform?(min_inclusive, value, _lexical) do
@ -25,6 +28,16 @@ defmodule RDF.XSD.Integer do
value <= max_inclusive
end
@doc false
def min_exclusive_conform?(min_exclusive, value, _lexical) do
value > min_exclusive
end
@doc false
def max_exclusive_conform?(max_exclusive, value, _lexical) do
value < max_exclusive
end
@impl RDF.XSD.Datatype
def lexical_mapping(lexical, _) do
case Integer.parse(lexical) do

View file

@ -0,0 +1,3 @@
defmodule RDF.XSD.Facets.MaxExclusive do
use RDF.XSD.Facet, name: :max_exclusive, type: integer
end

View file

@ -0,0 +1,3 @@
defmodule RDF.XSD.Facets.MinExclusive do
use RDF.XSD.Facet, name: :min_exclusive, type: integer
end

View file

@ -5,10 +5,18 @@ defmodule RDF.XSD.ByteTest do
base: RDF.XSD.Short,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: -128,
max_inclusive: 127
max_inclusive: 127,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_bytes(),
invalid: RDF.XSD.TestData.invalid_bytes()

View file

@ -6,10 +6,17 @@ defmodule RDF.XSD.DecimalTest do
name: "decimal",
primitive: true,
comparable_datatypes: [RDF.XSD.Integer, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: nil,
max_inclusive: nil
max_inclusive: nil,
min_exclusive: nil,
max_exclusive: nil
},
valid: %{
# input => {value, lexical, canonicalized}

View file

@ -4,10 +4,17 @@ defmodule RDF.XSD.DoubleTest do
name: "double",
primitive: true,
comparable_datatypes: [RDF.XSD.Integer, RDF.XSD.Decimal],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: nil,
max_inclusive: nil
max_inclusive: nil,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_floats(),
invalid: RDF.XSD.TestData.invalid_floats()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.FloatTest do
base: RDF.XSD.Double,
base_primitive: RDF.XSD.Double,
comparable_datatypes: [RDF.XSD.Integer, RDF.XSD.Decimal],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: nil,
max_inclusive: nil
max_inclusive: nil,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_floats(),
invalid: RDF.XSD.TestData.invalid_floats()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.IntTest do
base: RDF.XSD.Long,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: -2_147_483_648,
max_inclusive: 2_147_483_647
max_inclusive: 2_147_483_647,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_ints(),
invalid: RDF.XSD.TestData.invalid_ints()

View file

@ -4,10 +4,17 @@ defmodule RDF.XSD.IntegerTest do
name: "integer",
primitive: true,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: nil,
max_inclusive: nil
max_inclusive: nil,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_integers(),
invalid: RDF.XSD.TestData.invalid_integers()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.LongTest do
base: RDF.XSD.Integer,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: -9_223_372_036_854_775_808,
max_inclusive: 9_223_372_036_854_775_807
max_inclusive: 9_223_372_036_854_775_807,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_longs(),
invalid: RDF.XSD.TestData.invalid_longs()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.NegativeIntegerTest do
base: RDF.XSD.NonPositiveInteger,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: nil,
max_inclusive: -1
max_inclusive: -1,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_negative_integers(),
invalid: RDF.XSD.TestData.invalid_negative_integers()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.NonNegativeIntegerTest do
base: RDF.XSD.Integer,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: 0,
max_inclusive: nil
max_inclusive: nil,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_non_negative_integers(),
invalid: RDF.XSD.TestData.invalid_non_negative_integers()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.NonPositiveIntegerTest do
base: RDF.XSD.Integer,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: nil,
max_inclusive: 0
max_inclusive: 0,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_non_positive_integers(),
invalid: RDF.XSD.TestData.invalid_non_positive_integers()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.PositiveIntegerTest do
base: RDF.XSD.NonNegativeInteger,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: 1,
max_inclusive: nil
max_inclusive: nil,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_positive_integers(),
invalid: RDF.XSD.TestData.invalid_positive_integers()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.ShortTest do
base: RDF.XSD.Int,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: -32768,
max_inclusive: 32767
max_inclusive: 32767,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_shorts(),
invalid: RDF.XSD.TestData.invalid_shorts()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.UnsignedByteTest do
base: RDF.XSD.UnsignedShort,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: 0,
max_inclusive: 255
max_inclusive: 255,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_unsigned_bytes(),
invalid: RDF.XSD.TestData.invalid_unsigned_bytes()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.UnsignedIntTest do
base: RDF.XSD.UnsignedLong,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: 0,
max_inclusive: 4_294_967_295
max_inclusive: 4_294_967_295,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_unsigned_ints(),
invalid: RDF.XSD.TestData.invalid_unsigned_ints()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.UnsignedLongTest do
base: RDF.XSD.NonNegativeInteger,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: 0,
max_inclusive: 18_446_744_073_709_551_615
max_inclusive: 18_446_744_073_709_551_615,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_unsigned_longs(),
invalid: RDF.XSD.TestData.invalid_unsigned_longs()

View file

@ -5,10 +5,17 @@ defmodule RDF.XSD.UnsignedShortTest do
base: RDF.XSD.UnsignedInt,
base_primitive: RDF.XSD.Integer,
comparable_datatypes: [RDF.XSD.Decimal, RDF.XSD.Double],
applicable_facets: [RDF.XSD.Facets.MinInclusive, RDF.XSD.Facets.MaxInclusive],
applicable_facets: [
RDF.XSD.Facets.MinInclusive,
RDF.XSD.Facets.MaxInclusive,
RDF.XSD.Facets.MinExclusive,
RDF.XSD.Facets.MaxExclusive,
],
facets: %{
min_inclusive: 0,
max_inclusive: 65535
max_inclusive: 65535,
min_exclusive: nil,
max_exclusive: nil
},
valid: RDF.XSD.TestData.valid_unsigned_shorts(),
invalid: RDF.XSD.TestData.invalid_unsigned_shorts()