Current section

Files

Jump to
espec lib espec assertions change_from_to.ex
Raw

lib/espec/assertions/change_from_to.ex

defmodule ESpec.Assertions.ChangeFromTo do
@moduledoc """
Defines 'change' assertion.
it do: expect(function1).to change(function2, from, to)
"""
use ESpec.Assertions.Interface
defp match(subject, [func, before, value]) do
initial = func.()
subject.()
then = func.()
result = initial == before && then == value
{result, {then, initial, initial == before, then == value}}
end
defp success_message(subject, [func, before, value], _result, positive) do
to = if positive, do: "changes", else: "doesn't change"
"`#{inspect(subject)}` #{to} the value of `#{inspect(func)}` from `#{inspect(before)}` to `#{
inspect(value)
}`."
end
defp error_message(subject, [func, before, value], {then, _initial, true, false}, positive) do
to = if positive, do: "to", else: "not to"
"Expected `#{inspect(subject)}` #{to} change the value of `#{inspect(func)}` from `#{
inspect(before)
}` to `#{inspect(value)}`, but the value is `#{then}`."
end
defp error_message(subject, [func, before, value], {_then, initial, false, _}, positive) do
to = if positive, do: "to", else: "not to"
"Expected `#{inspect(subject)}` #{to} change the value of `#{inspect(func)}` from `#{
inspect(before)
}` to `#{inspect(value)}`, but the initial value is `#{initial}`."
end
end