Packages
espec
1.6.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/diff.ex
defmodule ESpec.Diff do
def diff(expected, actual) do
diff = edit_script(actual, expected)
format_diff(diff, {actual, expected})
end
# shamelessly copied from ex_unit/formatter
defp edit_script(left, right) do
task = Task.async(ExUnit.Diff, :script, [left, right])
case Task.yield(task, 1_500) || Task.shutdown(task, :brutal_kill) do
{:ok, script} -> script
nil -> nil
end
end
defp format_diff(diff, {actual, expected}) do
if is_nil(diff) do
{
[eq: inspect(expected, printable_limit: :infinity)],
[eq: inspect(actual, printable_limit: :infinity)]
}
else
diff
|> List.flatten()
|> split_flattened_diff()
end
end
defp split_flattened_diff(diff) do
split_flattened_diff(diff, %{
left: [],
right: []
})
end
defp split_flattened_diff([{:ins, text} | tail], processed) do
split_flattened_diff(tail, Map.update!(processed, :left, &(&1 ++ [ins: text])))
end
defp split_flattened_diff([{:del, text} | tail], processed) do
split_flattened_diff(tail, Map.update!(processed, :right, &(&1 ++ [del: text])))
end
defp split_flattened_diff([{:eq, text} | tail], processed) do
processed =
processed
|> Map.update!(:right, &(&1 ++ [eq: text]))
|> Map.update!(:left, &(&1 ++ [eq: text]))
split_flattened_diff(tail, processed)
end
defp split_flattened_diff([], processed) do
{processed.left, processed.right}
end
end