1   
2   
3   
4   
5   
6   
7   
8   
9   
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  package org.grouplens.grapht.graph;
21  
22  import com.google.common.collect.Lists;
23  import org.hamcrest.Matcher;
24  import org.junit.Before;
25  import org.junit.Test;
26  
27  import java.util.List;
28  
29  import static org.hamcrest.Matchers.*;
30  import static org.junit.Assert.assertThat;
31  
32  public class MergePoolTest {
33      MergePool<String,String> pool;
34  
35      @Before
36      public void createPool() {
37          pool = MergePool.create();
38      }
39  
40      @Test
41      public void testSingletonNode() {
42          DAGNode<String,String> node = DAGNode.singleton("foo");
43          DAGNode<String,String> merged = pool.merge(node);
44          
45          assertThat(merged, sameInstance(node));
46      }
47  
48      @Test
49      public void testReuseSingleton() {
50          DAGNode<String,String> node = DAGNode.singleton("foo");
51          DAGNode<String,String> node2 = DAGNode.singleton("foo");
52          
53          pool.merge(node);
54          
55          DAGNode<String,String> merged = pool.merge(node2);
56          
57          assertThat(merged, sameInstance(node));
58      }
59  
60      @Test
61      public void testMergeDescendants() {
62          DAGNode<String,String> node = DAGNode.singleton("foo");
63          DAGNode<String,String> node2 = DAGNode.singleton("foo");
64          DAGNode<String,String> root =
65                  DAGNode.<String,String>newBuilder("root")
66                         .addEdge(node, "hello")
67                         .addEdge(node2, "goodbye")
68                         .build();
69  
70          DAGNode<String,String> merged = pool.merge(root);
71  
72          
73          
74          assertThat(merged, not(sameInstance(root)));
75          
76          assertThat(merged.getReachableNodes(), hasSize(2));
77          
78          List<DAGEdge<String,String>> nbrs =
79                  Lists.newArrayList(merged.getOutgoingEdges());
80          
81          assertThat(nbrs.get(1).getTail(),
82                     sameInstance(nbrs.get(0).getTail()));
83          
84          assertThat(nbrs.get(0).getTail(),
85                     anyOf(sameInstance(node),
86                           sameInstance(node2)));
87  
88          
89          assertThat(pool.merge(DAGNode.<String, String>singleton("foo")),
90                     anyOf(sameInstance(node),
91                           sameInstance(node2)));
92  
93          
94          assertThat(pool.merge(root), sameInstance(merged));
95      }
96  
97      @Test
98      public void testMergeWithChildren() {
99          DAGNode<String,String> node = DAGNode.singleton("foo");
100         DAGNode<String,String> p1 =
101                 DAGNode.<String,String>newBuilder("child")
102                        .addEdge(node, "k1")
103                        .build();
104         DAGNode<String,String> node2 = DAGNode.singleton("foo");
105         
106         DAGNode<String,String> p2 =
107                 DAGNode.<String,String>newBuilder("child")
108                        .addEdge(node, "k2")
109                        .build();
110         DAGNode<String,String> root =
111                 DAGNode.<String,String>newBuilder("root")
112                        .addEdge(p1, "hello")
113                        .addEdge(p2, "fish")
114                        .build();
115 
116         DAGNode<String,String> merged = pool.merge(root);
117 
118         
119         
120         assertThat(merged, not(sameInstance(root)));
121         
122         assertThat(merged.getReachableNodes(), hasSize(3));
123         
124         assertThat(merged.getReachableNodes(),
125                    (Matcher) anyOf(hasItem(sameInstance(node)),
126                                    hasItem(sameInstance(node2))));
127         
128         List<DAGEdge<String,String>> nbrs =
129                 Lists.newArrayList(merged.getOutgoingEdges());
130         
131         assertThat(nbrs.get(1).getTail(),
132                    sameInstance(nbrs.get(0).getTail()));
133 
134         
135         assertThat(pool.merge(DAGNode.<String, String>singleton("foo")),
136                    anyOf(sameInstance(node),
137                          sameInstance(node2)));
138 
139         
140         assertThat(pool.merge(p2), isIn(merged.getReachableNodes()));
141         assertThat(pool.merge(p1), isIn(merged.getReachableNodes()));
142     }
143 }