Current section

Files

Jump to
elixir_script lib elixir_script_test test assertions.ex
Raw

lib/elixir_script_test/test/assertions.ex

defmodule ElixirScript.Test.Assertions do
@moduledoc """
Defines assertions for use in ElixirScript test.
These are a subset of [ExUnit.Assertions](https://hexdocs.pm/ex_unit/ExUnit.Assertions.html)
"""
@doc false
def raise_elixir_script_assert(error, file, line) do
reraise(ElixirScript.Test.AssertionError, [
left: error.left,
right: error.right,
message: error.message,
expr: error.expr,
file: file,
line: line
], [])
end
@doc """
Asserts its argument is a truthy value
"""
defmacro assert(assertion) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.assert(unquote(assertion))
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
Asserts `value` is `true`, displaying the given `message` otherwise.
"""
defmacro assert(value, message) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.assert(unquote(value), unquote(message))
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
Asserts the `exception` is raised during `function` execution.
Returns the rescued exception, fails otherwise.
"""
defmacro assert_raise(exception, function) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.assert(unquote(exception), unquote(function))
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
Asserts the `exception` is raised during `function` execution with
the expected `message`, which can be a `Regex` or an exact `String`.
Returns the rescued exception, fails otherwise.
"""
defmacro assert_raise(exception, message, function) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.assert(
unquote(exception),
unquote(message),
unquote(function)
)
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
Asserts that `value1` and `value2` differ by no more than `delta`
"""
defmacro assert_in_delta(value1, value2, delta, message \\ nil) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.assert_in_delta(
unquote(value1),
unquote(value2),
unquote(delta),
unquote(message)
)
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
A negative assertion, expects the expression to be `false` or `nil`.
"""
defmacro refute(assertion) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.assert(unquote(assertion))
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
Asserts `value` is `nil` or `false` (that is, `value` is not truthy).
"""
defmacro refute(value, message) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.assert(unquote(value), unquote(message))
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
Asserts that `value1` and `value2` are not within `delta`
"""
defmacro refute_in_delta(value1, value2, delta, message \\ nil) do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.refute_in_delta(
unquote(value1),
unquote(value2),
unquote(delta),
unquote(message)
)
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
@doc """
Fails with a message.
"""
defmacro flunk(message \\ "Flunked!") do
%{file: file, line: line} = __CALLER__
quote [file: file, line: line] do
try do
ExUnit.Assertions.flunk(unquote(message))
rescue
error in [ExUnit.AssertionError] ->
ElixirScript.Test.Assertions.raise_elixir_script_assert(
error,
unquote(file),
unquote(line)
)
end
end
end
end