Skip to content

Commit ca7fbe7

Browse files
committed
test: 🚨 add rb_set tests
1 parent 1f3731e commit ca7fbe7

File tree

1 file changed

+151
-0
lines changed

1 file changed

+151
-0
lines changed

test/rb_set_test.exs

+151
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
defmodule RBSetTest do
2+
@moduledoc """
3+
Testing RBSet
4+
"""
5+
6+
use ExUnit.Case, async: true
7+
8+
import RBSet
9+
doctest RBSet
10+
11+
setup do
12+
{:ok, empty_set: RBSet.new(), set_with_elements: RBSet.new([1, 2, 3])}
13+
end
14+
15+
test "create a new empty set", %{empty_set: empty_set} do
16+
assert RBSet.size(empty_set) == 0
17+
end
18+
19+
test "create a new set with elements", %{set_with_elements: set_with_elements} do
20+
assert RBSet.size(set_with_elements) == 3
21+
assert RBSet.member?(set_with_elements, 1)
22+
assert RBSet.member?(set_with_elements, 2)
23+
assert RBSet.member?(set_with_elements, 3)
24+
refute RBSet.member?(set_with_elements, 5)
25+
end
26+
27+
test "create a set from an enumerable via the transformation function" do
28+
set = RBSet.new([1, 2, 3, 4, 5], fn x -> x * 2 end)
29+
assert RBSet.member?(set, 10)
30+
end
31+
32+
test "add an element to the set", %{empty_set: empty_set} do
33+
set = RBSet.put(empty_set, 42)
34+
assert RBSet.size(set) == 1
35+
assert RBSet.member?(set, 42)
36+
end
37+
38+
test "remove an element from the set", %{set_with_elements: set_with_elements} do
39+
set = RBSet.delete(set_with_elements, 2)
40+
assert RBSet.size(set) == 2
41+
refute RBSet.member?(set, 2)
42+
end
43+
44+
test "check if an element is a member of the set", %{set_with_elements: set_with_elements} do
45+
assert RBSet.member?(set_with_elements, 1)
46+
refute RBSet.member?(set_with_elements, 4)
47+
end
48+
49+
test "map set", %{set_with_elements: set_with_elements} do
50+
assert RBSet.map(set_with_elements, fn x -> x * 10 end) |> member?(20)
51+
end
52+
53+
test "filter set", %{set_with_elements: set_with_elements} do
54+
assert [1, 3] ==
55+
RBSet.filter(set_with_elements, fn x -> rem(x, 2) == 1 end) |> RBSet.to_list()
56+
end
57+
58+
test "fold set" do
59+
set = RBSet.new([1, 4, 2, 3])
60+
result_reduce = RBSet.reduce(set, 0, fn x, acc -> acc - x end)
61+
result_right = RBSet.fold_right(set, 0, fn x, acc -> acc - x end)
62+
result_left = RBSet.fold_left(set, 0, fn x, acc -> acc - x end)
63+
64+
assert result_reduce == -10
65+
assert result_right == -10
66+
assert result_left == 2
67+
end
68+
69+
test "check equality of sets" do
70+
set1 = RBSet.new([1, 2, 3])
71+
set2 = RBSet.new([3, 2, 1])
72+
set3 = RBSet.new([1, 2, 4])
73+
74+
assert RBSet.equal?(set1, set2)
75+
refute RBSet.equal?(set1, set3)
76+
end
77+
78+
test "intersection of sets" do
79+
set1 = RBSet.new([1, 2, 3])
80+
set2 = RBSet.new([3, 4, 5])
81+
result_set = RBSet.intersection(set1, set2)
82+
83+
assert RBSet.size(result_set) == 1
84+
assert RBSet.member?(result_set, 3)
85+
end
86+
87+
test "union of sets", %{empty_set: empty_set} do
88+
set1 = RBSet.new([1, 2, 3])
89+
set2 = RBSet.new([3, 4, 5])
90+
91+
assert RBSet.size(set1 ||| set2) == 5
92+
assert RBSet.size(set1 ||| empty_set) == 3
93+
assert RBSet.size(empty_set ||| set1) == 3
94+
assert RBSet.size(RBSet.union(set1, set2)) == 5
95+
assert Enum.all?([1, 2, 3, 4, 5], &RBSet.member?(RBSet.union(set1, set2), &1))
96+
end
97+
98+
test "difference of sets" do
99+
set1 = RBSet.new([1, 2, 3])
100+
set2 = RBSet.new([3, 4, 5])
101+
102+
assert RBSet.size(RBSet.difference(set1, set2)) == 2
103+
assert [1, 2] == RBSet.difference(set1, set2) |> RBSet.to_list()
104+
assert [1, 2] == set1 <<< set2 |> RBSet.to_list()
105+
assert [4, 5] == set1 >>> set2 |> RBSet.to_list()
106+
assert [4, 5] == set2 <<< set1 |> RBSet.to_list()
107+
assert [1, 2] == set2 >>> set1 |> RBSet.to_list()
108+
end
109+
110+
test "subset check" do
111+
set1 = RBSet.new([1, 2])
112+
set2 = RBSet.new([1, 2, 3])
113+
114+
assert RBSet.subset?(set1, set2)
115+
assert set1 ~> set2
116+
assert set2 <~ set1
117+
refute set2 ~> set1
118+
end
119+
120+
test "disjoint sets" do
121+
set1 = RBSet.new([1, 2])
122+
set2 = RBSet.new([3, 4])
123+
124+
assert RBSet.disjoint?(set1, set2)
125+
126+
set3 = RBSet.new([2, 3])
127+
refute RBSet.disjoint?(set1, set3)
128+
end
129+
130+
test "implements Enumerable" do
131+
set1 = RBSet.new([1, 2, 3, 3, 4])
132+
133+
assert Enum.count(set1) == 4
134+
assert Enum.member?(set1, 1)
135+
refute Enum.member?(set1, 5)
136+
assert Enum.reduce(set1, 0, fn el, acc -> acc + el end) == 10
137+
assert Enum.slice(set1, 1..3) == [2, 3, 4]
138+
end
139+
140+
test "implements Into" do
141+
map_set = Enum.into(RBSet.new([5, 1, 4, 2, 3]), MapSet.new())
142+
assert map_set == MapSet.new([1, 2, 3, 4, 5])
143+
end
144+
145+
test "implements Inspect", %{empty_set: empty_set} do
146+
set1 = RBSet.new([4, 2, 3, 1])
147+
148+
assert inspect(empty_set) == "RBSet.new([])"
149+
assert inspect(set1) == "RBSet.new([1, 2, 3, 4])"
150+
end
151+
end

0 commit comments

Comments
 (0)