diff --git a/lib/json/ld/flattening.ex b/lib/json/ld/flattening.ex index 6999b9d..7b307b1 100644 --- a/lib/json/ld/flattening.ex +++ b/lib/json/ld/flattening.ex @@ -92,8 +92,8 @@ defmodule JSON.LD.Flattening do node = node_map[active_graph][active_subject] # 3) - if types = Map.get(element, "@type") do - types = Enum.reduce(types, [], + if old_types = Map.get(element, "@type") do + new_types = Enum.reduce(List.wrap(old_types), [], fn (item, types) -> if blank_node_id?(item) do identifier = generate_blank_node_id(node_id_map, item) @@ -102,7 +102,8 @@ defmodule JSON.LD.Flattening do types ++ [item] end end) - element = Map.put(element, "@type", types) + element = Map.put(element, "@type", + if(is_list(old_types), do: new_types, else: List.first(new_types))) end cond do diff --git a/test/suite/flatten_test.exs b/test/suite/flatten_test.exs new file mode 100644 index 0000000..4c15c0e --- /dev/null +++ b/test/suite/flatten_test.exs @@ -0,0 +1,41 @@ +defmodule JSON.LD.TestSuite.FlattenTest do + use ExUnit.Case, async: false + + import JSON.LD.TestSuite + + setup_all do + [base_iri: manifest("flatten")["baseIri"]] + end + + test_cases("flatten") +# TODO: Ordering problems +# |> Enum.filter(fn %{"@id" => id} -> id in ~w[#t0034] end) +# |> Enum.filter(fn %{"@id" => id} -> id in ~w[#t0035] end) +# |> Enum.filter(fn %{"@id" => id} -> id in ~w[#t0038] end) +# TODO: Fixed in Elixir 1.5 +# |> Enum.filter(fn %{"@id" => id} -> id in ~w[#t0029] end) + |> Enum.each(fn %{"name" => name, "input" => input} = test_case -> + if input in ~w[flatten-0029-in.jsonld] do + @tag skip: """ + probably caused by a bug in Elixirs URI.merge which should be fixed with Elixir 1.5 + https://github.com/elixir-lang/elixir/pull/5780 + """ + end + if input in ~w[flatten-0034-in.jsonld flatten-0035-in.jsonld flatten-0038-in.jsonld] do + @tag skip: "TODO: Actually correct values are expanded, but the ordering is different." + end + @tag :test_suite + @tag :flatten_test_suite + @tag data: test_case + test "#{input}: #{name}", + %{data: %{"input" => input, "expect" => output} = test_case, base_iri: base_iri} do + context = + case test_case["context"] do + nil -> nil + context -> j(context) + end + assert JSON.LD.flatten(j(input), context, test_case_options(test_case, base_iri)) == j(output) + end + end) + +end