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 try (TreeWalk tw = new TreeWalk(db)) {
64 assertFalse(tw.isPostOrderTraversal());
65 }
66 }
67
68 @Test
69 public void testInitialize_TogglePostOrder() throws Exception {
70 try (TreeWalk tw = new TreeWalk(db)) {
71 assertFalse(tw.isPostOrderTraversal());
72 tw.setPostOrderTraversal(true);
73 assertTrue(tw.isPostOrderTraversal());
74 tw.setPostOrderTraversal(false);
75 assertFalse(tw.isPostOrderTraversal());
76 }
77 }
78
79 @Test
80 public void testResetDoesNotAffectPostOrder() throws Exception {
81 try (TreeWalk tw = new TreeWalk(db)) {
82 tw.setPostOrderTraversal(true);
83 assertTrue(tw.isPostOrderTraversal());
84 tw.reset();
85 assertTrue(tw.isPostOrderTraversal());
86
87 tw.setPostOrderTraversal(false);
88 assertFalse(tw.isPostOrderTraversal());
89 tw.reset();
90 assertFalse(tw.isPostOrderTraversal());
91 }
92 }
93
94 @Test
95 public void testNoPostOrder() throws Exception {
96 final DirCache tree = db.readDirCache();
97 final DirCacheBuilder b = tree.builder();
98
99 b.add(makeFile("a"));
100 b.add(makeFile("b/c"));
101 b.add(makeFile("b/d"));
102 b.add(makeFile("q"));
103
104 b.finish();
105 assertEquals(4, tree.getEntryCount());
106
107 try (TreeWalk tw = new TreeWalk(db)) {
108 tw.setPostOrderTraversal(false);
109 tw.addTree(new DirCacheIterator(tree));
110
111 assertModes("a", REGULAR_FILE, tw);
112 assertModes("b", TREE, tw);
113 assertTrue(tw.isSubtree());
114 assertFalse(tw.isPostChildren());
115 tw.enterSubtree();
116 assertModes("b/c", REGULAR_FILE, tw);
117 assertModes("b/d", REGULAR_FILE, tw);
118 assertModes("q", REGULAR_FILE, tw);
119 }
120 }
121
122 @Test
123 public void testWithPostOrder_EnterSubtree() throws Exception {
124 final DirCache tree = db.readDirCache();
125 final DirCacheBuilder b = tree.builder();
126
127 b.add(makeFile("a"));
128 b.add(makeFile("b/c"));
129 b.add(makeFile("b/d"));
130 b.add(makeFile("q"));
131
132 b.finish();
133 assertEquals(4, tree.getEntryCount());
134
135 try (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
156 @Test
157 public void testWithPostOrder_NoEnterSubtree() throws Exception {
158 final DirCache tree = db.readDirCache();
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 try (TreeWalk tw = new TreeWalk(db)) {
170 tw.setPostOrderTraversal(true);
171 tw.addTree(new DirCacheIterator(tree));
172
173 assertModes("a", REGULAR_FILE, tw);
174
175 assertModes("b", TREE, tw);
176 assertTrue(tw.isSubtree());
177 assertFalse(tw.isPostChildren());
178
179 assertModes("q", REGULAR_FILE, tw);
180 }
181 }
182
183 private DirCacheEntry makeFile(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 }