1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44 package org.eclipse.jgit.treewalk;
45
46 import static org.eclipse.jgit.lib.FileMode.REGULAR_FILE;
47 import static org.eclipse.jgit.lib.FileMode.TREE;
48 import static org.junit.Assert.assertEquals;
49 import static org.junit.Assert.assertFalse;
50 import static org.junit.Assert.assertTrue;
51
52 import org.eclipse.jgit.dircache.DirCache;
53 import org.eclipse.jgit.dircache.DirCacheBuilder;
54 import org.eclipse.jgit.dircache.DirCacheEntry;
55 import org.eclipse.jgit.dircache.DirCacheIterator;
56 import org.eclipse.jgit.junit.RepositoryTestCase;
57 import org.eclipse.jgit.lib.FileMode;
58 import org.junit.Test;
59
60 public class PostOrderTreeWalkTest extends RepositoryTestCase {
61 @Test
62 public void testInitialize_NoPostOrder() throws Exception {
63 final TreeWalk tw = new TreeWalk(db);
64 assertFalse(tw.isPostOrderTraversal());
65 }
66
67 @Test
68 public void testInitialize_TogglePostOrder() throws Exception {
69 final TreeWalk tw = new TreeWalk(db);
70 assertFalse(tw.isPostOrderTraversal());
71 tw.setPostOrderTraversal(true);
72 assertTrue(tw.isPostOrderTraversal());
73 tw.setPostOrderTraversal(false);
74 assertFalse(tw.isPostOrderTraversal());
75 }
76
77 @Test
78 public void testResetDoesNotAffectPostOrder() throws Exception {
79 final TreeWalk tw = new TreeWalk(db);
80 tw.setPostOrderTraversal(true);
81 assertTrue(tw.isPostOrderTraversal());
82 tw.reset();
83 assertTrue(tw.isPostOrderTraversal());
84
85 tw.setPostOrderTraversal(false);
86 assertFalse(tw.isPostOrderTraversal());
87 tw.reset();
88 assertFalse(tw.isPostOrderTraversal());
89 }
90
91 @Test
92 public void testNoPostOrder() throws Exception {
93 final DirCache tree = db.readDirCache();
94 {
95 final DirCacheBuilder b = tree.builder();
96
97 b.add(makeFile("a"));
98 b.add(makeFile("b/c"));
99 b.add(makeFile("b/d"));
100 b.add(makeFile("q"));
101
102 b.finish();
103 assertEquals(4, tree.getEntryCount());
104 }
105
106 final TreeWalk tw = new TreeWalk(db);
107 tw.setPostOrderTraversal(false);
108 tw.addTree(new DirCacheIterator(tree));
109
110 assertModes("a", REGULAR_FILE, tw);
111 assertModes("b", TREE, tw);
112 assertTrue(tw.isSubtree());
113 assertFalse(tw.isPostChildren());
114 tw.enterSubtree();
115 assertModes("b/c", REGULAR_FILE, tw);
116 assertModes("b/d", REGULAR_FILE, tw);
117 assertModes("q", REGULAR_FILE, tw);
118 }
119
120 @Test
121 public void testWithPostOrder_EnterSubtree() throws Exception {
122 final DirCache tree = db.readDirCache();
123 {
124 final DirCacheBuilder b = tree.builder();
125
126 b.add(makeFile("a"));
127 b.add(makeFile("b/c"));
128 b.add(makeFile("b/d"));
129 b.add(makeFile("q"));
130
131 b.finish();
132 assertEquals(4, tree.getEntryCount());
133 }
134
135 final TreeWalk tw = new TreeWalk(db);
136 tw.setPostOrderTraversal(true);
137 tw.addTree(new DirCacheIterator(tree));
138
139 assertModes("a", REGULAR_FILE, tw);
140
141 assertModes("b", TREE, tw);
142 assertTrue(tw.isSubtree());
143 assertFalse(tw.isPostChildren());
144 tw.enterSubtree();
145 assertModes("b/c", REGULAR_FILE, tw);
146 assertModes("b/d", REGULAR_FILE, tw);
147
148 assertModes("b", TREE, tw);
149 assertTrue(tw.isSubtree());
150 assertTrue(tw.isPostChildren());
151
152 assertModes("q", REGULAR_FILE, tw);
153 }
154
155 @Test
156 public void testWithPostOrder_NoEnterSubtree() throws Exception {
157 final DirCache tree = db.readDirCache();
158 {
159 final DirCacheBuilder b = tree.builder();
160
161 b.add(makeFile("a"));
162 b.add(makeFile("b/c"));
163 b.add(makeFile("b/d"));
164 b.add(makeFile("q"));
165
166 b.finish();
167 assertEquals(4, tree.getEntryCount());
168 }
169
170 final TreeWalk tw = new TreeWalk(db);
171 tw.setPostOrderTraversal(true);
172 tw.addTree(new DirCacheIterator(tree));
173
174 assertModes("a", REGULAR_FILE, tw);
175
176 assertModes("b", TREE, tw);
177 assertTrue(tw.isSubtree());
178 assertFalse(tw.isPostChildren());
179
180 assertModes("q", REGULAR_FILE, tw);
181 }
182
183 private DirCacheEntry makeFile(final String path) throws Exception {
184 return createEntry(path, REGULAR_FILE);
185 }
186
187 private static void assertModes(final String path, final FileMode mode0,
188 final TreeWalk tw) throws Exception {
189 assertTrue("has " + path, tw.next());
190 assertEquals(path, tw.getPathString());
191 assertEquals(mode0, tw.getFileMode(0));
192 }
193 }