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