Packages
espec
1.6.4
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/assertions/contain_exactly.ex
defmodule ESpec.Assertions.ContainExactly do
@moduledoc """
Defines the 'contain_exactly' assertion (or match_list) - the lists
have the same elements (possibly in a different order).
it do: expect(actual).to contain_exactly(expected)
it do: expect(actual).to match_list(expected)
"""
use ESpec.Assertions.Interface
defp sort_collection(collection) when is_list(collection) do
if Keyword.keyword?(collection) do
Enum.sort(collection, fn {k1, v1}, {k2, v2} ->
if k1 == k2, do: v1 <= v2, else: k1 < k2
end)
else
Enum.sort(collection)
end
end
defp sort_collection(collection), do: collection
defp diff(subject, data) do
ESpec.Diff.diff(
sort_collection(subject),
sort_collection(data)
)
end
defp match(expected, _actual) when not is_list(expected) do
{false, false}
end
defp match(expected, actual) do
result = Keyword.equal?(expected, actual)
{result, result}
end
defp success_message(subject, data, _result, positive) do
to = if positive, do: "contains exactly", else: "doesn't contain exactly"
"`#{inspect(subject)}` #{to} `#{inspect(data)}`."
end
defp error_message(subject, data, _diff, positive) do
to = if positive, do: "to", else: "not to"
but = if positive, do: "doesn't", else: "does"
m = "Expected `#{inspect(subject)}` #{to} contain exactly `#{inspect(data)}`, but it #{but}."
if positive do
{m, %{diff_fn: fn -> diff(subject, data) end}}
else
m
end
end
end