defmodule JSONPath.ComplianceTest do
use ExUnit.Case
<%= for testcase <- tests do %>
<%= if Map.get(testcase, "skip", false) do %>
@tag :skip
<% end %>
test "<%= testcase["name"] %>" do
testcase = <%= inspect(testcase, limit: :infinity) %>
selector = testcase["selector"]
root = testcase["document"]
<%= if not is_nil(Map.get(testcase, "result")) do %>
%{"result" => result, "result_paths" => result_path} = testcase
<% end %>
<%= if not is_nil(Map.get(testcase, "results")) do %>
%{"results" => results, "results_paths" => results_path} = testcase
<% end %>
<%= if Map.get(testcase, "invalid_selector", false) == true do %>
assert {:error, %JSONPath.Error{}} = JSONPath.values(root, selector)
<% else %>
<%= if not is_nil(Map.get(testcase, "result")) do %>
# Only one possible result
{:ok, value} = JSONPath.values(root, selector)
assert value == result,
"for query #{selector} and root #{inspect(root)}, expected: #{inspect(result)}, got: #{inspect(value)}"
{:ok, paths} = JSONPath.paths(root, selector)
assert paths == result_path,
"for query #{selector} and root #{inspect(root)}, expected paths: #{inspect(result_path)}, got: #{inspect(paths)}"
<% else %>
<%= if not is_nil(Map.get(testcase, "results")) do %>
# Multiple results
{:ok, value} = JSONPath.values(root, selector)
assert value in results, "no match for query #{selector} and root #{inspect(root)}"
{:ok, paths} = JSONPath.paths(root, selector)
assert paths in results_path, "no path match for query #{selector} and root #{inspect(root)}"
<% else %>
raise "Unexpected testcase format: #{inspect(testcase)}"
<% end %>
<% end %>
<% end %>
end
<% end %>
end