Skip to content

Commit 5fdc6b5

Browse files
author
José Valim
committed
Improve coverage for Set and Dict with mixed types
1 parent 18a8272 commit 5fdc6b5

File tree

4 files changed

+84
-16
lines changed

4 files changed

+84
-16
lines changed

lib/elixir/lib/dict.ex

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -482,8 +482,8 @@ defmodule Dict do
482482
target1.equal?(dict1, dict2)
483483

484484
target1.size(dict1) == target2.size(dict2) ->
485-
target1.reduce(dict1, { :cont, true }, fn({ k, v }, _acc) ->
486-
case target2.fetch(dict2, k) do
485+
target2.reduce(dict2, { :cont, true }, fn({ k, v }, _acc) ->
486+
case target1.fetch(dict1, k) do
487487
{ :ok, ^v } -> { :cont, true }
488488
_ -> { :halt, false }
489489
end

lib/elixir/lib/set.ex

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -104,9 +104,9 @@ defmodule Set do
104104
if target1 == target2 do
105105
target1.difference(set1, set2)
106106
else
107-
target2.reduce set2, { :cont, set1 }, fn v, acc ->
107+
target2.reduce(set2, { :cont, set1 }, fn v, acc ->
108108
{ :cont, target1.delete(acc, v) }
109-
end |> elem(1)
109+
end) |> elem(1)
110110
end
111111
end
112112

@@ -207,9 +207,9 @@ defmodule Set do
207207
if target1 == target2 do
208208
target1.intersection(set1, set2)
209209
else
210-
target1.reduce set1, { :cont, target1.empty(set1) }, fn v, acc ->
210+
target1.reduce(set1, { :cont, target1.empty(set1) }, fn v, acc ->
211211
{ :cont, if(target2.member?(set2, v), do: target1.put(acc, v), else: acc) }
212-
end |> elem(1)
212+
end) |> elem(1)
213213
end
214214
end
215215

@@ -322,9 +322,9 @@ defmodule Set do
322322
if target1 == target2 do
323323
target1.union(set1, set2)
324324
else
325-
target2.reduce set2, { :cont, set1 }, fn v, acc ->
325+
target2.reduce(set2, { :cont, set1 }, fn v, acc ->
326326
{ :cont, target1.put(acc, v) }
327-
end |> elem(1)
327+
end) |> elem(1)
328328
end
329329
end
330330

lib/elixir/test/elixir/dict_test.exs

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,20 @@
11
Code.require_file "test_helper.exs", __DIR__
22

3+
# A TestDict implementation used only for testing.
4+
defmodule TestDict do
5+
def new(list // []) when is_list(list) do
6+
{ TestDict, list }
7+
end
8+
9+
def reduce({ TestDict, list }, acc, fun) do
10+
Enumerable.reduce(list, acc, fun)
11+
end
12+
13+
def size({ TestDict, list }) do
14+
length(list)
15+
end
16+
end
17+
318
defmodule DictTest.Common do
419
defmacro __using__(_) do
520
quote location: :keep do
@@ -140,9 +155,9 @@ defmodule DictTest.Common do
140155
[{"a", 3}, {"b", 2}, {"c", :a}, {"d", 0}]
141156
end
142157

143-
test "merge/2 with enum" do
158+
test "merge/2 with other dict" do
144159
dict1 = new_dict [{"a", 1}, {"b", 2}, {"c", 3}]
145-
dict2 = Enum.zip ["a", "c", "d"], [3, :a, 0]
160+
dict2 = TestDict.new [{"a",3}, {"c",:a}, {"d",0}]
146161
actual = Dict.merge(dict1, dict2)
147162
assert Dict.merge(dict1, dict2) |> Enum.sort ==
148163
[{"a", 3}, {"b", 2}, {"c", :a}, {"d", 0}]
@@ -329,15 +344,19 @@ defmodule DictTest.Common do
329344
refute Dict.equal?(dict3, dict1)
330345
end
331346

332-
test "equal?/2 with_match" do
347+
test "equal?/2 with match" do
333348
dict1 = new_dict([{1,1}])
334349
dict2 = new_dict([{1.0,1}])
335-
assert dict_impl.equal?(dict1, dict1)
336-
refute dict_impl.equal?(dict1, dict2)
337350
assert Dict.equal?(dict1, dict1)
338351
refute Dict.equal?(dict1, dict2)
339352
end
340353

354+
test "equal?/2 with other dict" do
355+
dict = new_dict([{1,1}])
356+
assert Dict.equal?(dict, TestDict.new([{1,1}]))
357+
refute Dict.equal?(dict, TestDict.new([{1.0,1}]))
358+
end
359+
341360
test "implements Enumerable" do
342361
dict = new_dict()
343362
assert Enum.empty?(new_dict([]))

lib/elixir/test/elixir/set_test.exs

Lines changed: 52 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
Code.require_file "test_helper.exs", __DIR__
22

3+
# A TestSet implementation used only for testing.
4+
defmodule TestSet do
5+
def new(list // []) when is_list(list) do
6+
{ TestSet, list }
7+
end
8+
9+
def reduce({ TestSet, list }, acc, fun) do
10+
Enumerable.reduce(list, acc, fun)
11+
end
12+
13+
def member?({ TestSet, list }, v) do
14+
v in list
15+
end
16+
17+
def size({ TestSet, list }) do
18+
length(list)
19+
end
20+
end
21+
322
defmodule SetTest.Common do
423
defmacro __using__(module) do
524
quote location: :keep do
@@ -37,17 +56,27 @@ defmodule SetTest.Common do
3756

3857
test "difference/2" do
3958
result = Set.difference(new_set([1, 2, 3]), new_set([3]))
40-
assert Set.equal?(result, HashSet.new([1, 2]))
59+
assert Set.equal?(result, new_set([1, 2]))
4160
end
4261

4362
test "difference/2 with match" do
4463
refute Set.member?(Set.difference(int_set, new_set([1])), 1)
4564
assert Set.member?(Set.difference(int_set, new_set([1.0])), 1)
4665
end
4766

67+
test "difference/2 with other set" do
68+
result = Set.difference(new_set([1, 2, 3]), TestSet.new([3]))
69+
assert Set.equal?(result, new_set([1, 2]))
70+
end
71+
4872
test "disjoint?/2" do
49-
assert Set.disjoint?(new_set([1, 2, 3]), new_set([4, 5 ,6])) == true
50-
assert Set.disjoint?(new_set([1, 2, 3]), new_set([3, 4 ,5])) == false
73+
assert Set.disjoint?(new_set([1, 2, 3]), new_set([4, 5 ,6]))
74+
refute Set.disjoint?(new_set([1, 2, 3]), new_set([3, 4 ,5]))
75+
end
76+
77+
test "disjoint/2 with other set" do
78+
assert Set.disjoint?(new_set([1, 2, 3]), TestSet.new([4, 5 ,6]))
79+
refute Set.disjoint?(new_set([1, 2, 3]), TestSet.new([3, 4 ,5]))
5180
end
5281

5382
test "empty/1" do
@@ -60,6 +89,11 @@ defmodule SetTest.Common do
6089
refute Set.equal?(new_set([1, 2, 3]), new_set([3.0, 2.0, 1.0]))
6190
end
6291

92+
test "equal?/2 with other set" do
93+
assert Set.equal?(new_set([1, 2, 3]), TestSet.new([3, 2, 1]))
94+
refute Set.equal?(new_set([1, 2, 3]), TestSet.new([3.0, 2.0, 1.0]))
95+
end
96+
6397
test "intersection/2" do
6498
result = Set.intersection(new_set([1, 2, 3]), new_set([2, 3, 4]))
6599
assert Set.equal?(result, new_set([2, 3]))
@@ -70,6 +104,11 @@ defmodule SetTest.Common do
70104
refute Set.member?(Set.intersection(int_set, new_set([1.0])), 1)
71105
end
72106

107+
test "intersection/2 with other set" do
108+
result = Set.intersection(new_set([1, 2, 3]), TestSet.new([2, 3, 4]))
109+
assert Set.equal?(result, new_set([2, 3]))
110+
end
111+
73112
test "member?/2" do
74113
assert Set.member?(new_set([1, 2, 3]), 2)
75114
refute Set.member?(new_set([1, 2, 3]), 4)
@@ -100,6 +139,11 @@ defmodule SetTest.Common do
100139
refute Set.subset?(new_set([1.0]), int_set)
101140
end
102141

142+
test "subset?/2 with other set" do
143+
assert Set.subset?(new_set([1, 2]), TestSet.new([1, 2, 3]))
144+
refute Set.subset?(new_set([1, 2, 3]), TestSet.new([1, 2]))
145+
end
146+
103147
test "to_list/1" do
104148
assert Set.to_list(new_set([1, 2, 3])) |> Enum.sort == [1, 2, 3]
105149
end
@@ -114,6 +158,11 @@ defmodule SetTest.Common do
114158
assert Set.size(Set.union(int_set, new_set([1.0]))) == 4
115159
end
116160

161+
test "union/2 with other set" do
162+
result = Set.union(new_set([1, 2, 3]), TestSet.new([2, 3, 4]))
163+
assert Set.equal?(result, new_set([1, 2, 3, 4]))
164+
end
165+
117166
test "implements Enum" do
118167
assert Enum.member?(int_set, 1)
119168
refute Enum.member?(int_set, 1.0)

0 commit comments

Comments
 (0)