3232-spec build_tree (N :: integer (), Nodes :: [term ()], Opts :: [term ()])
3333 -> orddict :orddict ().
3434build_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