Packages

ExStub provides an easy way to stub a module to facilitate writing clean, isolated unit tests.

Current section

Files

Jump to
ex_stub lib ex_stub_generator.ex
Raw

lib/ex_stub_generator.ex

defmodule ExStub.Generator do
@moduledoc """
Provide functions to generate a forwarding function, and the stub module
"""
@doc """
Create a forwarding method
"""
def create_method({_, _, [{func_name, _, nil}| _]}, module),
do: create_method(func_name, 0, module)
def create_method({_, _, [{func_name, _, params}| _]}, module),
do: create_method(func_name, params |> Enum.count, module)
def create_method(func_name, params, module) do
func_params = create_params(params)
"""
def #{func_name}#{func_params} do
#{module}.#{func_name}#{func_params}
end
"""
end
defp create_params(0), do: "()"
defp create_params(num) do
params =
1..num
|> Enum.map(fn num ->
"a#{num}"
end)
"(#{Enum.join(params, ", ")})"
end
@doc """
Generate the stub module
"""
def generate_stub_module(stub_name, functions) do
"""
defmodule #{stub_name} do
#{functions}
end
"""
end
@doc """
Generate all the forwarding functions
"""
def generate_forwarding_functions(functions, module) do
functions
|> Enum.map(fn
{func_name, ar} ->
create_method(func_name, ar, module)
end)
end
@doc """
Convert module from string to AST
"""
def module_ast(module) do
{:ok, module_ast} = Code.string_to_quoted(module)
module_ast
end
end