Packages
espec
0.8.20
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/example.ex
defmodule ESpec.Example do
@moduledoc """
Defines macros 'example' and 'it'.
These macros defines function with random name which will be called when example runs.
Example structs %ESpec.Example are accumulated in @examples attribute
"""
@doc """
Example struct.
description - the description of example,
module - spec module,
function - random function name,
opts - options,
file - spec file path,
line - the line where example is defined,
context - example context. Accumulator for 'contexts' and 'lets',
shared - marks example as shared,
status - example status (:new, :success, :failure, :pending),
result - the value returned by example block or the pending message,
error - store an error,
duration - test duration.
"""
defstruct description: "", module: nil, function: nil, opts: [],
file: nil, line: nil, context: [], shared: false, async: false,
status: :new, result: nil, error: nil, duration: 0
@doc "Context descriptions."
def context_descriptions(%__MODULE__{context: context, description: _description, function: _function}) do
context
|> Enum.filter(fn(struct) -> struct.__struct__ == ESpec.Context end)
|> Enum.map(&(&1.description))
end
@doc "Filters success examples."
def success(results), do: Enum.filter(results, &(&1.status == :success))
@doc "Filters failed examples."
def failure(results), do: Enum.filter(results, &(&1.status === :failure))
@doc "Filters pending examples."
def pendings(results), do: Enum.filter(results, &(&1.status === :pending))
@doc "Extracts specific structs from example context."
def extract_befores(example), do: extract(example.context, ESpec.Before)
def extract_lets(example), do: extract(example.context, ESpec.Let)
def extract_finallies(example), do: extract(example.context, ESpec.Finally)
def extract_contexts(example), do: extract(example.context, ESpec.Context)
@doc "Extracts example options."
def extract_option(example, option) do
contexts = ESpec.Example.extract_contexts(example)
opts = List.flatten(example.opts ++ Enum.reverse(Enum.map(contexts, &(&1.opts))))
opt = Enum.find(opts, fn({k, _v}) -> k == option end)
if opt do
{^option, value} = opt
value
else
nil
end
end
def extract(context, module) do
Enum.filter(context, &(&1.__struct__ == module))
end
@doc "Message for skipped examples."
def skip_message(example) do
skipper = extract_option(example, :skip)
if skipper === true do
"Temporarily skipped without a reason."
else
"Temporarily skipped with: #{skipper}."
end
end
@doc "Message for pending examples."
def pending_message(example) do
if example.opts[:pending] === true do
"Pending example."
else
"Pending with message: #{example.opts[:pending]}."
end
end
end