Packages
espec
1.9.2
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/runner.ex
defmodule ESpec.Runner do
@moduledoc """
Defines functions which runs the examples.
Uses GenServer behavior.
"""
alias __MODULE__.Queue
alias ESpec.Configuration
alias ESpec.Example
alias ESpec.Output
alias ESpec.SuiteRunner
alias Mix.Utils.Stale
@doc "Starts the `ESpec.Runner` server"
def start do
Queue.start(:input)
Queue.start(:output)
Task.Supervisor.start_link(name: ESpec.TaskSupervisor)
end
@doc "Runs all examples."
def run do
do_run(ESpec.specs(), Configuration.all())
end
@doc false
def stop do
Queue.stop(:input)
Queue.stop(:output)
Supervisor.stop(ESpec.TaskSupervisor)
end
defp do_run(specs, opts) do
examples =
if Configuration.get(:order) do
run_suites(specs, opts, false)
else
seed_random!()
run_suites(specs, opts)
end
success = !Enum.any?(Example.failure(examples))
Configuration.add(finish_specs_time: :os.timestamp())
stale_manifest_and_output(examples, stale: opts[:stale], success: success)
success
end
defp stale_manifest_and_output(examples, stale: true, success: success) do
if success, do: Stale.agent_write_manifest()
case examples do
[] -> Mix.shell().info("No stale tests to run...")
examples -> Output.final_result(examples)
end
end
defp stale_manifest_and_output(examples, _opts) do
Output.final_result(examples)
end
defp run_suites(specs, opts, shuffle \\ true) do
specs
|> Enum.reverse()
|> Enum.map(fn module ->
SuiteRunner.run(module, opts, shuffle)
end)
|> List.flatten()
end
defp seed_random! do
conf_seed =
if seed = Configuration.get(:seed) do
seed
else
seed = :os.timestamp() |> elem(2)
Configuration.add(seed: seed)
seed
end
seed =
cond do
is_number(conf_seed) -> conf_seed
is_binary(conf_seed) -> String.to_integer(conf_seed)
true -> :no_way
end
:rand.seed(:exs64, {3172, 9814, seed})
end
defmodule Queue do
@moduledoc """
Implements queue.
"""
def push(name, el), do: Agent.update(name, &[el | &1])
def pop(name) do
Agent.get_and_update(name, fn state ->
case state do
[el | tail] -> {el, tail}
[] -> {nil, []}
end
end)
end
def all(name), do: Agent.get(name, & &1)
def start(name), do: Agent.start_link(fn -> [] end, name: name)
def clear(name), do: Agent.update(name, fn _ -> [] end)
def stop(name), do: Agent.stop(name)
end
end