Packages
espec
1.4.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