Packages
espec
1.8.1
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/formatters/json.ex
defmodule ESpec.Formatters.Json do
@moduledoc """
Generates json output.
"""
alias ESpec.Example
use ESpec.Formatters.Base
@doc "Formats the final result."
def format_result(examples, durations, _opts) do
pending = Example.pendings(examples)
failed = Example.failure(examples)
list =
[
format_pending(pending),
format_failed(failed),
format_success(Example.success(examples))
]
|> List.flatten()
summary = format_summary(examples, pending, failed, durations)
string = EEx.eval_file(template_path(), examples: list, summary: summary)
String.replace(string, "\n", "")
end
@doc "Formats an example result."
def format_example(_example, _opts), do: ""
defp template_path, do: Path.join(Path.dirname(__ENV__.file), "templates/json.json.eex")
defp format_failed(examples), do: Enum.map(examples, &do_format_example(&1, &1.error.message))
defp format_pending(examples), do: Enum.map(examples, &do_format_example(&1, &1.result))
def format_success(examples), do: Enum.map(examples, &do_format_example(&1, &1.result))
defp do_format_example(example, info) do
description = one_line_description(example)
{description, "#{example.file}:#{example.line}", example.status, escape_quotes(info),
example.duration}
end
def format_summary(
examples,
pending,
failed,
{start_loading_time, finish_loading_time, finish_specs_time}
) do
load_time = :timer.now_diff(finish_loading_time, start_loading_time)
spec_time = :timer.now_diff(finish_specs_time, finish_loading_time)
seed = get_seed()
{
Enum.count(examples),
Enum.count(failed),
Enum.count(pending),
us_to_sec(load_time + spec_time),
us_to_sec(load_time),
us_to_sec(spec_time),
seed
}
end
defp escape_quotes(info) do
"#{info}"
|> String.replace("\'", "'")
|> String.replace("\\\"", "'")
|> String.replace("\"", "'")
end
defp us_to_sec(us), do: div(us, 10_000) / 100
defp one_line_description(example) do
module = "#{example.module}" |> String.replace("Elixir.", "")
([module | ESpec.Example.context_descriptions(example)] ++ [example.description])
|> Enum.join(" ")
|> String.trim_trailing()
end
defp get_seed do
if ESpec.Configuration.get(:order) do
false
else
ESpec.Configuration.get(:seed)
end
end
end