json_ld: JSON-LD error test suite and some fixes

This commit is contained in:
Marcel Otto 2017-03-30 22:51:44 +02:00
parent ea7d8b7b4e
commit f208f2e22e
4 changed files with 48 additions and 3 deletions

View file

@ -73,12 +73,13 @@ defmodule JSON.LD.Context do
do: active
defp set_base(active, base, _) do
cond do
# TODO: this slightly differs from the spec, due to our false special value for base_iri; add more tests
is_nil(base) or absolute_iri?(base) ->
%JSON.LD.Context{active | base_iri: base}
not is_nil(active.base_iri) ->
active.base_iri ->
%JSON.LD.Context{active | base_iri: absolute_iri(base, active.base_iri)}
true ->
raise JSON.LD.InvalidBaseURIError,
raise JSON.LD.InvalidBaseIRIError,
message: "#{inspect base} is a relative IRI, but no active base IRI defined"
end
end

View file

@ -68,7 +68,7 @@ defmodule JSON.LD.RecursiveContextInclusionError do
defexception code: "recursive context inclusion", message: nil
end
defmodule JSON.LD.InvalidBaseURIError do
defmodule JSON.LD.InvalidBaseIRIError do
@moduledoc """
An invalid base IRI has been detected, i.e., it is neither an absolute IRI nor null.
"""

34
test/suite/error_test.exs Normal file
View file

@ -0,0 +1,34 @@
defmodule JSON.LD.TestSuite.ErrorTest do
use ExUnit.Case, async: false
import JSON.LD.TestSuite
setup_all do
[base_iri: manifest("error")["baseIri"]]
end
test_cases("error")
|> Enum.each(fn %{"name" => name, "input" => input} = test_case ->
if input in ~w[error-0002-in.jsonld error-0003-in.jsonld error-0004-in.jsonld error-0005-in.jsonld] do
@tag skip: "TODO: remote contexts not implemented yet"
end
@tag :test_suite
@tag :flatten_test_suite
@tag :error_test
@tag data: test_case
test "#{input}: #{name}",
%{data: %{"input" => input, "expect" => error} = test_case, base_iri: base_iri} do
context =
case test_case["context"] do
nil -> nil
context -> j(context)
end
assert_raise exception(error), fn ->
JSON.LD.flatten(j(input), context, test_case_options(test_case, base_iri))
end
end
end)
end

View file

@ -52,4 +52,14 @@ defmodule JSON.LD.TestSuite do
|> JSON.LD.Options.new
end
def exception(error) do
error = error
|> String.replace(" ", "_")
|> String.replace("-", "_")
|> String.replace("@", "_")
|> Macro.camelize
|> String.replace("_", "")
String.to_existing_atom("Elixir.JSON.LD.#{error}Error")
end
end