Skip to content

Commit f808da8

Browse files
author
Devin Torres
committed
Raise an error when Dict/Set doesn't support the target
1 parent 318eaeb commit f808da8

File tree

4 files changed

+41
-23
lines changed

4 files changed

+41
-23
lines changed

lib/elixir/lib/dict.ex

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@ defmodule Dict do
7373
elem(unquote(dict), 0)
7474
is_list(unquote(dict)) ->
7575
ListDict
76+
true ->
77+
unsupported_dict(unquote(dict))
7678
end
7779
end
7880
end
@@ -480,4 +482,8 @@ defmodule Dict do
480482
def to_list(dict) do
481483
target(dict).to_list(dict)
482484
end
485+
486+
defp unsupported_dict(dict) do
487+
raise ArgumentError, message: "unsupported dict: #{inspect dict}"
488+
end
483489
end

lib/elixir/lib/set.ex

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,10 @@ defmodule Set do
3838

3939
defmacrop target(set) do
4040
quote do
41-
cond do
42-
is_tuple(unquote(set)) -> HashSet
41+
if is_tuple(unquote(set)) do
42+
elem(unquote(set), 0)
43+
else
44+
unsupported_set(unquote(set))
4345
end
4446
end
4547
end
@@ -225,4 +227,7 @@ defmodule Set do
225227
target(set1).union(set1, set2)
226228
end
227229

230+
defp unsupported_set(set) do
231+
raise ArgumentError, message: "unsupported set: #{inspect set}"
232+
end
228233
end

lib/elixir/test/elixir/dict_test.exs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,21 @@ defmodule DictTest.Common do
207207
assert empty_dict == Dict.empty new_dict
208208
end
209209

210+
test :equal? do
211+
dict1 = HashDict.new(a: 2, b: 3, f: 5, c: 123)
212+
dict2 = ListDict.new(a: 2, b: 3, f: 5, c: 123)
213+
assert Dict.equal?(dict1, dict2)
214+
215+
dict2 = Dict.put(dict2, :a, 3)
216+
refute Dict.equal?(dict1, dict2)
217+
end
218+
219+
test "unsupported dict" do
220+
assert_raise ArgumentError, "unsupported dict: :bad_dict", fn ->
221+
Dict.to_list :bad_dict
222+
end
223+
end
224+
210225
defp empty_dict, do: unquote(module).new
211226

212227
defp new_dict(list // [{"first_key", 1}, {"second_key", 2}]) do
@@ -216,15 +231,6 @@ defmodule DictTest.Common do
216231
defp new_dict(list, transform) do
217232
unquote(module).new list, transform
218233
end
219-
220-
test :equal? do
221-
dict1 = HashDict.new(a: 2, b: 3, f: 5, c: 123)
222-
dict2 = ListDict.new(a: 2, b: 3, f: 5, c: 123)
223-
assert Dict.equal?(dict1, dict2)
224-
225-
dict2 = Dict.put(dict2, :a, 3)
226-
refute Dict.equal?(dict1, dict2)
227-
end
228234
end
229235
end
230236
end

lib/elixir/test/elixir/set_test.exs

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -5,22 +5,18 @@ defmodule SetTest.Common do
55
quote location: :keep do
66
use ExUnit.Case, async: true
77

8-
def sets_equal(set1, set2) do
9-
Set.equal?(set1, set2)
10-
end
11-
128
test "a set removes duplicates" do
13-
assert sets_equal(new_set([1, 1, 2, 3, 3, 3]), new_set([1, 2, 3]))
9+
assert Set.equal?(new_set([1, 1, 2, 3, 3, 3]), new_set([1, 2, 3]))
1410
end
1511

1612
test :delete do
1713
result = Set.delete(new_set([1, 2, 3]), 2)
18-
assert sets_equal(result, new_set([1, 3]))
14+
assert Set.equal?(result, new_set([1, 3]))
1915
end
2016

2117
test :difference do
2218
result = Set.difference(new_set([1, 2, 3]), new_set([3]))
23-
assert sets_equal(result, HashSet.new([1, 2]))
19+
assert Set.equal?(result, HashSet.new([1, 2]))
2420
end
2521

2622
test :disjoint? do
@@ -30,7 +26,7 @@ defmodule SetTest.Common do
3026

3127
test :empty do
3228
result = Set.empty new_set([1, 2, 3])
33-
assert sets_equal(result, new_set)
29+
assert Set.equal?(result, new_set)
3430
end
3531

3632
test :equal? do
@@ -39,7 +35,7 @@ defmodule SetTest.Common do
3935

4036
test :intersection do
4137
result = Set.intersection(new_set([1, 2, 3]), new_set([2, 3, 4]))
42-
assert sets_equal(result, new_set([2, 3]))
38+
assert Set.equal?(result, new_set([2, 3]))
4339
end
4440

4541
test :member? do
@@ -49,7 +45,7 @@ defmodule SetTest.Common do
4945

5046
test :put do
5147
result = Set.put(new_set([1, 2]), 3)
52-
assert sets_equal(result, new_set([1, 2, 3]))
48+
assert Set.equal?(result, new_set([1, 2, 3]))
5349
end
5450

5551
test :size do
@@ -67,13 +63,18 @@ defmodule SetTest.Common do
6763

6864
test :union do
6965
result = Set.union(new_set([1, 2, 3]), new_set([2, 3, 4]))
70-
assert sets_equal(result, new_set([1, 2, 3, 4]))
66+
assert Set.equal?(result, new_set([1, 2, 3, 4]))
67+
end
68+
69+
test "unsupported set" do
70+
assert_raise ArgumentError, "unsupported set: :bad_set", fn ->
71+
Set.to_list :bad_set
72+
end
7173
end
7274

7375
defp new_set(list // []) do
7476
unquote(module).new(list)
7577
end
76-
7778
end
7879
end
7980
end

0 commit comments

Comments
 (0)