defmodule Floppy do @moduledoc """ Documentation for `Floppy`. """ defmacro json_assert(result, options \\ []) do name = get_name(binding()) quote do require Floppy.Check path = Floppy.path_for(__ENV__, unquote(name), ".json") result = Jason.encode!(unquote(result), pretty: true) Floppy.Check.check(path, result, &Jason.decode!/1) end end defmacro json_plain_assert(result, options \\ []) do name = get_name(binding()) quote do require Floppy.Check path = Floppy.path_for(__ENV__, unquote(name), ".json") result = Jason.encode!(unquote(result), pretty: false) Floppy.Check.check(path, result, &Jason.decode!/1) end end defmacro assert(result, options \\ []) do name = get_name(binding()) quote do require Floppy.Check path = Floppy.path_for(__ENV__, unquote(name), ".floppy") result = :erlang.term_to_binary(unquote(result)) Floppy.Check.check(path, result, &:erlang.binary_to_term/1) end end def path_for(env, varname, ext) do dir = String.replace(env.file, ".exs", "") {file, _} = env.function filename = [to_string(file), varname] |> Enum.filter(&(&1 != "")) |> Enum.join("_") Path.join(dir, filename <> ext) |> String.replace(" ", "_") end defp get_name(bindings) do name = case Keyword.get(bindings, :result) do nil -> "nil" {name, _line, _value} -> name value -> value end name |> to_string() |> String.replace(":", "_") end end