1
2
3
4
5
6
7
8
9
10 package org.eclipse.jgit.api.blame;
11
12 import static org.junit.Assert.assertEquals;
13 import static org.junit.Assert.assertFalse;
14 import static org.junit.Assert.assertTrue;
15
16 import org.eclipse.jgit.api.Git;
17 import org.eclipse.jgit.blame.BlameGenerator;
18 import org.eclipse.jgit.blame.BlameResult;
19 import org.eclipse.jgit.junit.RepositoryTestCase;
20 import org.eclipse.jgit.lib.Constants;
21 import org.eclipse.jgit.revwalk.RevCommit;
22 import org.junit.Test;
23
24
25 public class BlameGeneratorTest extends RepositoryTestCase {
26 @Test
27 public void testBoundLineDelete() throws Exception {
28 try (Git git = new Git(db)) {
29 String[] content1 = new String[] { "first", "second" };
30 writeTrashFile("file.txt", join(content1));
31 git.add().addFilepattern("file.txt").call();
32 RevCommit c1 = git.commit().setMessage("create file").call();
33
34 String[] content2 = new String[] { "third", "first", "second" };
35 writeTrashFile("file.txt", join(content2));
36 git.add().addFilepattern("file.txt").call();
37 RevCommit c2 = git.commit().setMessage("create file").call();
38
39 try (BlameGenerator generator = new BlameGenerator(db, "file.txt")) {
40 generator.push(null, db.resolve(Constants.HEAD));
41 assertEquals(3, generator.getResultContents().size());
42
43 assertTrue(generator.next());
44 assertEquals(c2, generator.getSourceCommit());
45 assertEquals(1, generator.getRegionLength());
46 assertEquals(0, generator.getResultStart());
47 assertEquals(1, generator.getResultEnd());
48 assertEquals(0, generator.getSourceStart());
49 assertEquals(1, generator.getSourceEnd());
50 assertEquals("file.txt", generator.getSourcePath());
51
52 assertTrue(generator.next());
53 assertEquals(c1, generator.getSourceCommit());
54 assertEquals(2, generator.getRegionLength());
55 assertEquals(1, generator.getResultStart());
56 assertEquals(3, generator.getResultEnd());
57 assertEquals(0, generator.getSourceStart());
58 assertEquals(2, generator.getSourceEnd());
59 assertEquals("file.txt", generator.getSourcePath());
60
61 assertFalse(generator.next());
62 }
63 }
64 }
65
66 @Test
67 public void testRenamedBoundLineDelete() throws Exception {
68 try (Git git = new Git(db)) {
69 final String FILENAME_1 = "subdir/file1.txt";
70 final String FILENAME_2 = "subdir/file2.txt";
71
72 String[] content1 = new String[] { "first", "second" };
73 writeTrashFile(FILENAME_1, join(content1));
74 git.add().addFilepattern(FILENAME_1).call();
75 RevCommit c1 = git.commit().setMessage("create file1").call();
76
77
78 writeTrashFile(FILENAME_2, join(content1));
79 git.add().addFilepattern(FILENAME_2).call();
80 deleteTrashFile(FILENAME_1);
81 git.rm().addFilepattern(FILENAME_1).call();
82 git.commit().setMessage("rename file1.txt to file2.txt").call();
83
84
85 String[] content2 = new String[] { "third", "first", "second" };
86 writeTrashFile(FILENAME_2, join(content2));
87 git.add().addFilepattern(FILENAME_2).call();
88 RevCommit c2 = git.commit().setMessage("change file2").call();
89
90 try (BlameGenerator generator = new BlameGenerator(db, FILENAME_2)) {
91 generator.push(null, db.resolve(Constants.HEAD));
92 assertEquals(3, generator.getResultContents().size());
93
94 assertTrue(generator.next());
95 assertEquals(c2, generator.getSourceCommit());
96 assertEquals(1, generator.getRegionLength());
97 assertEquals(0, generator.getResultStart());
98 assertEquals(1, generator.getResultEnd());
99 assertEquals(0, generator.getSourceStart());
100 assertEquals(1, generator.getSourceEnd());
101 assertEquals(FILENAME_2, generator.getSourcePath());
102
103 assertTrue(generator.next());
104 assertEquals(c1, generator.getSourceCommit());
105 assertEquals(2, generator.getRegionLength());
106 assertEquals(1, generator.getResultStart());
107 assertEquals(3, generator.getResultEnd());
108 assertEquals(0, generator.getSourceStart());
109 assertEquals(2, generator.getSourceEnd());
110 assertEquals(FILENAME_1, generator.getSourcePath());
111
112 assertFalse(generator.next());
113 }
114
115
116 try (BlameGenerator generator = new BlameGenerator(db, FILENAME_2)) {
117 generator.push(null, db.resolve(Constants.HEAD));
118 BlameResult result = generator.computeBlameResult();
119
120 assertEquals(3, result.getResultContents().size());
121
122 assertEquals(c2, result.getSourceCommit(0));
123 assertEquals(FILENAME_2, result.getSourcePath(0));
124
125 assertEquals(c1, result.getSourceCommit(1));
126 assertEquals(FILENAME_1, result.getSourcePath(1));
127
128 assertEquals(c1, result.getSourceCommit(2));
129 assertEquals(FILENAME_1, result.getSourcePath(2));
130 }
131 }
132 }
133
134 @Test
135 public void testLinesAllDeletedShortenedWalk() throws Exception {
136 try (Git git = new Git(db)) {
137 String[] content1 = new String[] { "first", "second", "third" };
138
139 writeTrashFile("file.txt", join(content1));
140 git.add().addFilepattern("file.txt").call();
141 git.commit().setMessage("create file").call();
142
143 String[] content2 = new String[] { "" };
144
145 writeTrashFile("file.txt", join(content2));
146 git.add().addFilepattern("file.txt").call();
147 git.commit().setMessage("create file").call();
148
149 writeTrashFile("file.txt", join(content1));
150 git.add().addFilepattern("file.txt").call();
151 RevCommit c3 = git.commit().setMessage("create file").call();
152
153 try (BlameGenerator generator = new BlameGenerator(db, "file.txt")) {
154 generator.push(null, db.resolve(Constants.HEAD));
155 assertEquals(3, generator.getResultContents().size());
156
157 assertTrue(generator.next());
158 assertEquals(c3, generator.getSourceCommit());
159 assertEquals(0, generator.getResultStart());
160 assertEquals(3, generator.getResultEnd());
161
162 assertFalse(generator.next());
163 }
164 }
165 }
166
167 private static String join(String... lines) {
168 StringBuilder joined = new StringBuilder();
169 for (String line : lines)
170 joined.append(line).append('\n');
171 return joined.toString();
172 }
173 }