Skip to content

Commit c21a2a2

Browse files
committed
Unit tests for n-ary tree building
1 parent de84427 commit c21a2a2

File tree

2 files changed

+180
-7
lines changed

2 files changed

+180
-7
lines changed

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,10 @@ all: compile
88

99
include tools.mk
1010

11-
test: common_test cover
11+
test: eunit common_test cover
12+
13+
eunit:
14+
$(REBAR) eunit
1215

1316
common_test:
1417
$(REBAR) ct

src/plumtree_util.erl

Lines changed: 176 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,12 +32,13 @@
3232
-spec build_tree(N :: integer(), Nodes :: [term()], Opts :: [term()])
3333
-> orddict:orddict().
3434
build_tree(N, Nodes, Opts) ->
35-
case lists:member(cycles, Opts) of
36-
true ->
37-
Expand = lists:flatten(lists:duplicate(N+1, Nodes));
38-
false ->
39-
Expand = Nodes
40-
end,
35+
Expand =
36+
case lists:member(cycles, Opts) of
37+
true ->
38+
lists:flatten(lists:duplicate(N+1, Nodes));
39+
false ->
40+
Nodes
41+
end,
4142
{Tree, _} =
4243
lists:foldl(fun(Elm, {Result, Worklist}) ->
4344
Len = erlang:min(N, length(Worklist)),
@@ -46,3 +47,172 @@ build_tree(N, Nodes, Opts) ->
4647
{NewResult, Rest}
4748
end, {[], tl(Expand)}, Nodes),
4849
orddict:from_list(Tree).
50+
51+
%%
52+
%% Tests
53+
%%
54+
-ifdef(TEST).
55+
56+
-include_lib("eunit/include/eunit.hrl").
57+
58+
arity_test() ->
59+
%% 1-ary tree
60+
?assertEqual([{node1, []}], orddict:to_list(build_tree(1, [node1], []))),
61+
?assertEqual([{node1, [node2]},
62+
{node2, []}], orddict:to_list(build_tree(1, [node1, node2], []))),
63+
?assertEqual([{node1, [node2]},
64+
{node2, [node3]},
65+
{node3, []}], orddict:to_list(build_tree(1, [node1, node2, node3], []))),
66+
?assertEqual([{node1, [node2]},
67+
{node2, [node3]},
68+
{node3, [node4]},
69+
{node4, []}], orddict:to_list(build_tree(1, [node1, node2,
70+
node3, node4], []))),
71+
72+
%% 2-ary tree
73+
?assertEqual([{node1, []}], orddict:to_list(build_tree(2, [node1], []))),
74+
?assertEqual([{node1, [node2]},
75+
{node2, []}], orddict:to_list(build_tree(2, [node1, node2], []))),
76+
?assertEqual([{node1, [node2, node3]},
77+
{node2, []},
78+
{node3, []}], orddict:to_list(build_tree(2, [node1, node2, node3], []))),
79+
?assertEqual([{node1, [node2, node3]},
80+
{node2, [node4]},
81+
{node3, []},
82+
{node4, []}], orddict:to_list(build_tree(2, [node1, node2,
83+
node3, node4], []))),
84+
?assertEqual([{node1, [node2, node3]},
85+
{node2, [node4, node5]},
86+
{node3, []},
87+
{node4, []},
88+
{node5, []}], orddict:to_list(build_tree(2, [node1, node2,
89+
node3, node4,
90+
node5], []))),
91+
?assertEqual([{node1, [node2, node3]},
92+
{node2, [node4, node5]},
93+
{node3, [node6]},
94+
{node4, []},
95+
{node5, []},
96+
{node6, []}], orddict:to_list(build_tree(2, [node1, node2,
97+
node3, node4,
98+
node5, node6], []))),
99+
100+
%% 3-ary tree
101+
?assertEqual([{node1, []}], orddict:to_list(build_tree(3, [node1], []))),
102+
?assertEqual([{node1, [node2]},
103+
{node2, []}], orddict:to_list(build_tree(3, [node1, node2], []))),
104+
?assertEqual([{node1, [node2, node3]},
105+
{node2, []},
106+
{node3, []}], orddict:to_list(build_tree(3, [node1, node2, node3], []))),
107+
?assertEqual([{node1, [node2, node3, node4]},
108+
{node2, []},
109+
{node3, []},
110+
{node4, []}], orddict:to_list(build_tree(3, [node1, node2,
111+
node3, node4], []))),
112+
?assertEqual([{node1, [node2, node3, node4]},
113+
{node2, [node5]},
114+
{node3, []},
115+
{node4, []},
116+
{node5, []}], orddict:to_list(build_tree(3, [node1, node2,
117+
node3, node4,
118+
node5], []))),
119+
?assertEqual([{node1, [node2, node3, node4]},
120+
{node2, [node5, node6]},
121+
{node3, []},
122+
{node4, []},
123+
{node5, []},
124+
{node6, []}], orddict:to_list(build_tree(3, [node1, node2,
125+
node3, node4,
126+
node5, node6], []))),
127+
?assertEqual([{node1, [node2, node3, node4]},
128+
{node2, [node5, node6, node7]},
129+
{node3, []},
130+
{node4, []},
131+
{node5, []},
132+
{node6, []},
133+
{node7, []}], orddict:to_list(build_tree(3, [node1, node2,
134+
node3, node4,
135+
node5, node6,
136+
node7], []))),
137+
?assertEqual([{node1, [node2, node3, node4]},
138+
{node2, [node5, node6, node7]},
139+
{node3, [node8]},
140+
{node4, []},
141+
{node5, []},
142+
{node6, []},
143+
{node7, []},
144+
{node8, []}], orddict:to_list(build_tree(3, [node1, node2,
145+
node3, node4,
146+
node5, node6,
147+
node7, node8], []))).
148+
149+
cycles_test() ->
150+
%% 1-ary tree
151+
?assertEqual([{node1, [node1]}], orddict:to_list(build_tree(1, [node1], [cycles]))),
152+
?assertEqual([{node1, [node2]},
153+
{node2, [node1]}], orddict:to_list(build_tree(1, [node1, node2], [cycles]))),
154+
?assertEqual([{node1, [node2]},
155+
{node2, [node3]},
156+
{node3, [node1]}], orddict:to_list(build_tree(1, [node1, node2, node3], [cycles]))),
157+
?assertEqual([{node1, [node2]},
158+
{node2, [node3]},
159+
{node3, [node4]},
160+
{node4, [node1]}], orddict:to_list(build_tree(1, [node1, node2,
161+
node3, node4], [cycles]))),
162+
163+
%% 2-ary tree
164+
?assertEqual([{node1, [node1, node1]}], orddict:to_list(build_tree(2, [node1], [cycles]))),
165+
?assertEqual([{node1, [node2, node1]},
166+
{node2, [node2, node1]}], orddict:to_list(build_tree(2, [node1, node2], [cycles]))),
167+
?assertEqual([{node1, [node2, node3]},
168+
{node2, [node1, node2]},
169+
{node3, [node3, node1]}], orddict:to_list(build_tree(2, [node1, node2, node3], [cycles]))),
170+
?assertEqual([{node1, [node2, node3]},
171+
{node2, [node4, node1]},
172+
{node3, [node2, node3]},
173+
{node4, [node4, node1]}], orddict:to_list(build_tree(2, [node1, node2,
174+
node3, node4], [cycles]))),
175+
?assertEqual([{node1, [node2, node3]},
176+
{node2, [node4, node5]},
177+
{node3, [node1, node2]},
178+
{node4, [node3, node4]},
179+
{node5, [node5, node1]}], orddict:to_list(build_tree(2, [node1, node2,
180+
node3, node4,
181+
node5], [cycles]))),
182+
?assertEqual([{node1, [node2, node3]},
183+
{node2, [node4, node5]},
184+
{node3, [node6, node1]},
185+
{node4, [node2, node3]},
186+
{node5, [node4, node5]},
187+
{node6, [node6, node1]}], orddict:to_list(build_tree(2, [node1, node2,
188+
node3, node4,
189+
node5, node6], [cycles]))),
190+
191+
%% 3-ary tree
192+
?assertEqual([{node1, [node1, node1, node1]}], orddict:to_list(build_tree(3, [node1], [cycles]))),
193+
?assertEqual([{node1, [node2, node1, node2]},
194+
{node2, [node1, node2, node1]}], orddict:to_list(build_tree(3, [node1, node2], [cycles]))),
195+
?assertEqual([{node1, [node2, node3, node1]},
196+
{node2, [node2, node3, node1]},
197+
{node3, [node2, node3, node1]}], orddict:to_list(build_tree(3, [node1, node2, node3], [cycles]))),
198+
?assertEqual([{node1, [node2, node3, node4]},
199+
{node2, [node1, node2, node3]},
200+
{node3, [node4, node1, node2]},
201+
{node4, [node3, node4, node1]}], orddict:to_list(build_tree(3, [node1, node2,
202+
node3, node4], [cycles]))),
203+
?assertEqual([{node1, [node2, node3, node4]},
204+
{node2, [node5, node1, node2]},
205+
{node3, [node3, node4, node5]},
206+
{node4, [node1, node2, node3]},
207+
{node5, [node4, node5, node1]}], orddict:to_list(build_tree(3, [node1, node2,
208+
node3, node4,
209+
node5], [cycles]))),
210+
?assertEqual([{node1, [node2, node3, node4]},
211+
{node2, [node5, node6, node1]},
212+
{node3, [node2, node3, node4]},
213+
{node4, [node5, node6, node1]},
214+
{node5, [node2, node3, node4]},
215+
{node6, [node5, node6, node1]}], orddict:to_list(build_tree(3, [node1, node2,
216+
node3, node4,
217+
node5, node6], [cycles]))).
218+
-endif.

0 commit comments

Comments
 (0)