1 | /* |
2 | * Copyright (c) 2001-2009, Jean Tessier |
3 | * All rights reserved. |
4 | * |
5 | * Redistribution and use in source and binary forms, with or without |
6 | * modification, are permitted provided that the following conditions |
7 | * are met: |
8 | * |
9 | * * Redistributions of source code must retain the above copyright |
10 | * notice, this list of conditions and the following disclaimer. |
11 | * |
12 | * * Redistributions in binary form must reproduce the above copyright |
13 | * notice, this list of conditions and the following disclaimer in the |
14 | * documentation and/or other materials provided with the distribution. |
15 | * |
16 | * * Neither the name of Jean Tessier nor the names of his contributors |
17 | * may be used to endorse or promote products derived from this software |
18 | * without specific prior written permission. |
19 | * |
20 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
21 | * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
22 | * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
23 | * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR |
24 | * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, |
25 | * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, |
26 | * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR |
27 | * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF |
28 | * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
29 | * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
30 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
31 | */ |
32 | |
33 | package com.jeantessier.dependency; |
34 | |
35 | import java.util.*; |
36 | |
37 | import junit.framework.*; |
38 | |
39 | public class TestClosureOutboundSelector extends TestCase { |
40 | private NodeFactory localFactory; |
41 | |
42 | private PackageNode a; |
43 | private ClassNode a_A; |
44 | private FeatureNode a_A_a; |
45 | |
46 | private PackageNode b; |
47 | private ClassNode b_B; |
48 | private FeatureNode b_B_b; |
49 | |
50 | private PackageNode c; |
51 | private ClassNode c_C; |
52 | private FeatureNode c_C_c; |
53 | |
54 | protected void setUp() throws Exception { |
55 | super.setUp(); |
56 | |
57 | localFactory = new NodeFactory(); |
58 | |
59 | NodeFactory factory = new NodeFactory(); |
60 | |
61 | a = factory.createPackage("a"); |
62 | a_A = factory.createClass("a.A"); |
63 | a_A_a = factory.createFeature("a.A.a"); |
64 | |
65 | b = factory.createPackage("b"); |
66 | b_B = factory.createClass("b.B"); |
67 | b_B_b = factory.createFeature("b.B.b"); |
68 | |
69 | c = factory.createPackage("c"); |
70 | c_C = factory.createClass("c.C"); |
71 | c_C_c = factory.createFeature("c.C.c"); |
72 | |
73 | a_A_a.addDependency(b_B_b); |
74 | b_B_b.addDependency(c_C_c); |
75 | } |
76 | |
77 | public void testFactory() { |
78 | ClosureOutboundSelector selector = new ClosureOutboundSelector(); |
79 | |
80 | selector.setFactory(localFactory); |
81 | |
82 | assertEquals("factory", localFactory, selector.getFactory()); |
83 | } |
84 | |
85 | public void testCoverage() { |
86 | Collection<Node> coverage = new ArrayList<Node>(); |
87 | |
88 | ClosureOutboundSelector selector = new ClosureOutboundSelector(); |
89 | |
90 | selector.setCoverage(coverage); |
91 | |
92 | assertEquals("coverage", coverage, selector.getCoverage()); |
93 | } |
94 | |
95 | public void testOneSelectedNode() { |
96 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
97 | selector.traverseNodes(Collections.singleton(b_B_b)); |
98 | |
99 | assertEquals("nodes in selection", 1, selector.getSelectedNodes().size()); |
100 | assertEquals("c.C.c in selection", c_C_c, selector.getSelectedNodes().iterator().next()); |
101 | assertSame("c.C.c in selection", c_C_c, selector.getSelectedNodes().iterator().next()); |
102 | } |
103 | |
104 | public void testOneCopiedNode() { |
105 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
106 | selector.traverseNodes(Collections.singleton(b_B_b)); |
107 | |
108 | assertEquals("packages in scope", 2, localFactory.getPackages().size()); |
109 | assertEquals("classes in scope" , 2, localFactory.getClasses().size()); |
110 | assertEquals("features in scope", 2, localFactory.getFeatures().size()); |
111 | |
112 | assertEquals("package b in scope" , b, localFactory.getPackages().get("b")); |
113 | assertEquals("class b.B in scope" , b_B, localFactory.getClasses().get("b.B")); |
114 | assertEquals("feature b.B.b in scope", b_B_b, localFactory.getFeatures().get("b.B.b")); |
115 | assertEquals("package c in scope" , c, localFactory.getPackages().get("c")); |
116 | assertEquals("class c.C in scope" , c_C, localFactory.getClasses().get("c.C")); |
117 | assertEquals("feature c.C.c in scope", c_C_c, localFactory.getFeatures().get("c.C.c")); |
118 | |
119 | assertNotSame("package b in scope" , b, localFactory.getPackages().get("b")); |
120 | assertNotSame("class b.B in scope" , b_B, localFactory.getClasses().get("b.B")); |
121 | assertNotSame("feature b.B.b in scope", b_B_b, localFactory.getFeatures().get("b.B.b")); |
122 | assertNotSame("package c in scope" , c, localFactory.getPackages().get("c")); |
123 | assertNotSame("class c.C in scope" , c_C, localFactory.getClasses().get("c.C")); |
124 | assertNotSame("feature c.C.c in scope", c_C_c, localFactory.getFeatures().get("c.C.c")); |
125 | |
126 | assertEquals("nodes in selection", 1, selector.getCopiedNodes().size()); |
127 | assertEquals("c.C.c in selection", c_C_c, selector.getCopiedNodes().iterator().next()); |
128 | assertNotSame("c.C.c in selection", c_C_c, selector.getCopiedNodes().iterator().next()); |
129 | assertSame("c.C.c in selection", localFactory.getFeatures().get("c.C.c"), selector.getCopiedNodes().iterator().next()); |
130 | assertEquals("c.C.c's inbounds", 1, selector.getCopiedNodes().iterator().next().getInboundDependencies().size()); |
131 | assertEquals("c.C.c's outbounds", 0, selector.getCopiedNodes().iterator().next().getOutboundDependencies().size()); |
132 | } |
133 | |
134 | public void testThreeSelectedNodesFromPackage() { |
135 | b.addDependency(c); |
136 | b.addDependency(c_C); |
137 | b.addDependency(c_C_c); |
138 | |
139 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
140 | selector.traverseNodes(Collections.singleton(b)); |
141 | |
142 | assertEquals("nodes in selection", 3, selector.getSelectedNodes().size()); |
143 | assertTrue("c in selection", selector.getSelectedNodes().contains(c)); |
144 | assertTrue("c.C in selection", selector.getSelectedNodes().contains(c_C)); |
145 | assertTrue("c.C.c in selection", selector.getSelectedNodes().contains(c_C_c)); |
146 | } |
147 | |
148 | public void testThreeSelectedNodesFromClass() { |
149 | b_B.addDependency(c); |
150 | b_B.addDependency(c_C); |
151 | b_B.addDependency(c_C_c); |
152 | |
153 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
154 | selector.traverseNodes(Collections.singleton(b_B)); |
155 | |
156 | assertEquals("nodes in selection", 3, selector.getSelectedNodes().size()); |
157 | assertTrue("c in selection", selector.getSelectedNodes().contains(c)); |
158 | assertTrue("c.C in selection", selector.getSelectedNodes().contains(c_C)); |
159 | assertTrue("c.C.c in selection", selector.getSelectedNodes().contains(c_C_c)); |
160 | } |
161 | |
162 | public void testThreeSelectedNodesFromFeature() { |
163 | b_B_b.addDependency(c); |
164 | b_B_b.addDependency(c_C); |
165 | b_B_b.addDependency(c_C_c); |
166 | |
167 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
168 | selector.traverseNodes(Collections.singleton(b_B_b)); |
169 | |
170 | assertEquals("nodes in selection", 3, selector.getSelectedNodes().size()); |
171 | assertTrue("c in selection", selector.getSelectedNodes().contains(c)); |
172 | assertTrue("c.C in selection", selector.getSelectedNodes().contains(c_C)); |
173 | assertTrue("c.C.c in selection", selector.getSelectedNodes().contains(c_C_c)); |
174 | } |
175 | |
176 | public void testThreeCopiedNodesFromPackage() { |
177 | b.addDependency(c); |
178 | b.addDependency(c_C); |
179 | b.addDependency(c_C_c); |
180 | |
181 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
182 | selector.traverseNodes(Collections.singleton(b)); |
183 | |
184 | assertEquals("nodes in selection", 3, selector.getCopiedNodes().size()); |
185 | assertTrue("c in selection", selector.getCopiedNodes().contains(c)); |
186 | assertTrue("c.C in selection", selector.getCopiedNodes().contains(c_C)); |
187 | assertTrue("c.C.c in selection", selector.getCopiedNodes().contains(c_C_c)); |
188 | |
189 | assertEquals("b's outbounds", 3, localFactory.createPackage("b").getOutboundDependencies().size()); |
190 | } |
191 | |
192 | public void testThreeCopiedNodesFromClass() { |
193 | b_B.addDependency(c); |
194 | b_B.addDependency(c_C); |
195 | b_B.addDependency(c_C_c); |
196 | |
197 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
198 | selector.traverseNodes(Collections.singleton(b_B)); |
199 | |
200 | assertEquals("nodes in selection", 3, selector.getCopiedNodes().size()); |
201 | assertTrue("c in selection", selector.getCopiedNodes().contains(c)); |
202 | assertTrue("c.C in selection", selector.getCopiedNodes().contains(c_C)); |
203 | assertTrue("c.C.c in selection", selector.getCopiedNodes().contains(c_C_c)); |
204 | |
205 | assertEquals("b.B's outbounds", 3, localFactory.createClass("b.B").getOutboundDependencies().size()); |
206 | } |
207 | |
208 | public void testThreeCopiedNodesFromFeature() { |
209 | b_B_b.addDependency(c); |
210 | b_B_b.addDependency(c_C); |
211 | b_B_b.addDependency(c_C_c); |
212 | |
213 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
214 | selector.traverseNodes(Collections.singleton(b_B_b)); |
215 | |
216 | assertEquals("nodes in selection", 3, selector.getCopiedNodes().size()); |
217 | assertTrue("c in selection", selector.getCopiedNodes().contains(c)); |
218 | assertTrue("c.C in selection", selector.getCopiedNodes().contains(c_C)); |
219 | assertTrue("c.C.c in selection", selector.getCopiedNodes().contains(c_C_c)); |
220 | |
221 | assertEquals("b.B.b's outbounds", 3, localFactory.createFeature("b.B.b").getOutboundDependencies().size()); |
222 | } |
223 | |
224 | public void testTwoSelectedNodeWithPackageInCoverage() { |
225 | b_B_b.addDependency(c); |
226 | b_B_b.addDependency(c_C); |
227 | b_B_b.addDependency(c_C_c); |
228 | |
229 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.singleton(c)); |
230 | selector.traverseNodes(Collections.singleton(b_B_b)); |
231 | |
232 | assertEquals("nodes in selection", 2, selector.getSelectedNodes().size()); |
233 | assertTrue("c.C in selection", selector.getSelectedNodes().contains(c_C)); |
234 | assertTrue("c.C.c in selection", selector.getSelectedNodes().contains(c_C_c)); |
235 | } |
236 | |
237 | public void testTwoSelectedNodeWithClassInCoverage() { |
238 | b_B_b.addDependency(c); |
239 | b_B_b.addDependency(c_C); |
240 | b_B_b.addDependency(c_C_c); |
241 | |
242 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.singleton(c_C)); |
243 | selector.traverseNodes(Collections.singleton(b_B_b)); |
244 | |
245 | assertEquals("nodes in selection", 2, selector.getSelectedNodes().size()); |
246 | assertTrue("c in selection", selector.getSelectedNodes().contains(c)); |
247 | assertTrue("c.C.c in selection", selector.getSelectedNodes().contains(c_C_c)); |
248 | } |
249 | |
250 | public void testTwoSelectedNodeWithFeatureInCoverage() { |
251 | b_B_b.addDependency(c); |
252 | b_B_b.addDependency(c_C); |
253 | b_B_b.addDependency(c_C_c); |
254 | |
255 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.singleton(c_C_c)); |
256 | selector.traverseNodes(Collections.singleton(b_B_b)); |
257 | |
258 | assertEquals("nodes in selection", 2, selector.getSelectedNodes().size()); |
259 | assertTrue("c in selection", selector.getSelectedNodes().contains(c)); |
260 | assertTrue("c.C in selection", selector.getSelectedNodes().contains(c_C)); |
261 | } |
262 | |
263 | public void testTwoCopiedNodeWithPackageInCoverage() { |
264 | b_B_b.addDependency(c); |
265 | b_B_b.addDependency(c_C); |
266 | b_B_b.addDependency(c_C_c); |
267 | |
268 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.singleton(c)); |
269 | selector.traverseNodes(Collections.singleton(b_B_b)); |
270 | |
271 | assertEquals("nodes in selection", 2, selector.getCopiedNodes().size()); |
272 | assertTrue("c.C in selection", selector.getCopiedNodes().contains(c_C)); |
273 | assertTrue("c.C.c in selection", selector.getCopiedNodes().contains(c_C_c)); |
274 | |
275 | assertEquals("b.B.b's outbounds", 2, localFactory.createFeature("b.B.b").getOutboundDependencies().size()); |
276 | } |
277 | |
278 | public void testTwoCopiedNodeWithClassInCoverage() { |
279 | b_B_b.addDependency(c); |
280 | b_B_b.addDependency(c_C); |
281 | b_B_b.addDependency(c_C_c); |
282 | |
283 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.singleton(c_C)); |
284 | selector.traverseNodes(Collections.singleton(b_B_b)); |
285 | |
286 | assertEquals("nodes in selection", 2, selector.getCopiedNodes().size()); |
287 | assertTrue("c in selection", selector.getCopiedNodes().contains(c)); |
288 | assertTrue("c.C.c in selection", selector.getCopiedNodes().contains(c_C_c)); |
289 | |
290 | assertEquals("b.B.b's outbounds", 2, localFactory.createFeature("b.B.b").getOutboundDependencies().size()); |
291 | } |
292 | |
293 | public void testTwoCopiedNodeWithFeatureInCoverage() { |
294 | b_B_b.addDependency(c); |
295 | b_B_b.addDependency(c_C); |
296 | b_B_b.addDependency(c_C_c); |
297 | |
298 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.singleton(c_C_c)); |
299 | selector.traverseNodes(Collections.singleton(b_B_b)); |
300 | |
301 | assertEquals("nodes in selection", 2, selector.getCopiedNodes().size()); |
302 | assertTrue("c in selection", selector.getCopiedNodes().contains(c)); |
303 | assertTrue("c.C in selection", selector.getCopiedNodes().contains(c_C)); |
304 | |
305 | assertEquals("b.B.b's outbounds", 2, localFactory.createFeature("b.B.b").getOutboundDependencies().size()); |
306 | } |
307 | |
308 | public void testReset() { |
309 | NodeFactory localFactory = new NodeFactory(); |
310 | |
311 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
312 | selector.traverseNodes(Collections.singleton(b_B_b)); |
313 | |
314 | assertEquals("nodes in selection", 1, selector.getSelectedNodes().size()); |
315 | assertEquals("copied nodes", 1, selector.getCopiedNodes().size()); |
316 | |
317 | selector.reset(); |
318 | |
319 | assertEquals("nodes in selection", 0, selector.getSelectedNodes().size()); |
320 | assertEquals("copied nodes", 0, selector.getCopiedNodes().size()); |
321 | } |
322 | |
323 | public void testVisitInferredPackage() { |
324 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
325 | selector.traverseNodes(Collections.singleton(b)); |
326 | |
327 | assertEquals("package.isConfirmed()", b.isConfirmed(), localFactory.getPackages().get(b.getName()).isConfirmed()); |
328 | } |
329 | |
330 | public void testVisitConfirmedPackage() { |
331 | b.setConfirmed(true); |
332 | |
333 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
334 | selector.traverseNodes(Collections.singleton(b)); |
335 | |
336 | assertEquals("package.isConfirmed()", b.isConfirmed(), localFactory.getPackages().get(b.getName()).isConfirmed()); |
337 | } |
338 | |
339 | public void testFollowToInferredPackage() { |
340 | b.addDependency(c); |
341 | |
342 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
343 | selector.traverseNodes(Collections.singleton(b)); |
344 | |
345 | assertEquals("package.isConfirmed()", c.isConfirmed(), localFactory.getPackages().get(c.getName()).isConfirmed()); |
346 | } |
347 | |
348 | public void testFollowToConfirmedPackage() { |
349 | b.addDependency(c); |
350 | c.setConfirmed(true); |
351 | |
352 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
353 | selector.traverseNodes(Collections.singleton(b)); |
354 | |
355 | assertEquals("package.isConfirmed()", c.isConfirmed(), localFactory.getPackages().get(c.getName()).isConfirmed()); |
356 | } |
357 | |
358 | public void testVisitInferredClass() { |
359 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
360 | selector.traverseNodes(Collections.singleton(b_B)); |
361 | |
362 | assertEquals("class.isConfirmed()", b_B.isConfirmed(), localFactory.getClasses().get(b_B.getName()).isConfirmed()); |
363 | } |
364 | |
365 | public void testVisitConfirmedClass() { |
366 | b_B.setConfirmed(true); |
367 | |
368 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
369 | selector.traverseNodes(Collections.singleton(b_B)); |
370 | |
371 | assertEquals("class.isConfirmed()", b_B.isConfirmed(), localFactory.getClasses().get(b_B.getName()).isConfirmed()); |
372 | } |
373 | |
374 | public void testFollowToInferredClass() { |
375 | b_B.addDependency(c_C); |
376 | |
377 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
378 | selector.traverseNodes(Collections.singleton(b_B)); |
379 | |
380 | assertEquals("class.isConfirmed()", c_C.isConfirmed(), localFactory.getClasses().get(c_C.getName()).isConfirmed()); |
381 | } |
382 | |
383 | public void testFollowToConfirmedClass() { |
384 | b_B.addDependency(c_C); |
385 | c_C.setConfirmed(true); |
386 | |
387 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
388 | selector.traverseNodes(Collections.singleton(b_B)); |
389 | |
390 | assertEquals("class.isConfirmed()", c_C.isConfirmed(), localFactory.getClasses().get(c_C.getName()).isConfirmed()); |
391 | } |
392 | |
393 | public void testVisitInferredFeature() { |
394 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
395 | selector.traverseNodes(Collections.singleton(b_B_b)); |
396 | |
397 | assertEquals("feature.isConfirmed()", b_B_b.isConfirmed(), localFactory.getFeatures().get(b_B_b.getName()).isConfirmed()); |
398 | } |
399 | |
400 | public void testVisitConfirmedFeature() { |
401 | b_B_b.setConfirmed(true); |
402 | |
403 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
404 | selector.traverseNodes(Collections.singleton(b_B_b)); |
405 | |
406 | assertEquals("feature.isConfirmed()", b_B_b.isConfirmed(), localFactory.getFeatures().get(b_B_b.getName()).isConfirmed()); |
407 | } |
408 | |
409 | public void testFollowToInferredFeature() { |
410 | b_B_b.addDependency(c_C_c); |
411 | |
412 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
413 | selector.traverseNodes(Collections.singleton(b_B_b)); |
414 | |
415 | assertEquals("feature.isConfirmed()", c_C_c.isConfirmed(), localFactory.getFeatures().get(c_C_c.getName()).isConfirmed()); |
416 | } |
417 | |
418 | public void testFollowToConfirmedFeature() { |
419 | b_B_b.addDependency(c_C_c); |
420 | c_C_c.setConfirmed(true); |
421 | |
422 | ClosureOutboundSelector selector = new ClosureOutboundSelector(localFactory, Collections.<Node>emptySet()); |
423 | selector.traverseNodes(Collections.singleton(b_B_b)); |
424 | |
425 | assertEquals("feature.isConfirmed()", c_C_c.isConfirmed(), localFactory.getFeatures().get(c_C_c.getName()).isConfirmed()); |
426 | } |
427 | } |