diff --git a/lib/rdf/data.ex b/lib/rdf/data.ex index 717e7c8..6d41cb2 100644 --- a/lib/rdf/data.ex +++ b/lib/rdf/data.ex @@ -54,3 +54,26 @@ defprotocol RDF.Data do def statement_count(data) end + +defimpl RDF.Data, for: RDF.Description do + def delete(%RDF.Description{subject: subject} = description, + %RDF.Description{subject: other_subject}) + when subject != other_subject, + do: description + def delete(description, statements), do: RDF.Description.delete(description, statements) + def pop(description), do: RDF.Description.pop(description) + + def include?(description, statements), + do: RDF.Description.include?(description, statements) + + def statements(description), do: RDF.Description.statements(description) + def predicates(description), do: RDF.Description.predicates(description) + def objects(description), do: RDF.Description.objects(description) + def subjects(%RDF.Description{subject: subject}), do: MapSet.new([subject]) + + def resources(%RDF.Description{subject: subject} = description), + do: RDF.Description.resources(description) |> MapSet.put(subject) + + def subject_count(_), do: 1 + def statement_count(description), do: RDF.Description.count(description) +end diff --git a/lib/rdf/description.ex b/lib/rdf/description.ex index 814d7df..129d38a 100644 --- a/lib/rdf/description.ex +++ b/lib/rdf/description.ex @@ -519,26 +519,3 @@ defimpl Enumerable, for: RDF.Description do def member?(desc, triple), do: {:ok, RDF.Description.include?(desc, triple)} def count(desc), do: {:ok, RDF.Description.count(desc)} end - -defimpl RDF.Data, for: RDF.Description do - def delete(%RDF.Description{subject: subject} = description, - %RDF.Description{subject: other_subject}) - when subject != other_subject, - do: description - def delete(description, statements), do: RDF.Description.delete(description, statements) - def pop(description), do: RDF.Description.pop(description) - - def include?(description, statements), - do: RDF.Description.include?(description, statements) - - def statements(description), do: RDF.Description.statements(description) - def predicates(description), do: RDF.Description.predicates(description) - def objects(description), do: RDF.Description.objects(description) - def subjects(%RDF.Description{subject: subject}), do: MapSet.new([subject]) - - def resources(%RDF.Description{subject: subject} = description), - do: RDF.Description.resources(description) |> MapSet.put(subject) - - def subject_count(_), do: 1 - def statement_count(description), do: RDF.Description.count(description) -end diff --git a/test/support/rdf_case.ex b/test/support/rdf_case.ex index 3f849bc..3fa8b11 100644 --- a/test/support/rdf_case.ex +++ b/test/support/rdf_case.ex @@ -16,6 +16,8 @@ defmodule RDF.Test.Case do import RDF, only: [uri: 1, literal: 1, bnode: 1] import unquote(__MODULE__) + + import RDF.Sigils end end diff --git a/test/unit/data_test.exs b/test/unit/data_test.exs new file mode 100644 index 0000000..b156ddd --- /dev/null +++ b/test/unit/data_test.exs @@ -0,0 +1,67 @@ +defmodule RDF.DataTest do + use RDF.Test.Case + + describe "RDF.Data protocol implementation of RDF.Description" do + setup do + {:ok, + description: Description.new(EX.S, [ + {EX.p1, [EX.O1, EX.O2]}, + {EX.p2, EX.O3}, + {EX.p3, [~B, ~L"bar"]}, + ]) + } + end + + test "delete", %{description: description} do + assert RDF.Data.delete(description, {EX.S, EX.p1, EX.O2}) == + Description.delete(description, {EX.S, EX.p1, EX.O2}) + + assert RDF.Data.delete(description, {EX.Other, EX.p1, EX.O2}) == description + end + + test "deleting a Description with a different subject does nothing", %{description: description} do + assert RDF.Data.delete(description, + %Description{description | subject: EX.Other}) == description + end + + test "pop", %{description: description} do + assert RDF.Data.pop(description) == Description.pop(description) + end + + test "include?", %{description: description} do + assert RDF.Data.include?(description, {EX.S, EX.p1, EX.O2}) + refute RDF.Data.include?(description, {EX.Other, EX.p1, EX.O2}) + end + + test "statements", %{description: description} do + assert RDF.Data.statements(description) == Description.statements(description) + end + + test "subjects", %{description: description} do + assert RDF.Data.subjects(description) == MapSet.new([uri(EX.S)]) + end + + test "predicates", %{description: description} do + assert RDF.Data.predicates(description) == MapSet.new([EX.p1, EX.p2, EX.p3]) + end + + test "objects", %{description: description} do + assert RDF.Data.objects(description) == + MapSet.new([uri(EX.O1), uri(EX.O2), uri(EX.O3), ~B]) + end + + test "resources", %{description: description} do + assert RDF.Data.resources(description) == + MapSet.new([uri(EX.S), EX.p1, EX.p2, EX.p3, uri(EX.O1), uri(EX.O2), uri(EX.O3), ~B]) + end + + test "subject_count", %{description: description} do + assert RDF.Data.subject_count(description) == 1 + end + + test "statement_count", %{description: description} do + assert RDF.Data.statement_count(description) == 5 + end + end + +end diff --git a/test/unit/description_test.exs b/test/unit/description_test.exs index 1b0ea5d..4440e6a 100644 --- a/test/unit/description_test.exs +++ b/test/unit/description_test.exs @@ -382,68 +382,4 @@ defmodule RDF.DescriptionTest do end - describe "RDF.Data protocol implementation" do - setup do - {:ok, - description: Description.new(EX.S, [ - {EX.p1, [EX.O1, EX.O2]}, - {EX.p2, EX.O3}, - {EX.p3, [~B, ~L"bar"]}, - ]) - } - end - - test "delete", %{description: description} do - assert RDF.Data.delete(description, {EX.S, EX.p1, EX.O2}) == - Description.delete(description, {EX.S, EX.p1, EX.O2}) - - assert RDF.Data.delete(description, {EX.Other, EX.p1, EX.O2}) == description - end - - test "deleting a Description with a different subject does nothing", %{description: description} do - assert RDF.Data.delete(description, - %Description{description | subject: EX.Other}) == description - end - - test "pop", %{description: description} do - assert RDF.Data.pop(description) == Description.pop(description) - end - - test "include?", %{description: description} do - assert RDF.Data.include?(description, {EX.S, EX.p1, EX.O2}) - refute RDF.Data.include?(description, {EX.Other, EX.p1, EX.O2}) - end - - test "statements", %{description: description} do - assert RDF.Data.statements(description) == Description.statements(description) - end - - test "subjects", %{description: description} do - assert RDF.Data.subjects(description) == MapSet.new([uri(EX.S)]) - end - - test "predicates", %{description: description} do - assert RDF.Data.predicates(description) == MapSet.new([EX.p1, EX.p2, EX.p3]) - end - - test "objects", %{description: description} do - assert RDF.Data.objects(description) == - MapSet.new([uri(EX.O1), uri(EX.O2), uri(EX.O3), ~B]) - end - - test "resources", %{description: description} do - assert RDF.Data.resources(description) == - MapSet.new([uri(EX.S), EX.p1, EX.p2, EX.p3, uri(EX.O1), uri(EX.O2), uri(EX.O3), ~B]) - end - - test "subject_count", %{description: description} do - assert RDF.Data.subject_count(description) == 1 - end - - test "statement_count", %{description: description} do - assert RDF.Data.statement_count(description) == 5 - end - - end - end