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 TestClosureInboundSelector 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 | ClosureInboundSelector selector = new ClosureInboundSelector(); |
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 | ClosureInboundSelector selector = new ClosureInboundSelector(); |
89 | |
90 | selector.setCoverage(coverage); |
91 | |
92 | assertEquals("coverage", coverage, selector.getCoverage()); |
93 | } |
94 | |
95 | public void testOneSelectedNode() { |
96 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
97 | selector.traverseNodes(Collections.singleton(b_B_b)); |
98 | |
99 | assertEquals("nodes in selection", 1, selector.getSelectedNodes().size()); |
100 | assertEquals("a.A.a in selection", a_A_a, selector.getSelectedNodes().iterator().next()); |
101 | assertSame("a.A.a in selection", a_A_a, selector.getSelectedNodes().iterator().next()); |
102 | } |
103 | |
104 | public void testOneCopiedNode() { |
105 | ClosureInboundSelector selector = new ClosureInboundSelector(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 a in scope" , a, localFactory.getPackages().get("a")); |
113 | assertEquals("class a.A in scope" , a_A, localFactory.getClasses().get("a.A")); |
114 | assertEquals("feature a.A.a in scope", a_A_a, localFactory.getFeatures().get("a.A.a")); |
115 | assertEquals("package b in scope" , b, localFactory.getPackages().get("b")); |
116 | assertEquals("class b.B in scope" , b_B, localFactory.getClasses().get("b.B")); |
117 | assertEquals("feature b.B.b in scope", b_B_b, localFactory.getFeatures().get("b.B.b")); |
118 | |
119 | assertNotSame("package a in scope" , a, localFactory.getPackages().get("a")); |
120 | assertNotSame("class a.A in scope" , a_A, localFactory.getClasses().get("a.A")); |
121 | assertNotSame("feature a.A.a in scope", a_A_a, localFactory.getFeatures().get("a.A.a")); |
122 | assertNotSame("package b in scope" , b, localFactory.getPackages().get("b")); |
123 | assertNotSame("class b.B in scope" , b_B, localFactory.getClasses().get("b.B")); |
124 | assertNotSame("feature b.B.b in scope", b_B_b, localFactory.getFeatures().get("b.B.b")); |
125 | |
126 | assertEquals("nodes in selection", 1, selector.getCopiedNodes().size()); |
127 | assertEquals("a.A.a in selection", a_A_a, selector.getCopiedNodes().iterator().next()); |
128 | assertNotSame("a.A.a in selection", a_A_a, selector.getCopiedNodes().iterator().next()); |
129 | assertSame("a.A.a in selection", localFactory.getFeatures().get("a.A.a"), selector.getCopiedNodes().iterator().next()); |
130 | assertEquals("a.A.a's inbounds", 0, selector.getCopiedNodes().iterator().next().getInboundDependencies().size()); |
131 | assertEquals("a.A.a's outbounds", 1, selector.getCopiedNodes().iterator().next().getOutboundDependencies().size()); |
132 | } |
133 | |
134 | public void testThreeSelectedNodesFromPackage() { |
135 | a.addDependency(b); |
136 | a_A.addDependency(b); |
137 | a_A_a.addDependency(b); |
138 | |
139 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
140 | selector.traverseNodes(Collections.singleton(b)); |
141 | |
142 | assertEquals("nodes in selection", 3, selector.getSelectedNodes().size()); |
143 | assertTrue("a in selection", selector.getSelectedNodes().contains(a)); |
144 | assertTrue("a.A in selection", selector.getSelectedNodes().contains(a_A)); |
145 | assertTrue("a.A.a in selection", selector.getSelectedNodes().contains(a_A_a)); |
146 | } |
147 | |
148 | public void testThreeSelectedNodesFromClass() { |
149 | a.addDependency(b_B); |
150 | a_A.addDependency(b_B); |
151 | a_A_a.addDependency(b_B); |
152 | |
153 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
154 | selector.traverseNodes(Collections.singleton(b_B)); |
155 | |
156 | assertEquals("nodes in selection", 3, selector.getSelectedNodes().size()); |
157 | assertTrue("a in selection", selector.getSelectedNodes().contains(a)); |
158 | assertTrue("a.A in selection", selector.getSelectedNodes().contains(a_A)); |
159 | assertTrue("a.A.a in selection", selector.getSelectedNodes().contains(a_A_a)); |
160 | } |
161 | |
162 | public void testThreeSelectedNodesFromFeature() { |
163 | a.addDependency(b_B_b); |
164 | a_A.addDependency(b_B_b); |
165 | a_A_a.addDependency(b_B_b); |
166 | |
167 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
168 | selector.traverseNodes(Collections.singleton(b_B_b)); |
169 | |
170 | assertEquals("nodes in selection", 3, selector.getSelectedNodes().size()); |
171 | assertTrue("a in selection", selector.getSelectedNodes().contains(a)); |
172 | assertTrue("a.A in selection", selector.getSelectedNodes().contains(a_A)); |
173 | assertTrue("a.A.a in selection", selector.getSelectedNodes().contains(a_A_a)); |
174 | } |
175 | |
176 | public void testThreeCopiedNodesFromPackage() { |
177 | a.addDependency(b); |
178 | a_A.addDependency(b); |
179 | a_A_a.addDependency(b); |
180 | |
181 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
182 | selector.traverseNodes(Collections.singleton(b)); |
183 | |
184 | assertEquals("nodes in selection", 3, selector.getCopiedNodes().size()); |
185 | assertTrue("a in selection", selector.getCopiedNodes().contains(a)); |
186 | assertTrue("a.A in selection", selector.getCopiedNodes().contains(a_A)); |
187 | assertTrue("a.A.a in selection", selector.getCopiedNodes().contains(a_A_a)); |
188 | |
189 | assertEquals("b's inbounds", 3, localFactory.createPackage("b").getInboundDependencies().size()); |
190 | } |
191 | |
192 | public void testThreeCopiedNodesFromClass() { |
193 | a.addDependency(b_B); |
194 | a_A.addDependency(b_B); |
195 | a_A_a.addDependency(b_B); |
196 | |
197 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
198 | selector.traverseNodes(Collections.singleton(b_B)); |
199 | |
200 | assertEquals("nodes in selection", 3, selector.getCopiedNodes().size()); |
201 | assertTrue("a in selection", selector.getCopiedNodes().contains(a)); |
202 | assertTrue("a.A in selection", selector.getCopiedNodes().contains(a_A)); |
203 | assertTrue("a.A.a in selection", selector.getCopiedNodes().contains(a_A_a)); |
204 | |
205 | assertEquals("b.B's inbounds", 3, localFactory.createClass("b.B").getInboundDependencies().size()); |
206 | } |
207 | |
208 | public void testThreeCopiedNodesFromFeature() { |
209 | a.addDependency(b_B_b); |
210 | a_A.addDependency(b_B_b); |
211 | a_A_a.addDependency(b_B_b); |
212 | |
213 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
214 | selector.traverseNodes(Collections.singleton(b_B_b)); |
215 | |
216 | assertEquals("nodes in selection", 3, selector.getCopiedNodes().size()); |
217 | assertTrue("a in selection", selector.getCopiedNodes().contains(a)); |
218 | assertTrue("a.A in selection", selector.getCopiedNodes().contains(a_A)); |
219 | assertTrue("a.A.a in selection", selector.getCopiedNodes().contains(a_A_a)); |
220 | |
221 | assertEquals("b.B.b's inbounds", 3, localFactory.createFeature("b.B.b").getInboundDependencies().size()); |
222 | } |
223 | |
224 | public void testTwoSelectedNodeWithPackageInCoverage() { |
225 | a.addDependency(b_B_b); |
226 | a_A.addDependency(b_B_b); |
227 | a_A_a.addDependency(b_B_b); |
228 | |
229 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.singleton(a)); |
230 | selector.traverseNodes(Collections.singleton(b_B_b)); |
231 | |
232 | assertEquals("nodes in selection", 2, selector.getSelectedNodes().size()); |
233 | assertTrue("a.A in selection", selector.getSelectedNodes().contains(a_A)); |
234 | assertTrue("a.A.a in selection", selector.getSelectedNodes().contains(a_A_a)); |
235 | } |
236 | |
237 | public void testTwoSelectedNodeWithClassInCoverage() { |
238 | a.addDependency(b_B_b); |
239 | a_A.addDependency(b_B_b); |
240 | a_A_a.addDependency(b_B_b); |
241 | |
242 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.singleton(a_A)); |
243 | selector.traverseNodes(Collections.singleton(b_B_b)); |
244 | |
245 | assertEquals("nodes in selection", 2, selector.getSelectedNodes().size()); |
246 | assertTrue("a in selection", selector.getSelectedNodes().contains(a)); |
247 | assertTrue("a.A.a in selection", selector.getSelectedNodes().contains(a_A_a)); |
248 | } |
249 | |
250 | public void testTwoSelectedNodeWithFeatureInCoverage() { |
251 | a.addDependency(b_B_b); |
252 | a_A.addDependency(b_B_b); |
253 | a_A_a.addDependency(b_B_b); |
254 | |
255 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.singleton(a_A_a)); |
256 | selector.traverseNodes(Collections.singleton(b_B_b)); |
257 | |
258 | assertEquals("nodes in selection", 2, selector.getSelectedNodes().size()); |
259 | assertTrue("a in selection", selector.getSelectedNodes().contains(a)); |
260 | assertTrue("a.A in selection", selector.getSelectedNodes().contains(a_A)); |
261 | } |
262 | |
263 | public void testTwoCopiedNodeWithPackageInCoverage() { |
264 | a.addDependency(b_B_b); |
265 | a_A.addDependency(b_B_b); |
266 | a_A_a.addDependency(b_B_b); |
267 | |
268 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.singleton(a)); |
269 | selector.traverseNodes(Collections.singleton(b_B_b)); |
270 | |
271 | assertEquals("nodes in selection", 2, selector.getCopiedNodes().size()); |
272 | assertTrue("a.A in selection", selector.getCopiedNodes().contains(a_A)); |
273 | assertTrue("a.A.a in selection", selector.getCopiedNodes().contains(a_A_a)); |
274 | |
275 | assertEquals("b.B.b's inbounds", 2, localFactory.createFeature("b.B.b").getInboundDependencies().size()); |
276 | } |
277 | |
278 | public void testTwoCopiedNodeWithClassInCoverage() { |
279 | a.addDependency(b_B_b); |
280 | a_A.addDependency(b_B_b); |
281 | a_A_a.addDependency(b_B_b); |
282 | |
283 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.singleton(a_A)); |
284 | selector.traverseNodes(Collections.singleton(b_B_b)); |
285 | |
286 | assertEquals("nodes in selection", 2, selector.getCopiedNodes().size()); |
287 | assertTrue("a in selection", selector.getCopiedNodes().contains(a)); |
288 | assertTrue("a.A.a in selection", selector.getCopiedNodes().contains(a_A_a)); |
289 | |
290 | assertEquals("b.B.b's inbounds", 2, localFactory.createFeature("b.B.b").getInboundDependencies().size()); |
291 | } |
292 | |
293 | public void testTwoCopiedNodeWithFeatureInCoverage() { |
294 | a.addDependency(b_B_b); |
295 | a_A.addDependency(b_B_b); |
296 | a_A_a.addDependency(b_B_b); |
297 | |
298 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.singleton(a_A_a)); |
299 | selector.traverseNodes(Collections.singleton(b_B_b)); |
300 | |
301 | assertEquals("nodes in selection", 2, selector.getCopiedNodes().size()); |
302 | assertTrue("a in selection", selector.getCopiedNodes().contains(a)); |
303 | assertTrue("a.A in selection", selector.getCopiedNodes().contains(a_A)); |
304 | |
305 | assertEquals("b.B.b's inbounds", 2, localFactory.createFeature("b.B.b").getInboundDependencies().size()); |
306 | } |
307 | |
308 | public void testReset() { |
309 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
310 | selector.traverseNodes(Collections.singleton(b_B_b)); |
311 | |
312 | assertEquals("nodes in selection", 1, selector.getSelectedNodes().size()); |
313 | assertEquals("copied nodes", 1, selector.getCopiedNodes().size()); |
314 | |
315 | selector.reset(); |
316 | |
317 | assertEquals("nodes in selection", 0, selector.getSelectedNodes().size()); |
318 | assertEquals("copied nodes", 0, selector.getCopiedNodes().size()); |
319 | } |
320 | |
321 | public void testVisitInferredPackage() { |
322 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
323 | selector.traverseNodes(Collections.singleton(b)); |
324 | |
325 | assertEquals("package.isConfirmed()", b.isConfirmed(), localFactory.getPackages().get(b.getName()).isConfirmed()); |
326 | } |
327 | |
328 | public void testVisitConfirmedPackage() { |
329 | b.setConfirmed(true); |
330 | |
331 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
332 | selector.traverseNodes(Collections.singleton(b)); |
333 | |
334 | assertEquals("package.isConfirmed()", b.isConfirmed(), localFactory.getPackages().get(b.getName()).isConfirmed()); |
335 | } |
336 | |
337 | public void testFollowToInferredPackage() { |
338 | a.addDependency(b); |
339 | |
340 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
341 | selector.traverseNodes(Collections.singleton(b)); |
342 | |
343 | assertEquals("package.isConfirmed()", a.isConfirmed(), localFactory.getPackages().get(a.getName()).isConfirmed()); |
344 | } |
345 | |
346 | public void testFollowToConfirmedPackage() { |
347 | a.addDependency(b); |
348 | a.setConfirmed(true); |
349 | |
350 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
351 | selector.traverseNodes(Collections.singleton(b)); |
352 | |
353 | assertEquals("package.isConfirmed()", a.isConfirmed(), localFactory.getPackages().get(a.getName()).isConfirmed()); |
354 | } |
355 | |
356 | public void testVisitInferredClass() { |
357 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
358 | selector.traverseNodes(Collections.singleton(b_B)); |
359 | |
360 | assertEquals("class.isConfirmed()", b_B.isConfirmed(), localFactory.getClasses().get(b_B.getName()).isConfirmed()); |
361 | } |
362 | |
363 | public void testVisitConfirmedClass() { |
364 | b_B.setConfirmed(true); |
365 | |
366 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
367 | selector.traverseNodes(Collections.singleton(b_B)); |
368 | |
369 | assertEquals("class.isConfirmed()", b_B.isConfirmed(), localFactory.getClasses().get(b_B.getName()).isConfirmed()); |
370 | } |
371 | |
372 | public void testFollowToInferredClass() { |
373 | a_A.addDependency(b_B); |
374 | |
375 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
376 | selector.traverseNodes(Collections.singleton(b_B)); |
377 | |
378 | assertEquals("class.isConfirmed()", a_A.isConfirmed(), localFactory.getClasses().get(a_A.getName()).isConfirmed()); |
379 | } |
380 | |
381 | public void testFollowToConfirmedClass() { |
382 | a_A.addDependency(b_B); |
383 | a_A.setConfirmed(true); |
384 | |
385 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
386 | selector.traverseNodes(Collections.singleton(b_B)); |
387 | |
388 | assertEquals("class.isConfirmed()", a_A.isConfirmed(), localFactory.getClasses().get(a_A.getName()).isConfirmed()); |
389 | } |
390 | |
391 | public void testVisitInferredFeature() { |
392 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
393 | selector.traverseNodes(Collections.singleton(b_B_b)); |
394 | |
395 | assertEquals("feature.isConfirmed()", b_B_b.isConfirmed(), localFactory.getFeatures().get(b_B_b.getName()).isConfirmed()); |
396 | } |
397 | |
398 | public void testVisitConfirmedFeature() { |
399 | b_B_b.setConfirmed(true); |
400 | |
401 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
402 | selector.traverseNodes(Collections.singleton(b_B_b)); |
403 | |
404 | assertEquals("feature.isConfirmed()", b_B_b.isConfirmed(), localFactory.getFeatures().get(b_B_b.getName()).isConfirmed()); |
405 | } |
406 | |
407 | public void testFollowToInferredFeature() { |
408 | a_A_a.addDependency(b_B_b); |
409 | |
410 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
411 | selector.traverseNodes(Collections.singleton(b_B_b)); |
412 | |
413 | assertEquals("feature.isConfirmed()", a_A_a.isConfirmed(), localFactory.getFeatures().get(a_A_a.getName()).isConfirmed()); |
414 | } |
415 | |
416 | public void testFollowToConfirmedFeature() { |
417 | a_A_a.addDependency(b_B_b); |
418 | a_A_a.setConfirmed(true); |
419 | |
420 | ClosureInboundSelector selector = new ClosureInboundSelector(localFactory, Collections.<Node>emptySet()); |
421 | selector.traverseNodes(Collections.singleton(b_B_b)); |
422 | |
423 | assertEquals("feature.isConfirmed()", a_A_a.isConfirmed(), localFactory.getFeatures().get(a_A_a.getName()).isConfirmed()); |
424 | } |
425 | } |