From 4cc0680fbff86af4b39953e21edde6c5b9ac42a6 Mon Sep 17 00:00:00 2001 From: Marcel Otto Date: Fri, 24 Mar 2017 23:13:05 +0100 Subject: [PATCH] json_ld: helpers for the JSON-LD test suite --- test/support/test_data.ex | 14 ++++++++++ test/support/test_suite.ex | 55 ++++++++++++++++++++++++++++++++++++++ test/test_helper.exs | 6 +++++ 3 files changed, 75 insertions(+) create mode 100644 test/support/test_data.ex create mode 100644 test/support/test_suite.ex diff --git a/test/support/test_data.ex b/test/support/test_data.ex new file mode 100644 index 0000000..959cdcf --- /dev/null +++ b/test/support/test_data.ex @@ -0,0 +1,14 @@ +defmodule JSON.LD.TestData do + + @dir Path.join(File.cwd!, "test/data/") + def dir, do: @dir + + def file(name) do + if File.exists?(path = Path.join(@dir, name)) do + path + else + raise "Test data file '#{name}' not found" + end + end + +end diff --git a/test/support/test_suite.ex b/test/support/test_suite.ex new file mode 100644 index 0000000..abf9461 --- /dev/null +++ b/test/support/test_suite.ex @@ -0,0 +1,55 @@ +defmodule JSON.LD.TestSuite do + + @test_suite_dir "json-ld.org-test-suite" + def test_suite_dir, do: @test_suite_dir + + def file(name), do: JSON.LD.TestData.file(Path.join(@test_suite_dir, name)) + + def parse_json_file!(file) do + case File.read(file(file)) do + {:ok, content} -> Poison.Parser.parse!(content) + {:error, reason} -> raise File.Error, path: file, action: "read", reason: reason + end + end + + def j(file), do: parse_json_file!(file) + + def manifest_filename(type), do: "#{to_string(type)}-manifest.jsonld" + + def manifest(type) do + type + |> manifest_filename + |> parse_json_file! + end + + def test_cases(type), do: manifest(type)["sequence"] + + def test_cases_by_type(test_cases) do + Enum.group_by(test_cases, fn %{"@type" => type} -> + cond do + "jld:PositiveEvaluationTest" in type -> :positive_evaluation_test + "jld:NegativeEvaluationTest" in type -> :negative_evaluation_test + "jld:PositiveSyntaxTest" in type -> :positive_syntax_test + "jld:NegativeSyntaxTest" in type -> :negative_syntax_test + end + end) + end + + def test_case_options(test_case, %{"baseIri" => base_iri}), + do: test_case_options(test_case, base_iri) + + def test_case_options(test_case, base_iri) do + test_case + |> Map.get("option", %{}) + |> Map.put_new("base", base_iri <> test_case["input"]) + |> Enum.map(fn {key, value} -> + {key |> Macro.underscore |> String.to_atom, value} + end) + |> Enum.map(fn + {:expand_context, file} -> {:expand_context, j(file)} + option -> option + end) + |> JSON.LD.Options.new + end + +end diff --git a/test/test_helper.exs b/test/test_helper.exs index 869559e..ccf3822 100644 --- a/test/test_helper.exs +++ b/test/test_helper.exs @@ -1 +1,7 @@ ExUnit.start() + +with files = File.ls!("./test/support") do + Enum.each files, fn(file) -> + Code.require_file "support/#{file}", __DIR__ + end +end