Packages
espec
1.1.0
1.10.0
1.9.2
1.9.1
1.9.0
1.8.3
1.8.2
1.8.1
1.8.0
1.7.0
1.6.5
1.6.4
1.6.3
1.6.2
1.6.1
1.6.0
1.5.1
1.5.0
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.4
1.3.3
1.3.2
1.3.1
1.3.0
1.2.2
1.2.1
1.2.0
1.1.2
1.1.1
1.1.0
1.0.1
1.0.0
0.8.28
0.8.27
0.8.26
0.8.25
0.8.24
0.8.23
0.8.22
0.8.21
0.8.20
0.8.19
0.8.18
0.8.17
0.8.16
0.8.15
0.8.14
0.8.13
0.8.12
0.8.11
0.8.10
0.8.9
0.8.8
0.8.7
0.8.6
0.8.5
0.8.1
0.8.0
0.7.2
0.7.1
0.7.0
0.6.4
0.6.3
0.6.2
0.6.1
0.6.0
0.5.1
0.5.0
0.4.2
0.4.1
0.4.0
0.3.7
0.3.5
0.3.0
0.2.0
0.1.0
BDD testing framework for Elixir inspired by RSpec.
Current section
Files
Jump to
Current section
Files
lib/espec/context.ex
defmodule ESpec.Context do
@moduledoc """
Defines macros 'context', 'describe', and 'example_group'.
Defines macros for 'skip' and 'focus' example groups
"""
@aliases ~w(describe example_group)a
@skipped ~w(xcontext xdescribe xexample_group)a
@focused ~w(fcontext fdescribe fexample_group)a
@doc """
Context has description, line, and options.
Available options are:
- [skip: true] or [skip: "Reason"] - skips examples in the context;
- [focus: true] - sets focus to run with `--focus ` option.
"""
defstruct description: "", module: nil, line: nil, opts: []
@doc "Add context with description and opts to 'example context'."
defmacro context(description, opts, do: block) do
quote do
tail = @context
head = %ESpec.Context{description: unquote(description), module: __MODULE__, line: __ENV__.line, opts: unquote(opts)}
@context [head | tail]
unquote(block)
@context tail
end
end
@doc "context with opts only"
defmacro context(opts, do: block) when is_list(opts) do
quote do: context("", unquote(opts), do: unquote(block))
end
@doc "context with description only"
defmacro context(description, do: block) do
quote do
context(unquote(description), [], do: unquote(block))
end
end
@doc "context with block"
defmacro context(do: block) do
quote do: context("", [], do: unquote(block))
end
@doc "empty context"
defmacro context(_description) do
quote do: context("", [], do: true)
end
@doc "Aliases for `context`."
Enum.each @aliases, fn(func) ->
defmacro unquote(func)(description, opts, do: block) do
quote do: context(unquote(description), unquote(opts), do: unquote(block))
end
defmacro unquote(func)(description_or_opts, do: block) do
quote do: context(unquote(description_or_opts), do: unquote(block))
end
defmacro unquote(func)(do: block) do
quote do: context(do: unquote(block))
end
defmacro unquote(func)(_description) do
quote do: context(_description)
end
end
@doc "Macros for skipped contexts"
Enum.each @skipped, fn(func) ->
defmacro unquote(func)(description, opts, do: block) do
reason = "`#{unquote(func)}`"
quote do: context(unquote(description), Keyword.put(unquote(opts), :skip, unquote(reason)), do: unquote(block))
end
defmacro unquote(func)(opts, do: block) when is_list(opts) do
reason = "`#{unquote(func)}`"
quote do: context(Keyword.put(unquote(opts), :skip, unquote(reason)), do: unquote(block))
end
defmacro unquote(func)(description, do: block) do
reason = "`#{unquote(func)}`"
quote do: context(unquote(description), [skip: unquote(reason)], do: unquote(block))
end
defmacro unquote(func)(do: block) do
reason = "`#{unquote(func)}`"
quote do: context([skip: unquote(reason)], do: unquote(block))
end
end
@doc "Macros for focused contexts"
Enum.each @focused, fn(func) ->
defmacro unquote(func)(description, opts, do: block) do
quote do: context(unquote(description), Keyword.put(unquote(opts), :focus, true), do: unquote(block))
end
defmacro unquote(func)(opts, do: block) when is_list(opts) do
quote do: context(Keyword.put(unquote(opts), :focus, true), do: unquote(block))
end
defmacro unquote(func)(description, do: block) do
quote do: context(unquote(description), [focus: true], do: unquote(block))
end
defmacro unquote(func)(do: block) do
quote do: context([focus: true], do: unquote(block))
end
end
end