2 * Copyright (C) 2008, Google Inc.
6 * Redistribution and use in source and binary forms, with or
7 * without modification, are permitted provided that the following
10 * - Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * - Redistributions in binary form must reproduce the above
14 * copyright notice, this list of conditions and the following
15 * disclaimer in the documentation and/or other materials provided
16 * with the distribution.
18 * - Neither the name of the Git Development Community nor the
19 * names of its contributors may be used to endorse or promote
20 * products derived from this software without specific prior
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
24 * CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES,
25 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
26 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
27 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
28 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
29 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
30 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
31 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
32 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
33 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
35 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 package org
.spearce
.jgit
.patch
;
39 import junit
.framework
.TestCase
;
41 import org
.spearce
.jgit
.lib
.Constants
;
42 import org
.spearce
.jgit
.lib
.FileMode
;
43 import org
.spearce
.jgit
.lib
.ObjectId
;
45 public class FileHeaderTest
extends TestCase
{
46 public void testParseGitFileName_Empty() {
47 final FileHeader fh
= data("");
48 assertEquals(-1, fh
.parseGitFileName(0, fh
.buf
.length
));
49 assertNotNull(fh
.getHunks());
50 assertTrue(fh
.getHunks().isEmpty());
51 assertFalse(fh
.hasMetaDataChanges());
54 public void testParseGitFileName_NoLF() {
55 final FileHeader fh
= data("a/ b/");
56 assertEquals(-1, fh
.parseGitFileName(0, fh
.buf
.length
));
59 public void testParseGitFileName_NoSecondLine() {
60 final FileHeader fh
= data("\n");
61 assertEquals(-1, fh
.parseGitFileName(0, fh
.buf
.length
));
64 public void testParseGitFileName_EmptyHeader() {
65 final FileHeader fh
= data("\n\n");
66 assertEquals(1, fh
.parseGitFileName(0, fh
.buf
.length
));
69 public void testParseGitFileName_Foo() {
70 final String name
= "foo";
71 final FileHeader fh
= header(name
);
72 assertEquals(gitLine(name
).length(), fh
.parseGitFileName(0,
74 assertEquals(name
, fh
.getOldName());
75 assertSame(fh
.getOldName(), fh
.getNewName());
76 assertFalse(fh
.hasMetaDataChanges());
79 public void testParseGitFileName_FailFooBar() {
80 final FileHeader fh
= data("a/foo b/bar\n-");
81 assertTrue(fh
.parseGitFileName(0, fh
.buf
.length
) > 0);
82 assertNull(fh
.getOldName());
83 assertNull(fh
.getNewName());
84 assertFalse(fh
.hasMetaDataChanges());
87 public void testParseGitFileName_FooSpBar() {
88 final String name
= "foo bar";
89 final FileHeader fh
= header(name
);
90 assertEquals(gitLine(name
).length(), fh
.parseGitFileName(0,
92 assertEquals(name
, fh
.getOldName());
93 assertSame(fh
.getOldName(), fh
.getNewName());
94 assertFalse(fh
.hasMetaDataChanges());
97 public void testParseGitFileName_DqFooTabBar() {
98 final String name
= "foo\tbar";
99 final String dqName
= "foo\\tbar";
100 final FileHeader fh
= dqHeader(dqName
);
101 assertEquals(dqGitLine(dqName
).length(), fh
.parseGitFileName(0,
103 assertEquals(name
, fh
.getOldName());
104 assertSame(fh
.getOldName(), fh
.getNewName());
105 assertFalse(fh
.hasMetaDataChanges());
108 public void testParseGitFileName_DqFooSpLfNulBar() {
109 final String name
= "foo \n\0bar";
110 final String dqName
= "foo \\n\\0bar";
111 final FileHeader fh
= dqHeader(dqName
);
112 assertEquals(dqGitLine(dqName
).length(), fh
.parseGitFileName(0,
114 assertEquals(name
, fh
.getOldName());
115 assertSame(fh
.getOldName(), fh
.getNewName());
116 assertFalse(fh
.hasMetaDataChanges());
119 public void testParseGitFileName_SrcFooC() {
120 final String name
= "src/foo/bar/argh/code.c";
121 final FileHeader fh
= header(name
);
122 assertEquals(gitLine(name
).length(), fh
.parseGitFileName(0,
124 assertEquals(name
, fh
.getOldName());
125 assertSame(fh
.getOldName(), fh
.getNewName());
126 assertFalse(fh
.hasMetaDataChanges());
129 public void testParseGitFileName_SrcFooCNonStandardPrefix() {
130 final String name
= "src/foo/bar/argh/code.c";
131 final String header
= "project-v-1.0/" + name
+ " mydev/" + name
+ "\n";
132 final FileHeader fh
= data(header
+ "-");
133 assertEquals(header
.length(), fh
.parseGitFileName(0, fh
.buf
.length
));
134 assertEquals(name
, fh
.getOldName());
135 assertSame(fh
.getOldName(), fh
.getNewName());
136 assertFalse(fh
.hasMetaDataChanges());
139 public void testParseUnicodeName_NewFile() {
140 final FileHeader fh
= data("diff --git \"a/\\303\\205ngstr\\303\\266m\" \"b/\\303\\205ngstr\\303\\266m\"\n"
141 + "new file mode 100644\n"
142 + "index 0000000..7898192\n"
144 + "+++ \"b/\\303\\205ngstr\\303\\266m\"\n"
145 + "@@ -0,0 +1 @@\n" + "+a\n");
148 assertEquals("/dev/null", fh
.getOldName());
149 assertSame(FileHeader
.DEV_NULL
, fh
.getOldName());
150 assertEquals("\u00c5ngstr\u00f6m", fh
.getNewName());
152 assertSame(FileHeader
.ChangeType
.ADD
, fh
.getChangeType());
153 assertSame(FileHeader
.PatchType
.UNIFIED
, fh
.getPatchType());
154 assertTrue(fh
.hasMetaDataChanges());
156 assertSame(FileMode
.MISSING
, fh
.getOldMode());
157 assertSame(FileMode
.REGULAR_FILE
, fh
.getNewMode());
159 assertEquals("0000000", fh
.getOldId().name());
160 assertEquals("7898192", fh
.getNewId().name());
161 assertEquals(0, fh
.getScore());
164 public void testParseUnicodeName_DeleteFile() {
165 final FileHeader fh
= data("diff --git \"a/\\303\\205ngstr\\303\\266m\" \"b/\\303\\205ngstr\\303\\266m\"\n"
166 + "deleted file mode 100644\n"
167 + "index 7898192..0000000\n"
168 + "--- \"a/\\303\\205ngstr\\303\\266m\"\n"
170 + "@@ -1 +0,0 @@\n" + "-a\n");
173 assertEquals("\u00c5ngstr\u00f6m", fh
.getOldName());
174 assertEquals("/dev/null", fh
.getNewName());
175 assertSame(FileHeader
.DEV_NULL
, fh
.getNewName());
177 assertSame(FileHeader
.ChangeType
.DELETE
, fh
.getChangeType());
178 assertSame(FileHeader
.PatchType
.UNIFIED
, fh
.getPatchType());
179 assertTrue(fh
.hasMetaDataChanges());
181 assertSame(FileMode
.REGULAR_FILE
, fh
.getOldMode());
182 assertSame(FileMode
.MISSING
, fh
.getNewMode());
184 assertEquals("7898192", fh
.getOldId().name());
185 assertEquals("0000000", fh
.getNewId().name());
186 assertEquals(0, fh
.getScore());
189 public void testParseModeChange() {
190 final FileHeader fh
= data("diff --git a/a b b/a b\n"
191 + "old mode 100644\n" + "new mode 100755\n");
193 assertEquals("a b", fh
.getOldName());
194 assertEquals("a b", fh
.getNewName());
196 assertSame(FileHeader
.ChangeType
.MODIFY
, fh
.getChangeType());
197 assertSame(FileHeader
.PatchType
.UNIFIED
, fh
.getPatchType());
198 assertTrue(fh
.hasMetaDataChanges());
200 assertNull(fh
.getOldId());
201 assertNull(fh
.getNewId());
203 assertSame(FileMode
.REGULAR_FILE
, fh
.getOldMode());
204 assertSame(FileMode
.EXECUTABLE_FILE
, fh
.getNewMode());
205 assertEquals(0, fh
.getScore());
208 public void testParseRename100_NewStyle() {
209 final FileHeader fh
= data("diff --git a/a b/ c/\\303\\205ngstr\\303\\266m\n"
210 + "similarity index 100%\n"
212 + "rename to \" c/\\303\\205ngstr\\303\\266m\"\n");
213 int ptr
= fh
.parseGitFileName(0, fh
.buf
.length
);
215 assertNull(fh
.getOldName()); // can't parse names on a rename
216 assertNull(fh
.getNewName());
218 ptr
= fh
.parseGitHeaders(ptr
, fh
.buf
.length
);
221 assertEquals("a", fh
.getOldName());
222 assertEquals(" c/\u00c5ngstr\u00f6m", fh
.getNewName());
224 assertSame(FileHeader
.ChangeType
.RENAME
, fh
.getChangeType());
225 assertSame(FileHeader
.PatchType
.UNIFIED
, fh
.getPatchType());
226 assertTrue(fh
.hasMetaDataChanges());
228 assertNull(fh
.getOldId());
229 assertNull(fh
.getNewId());
231 assertNull(fh
.getOldMode());
232 assertNull(fh
.getNewMode());
234 assertEquals(100, fh
.getScore());
237 public void testParseRename100_OldStyle() {
238 final FileHeader fh
= data("diff --git a/a b/ c/\\303\\205ngstr\\303\\266m\n"
239 + "similarity index 100%\n"
241 + "rename new \" c/\\303\\205ngstr\\303\\266m\"\n");
242 int ptr
= fh
.parseGitFileName(0, fh
.buf
.length
);
244 assertNull(fh
.getOldName()); // can't parse names on a rename
245 assertNull(fh
.getNewName());
247 ptr
= fh
.parseGitHeaders(ptr
, fh
.buf
.length
);
250 assertEquals("a", fh
.getOldName());
251 assertEquals(" c/\u00c5ngstr\u00f6m", fh
.getNewName());
253 assertSame(FileHeader
.ChangeType
.RENAME
, fh
.getChangeType());
254 assertSame(FileHeader
.PatchType
.UNIFIED
, fh
.getPatchType());
255 assertTrue(fh
.hasMetaDataChanges());
257 assertNull(fh
.getOldId());
258 assertNull(fh
.getNewId());
260 assertNull(fh
.getOldMode());
261 assertNull(fh
.getNewMode());
263 assertEquals(100, fh
.getScore());
266 public void testParseCopy100() {
267 final FileHeader fh
= data("diff --git a/a b/ c/\\303\\205ngstr\\303\\266m\n"
268 + "similarity index 100%\n"
270 + "copy to \" c/\\303\\205ngstr\\303\\266m\"\n");
271 int ptr
= fh
.parseGitFileName(0, fh
.buf
.length
);
273 assertNull(fh
.getOldName()); // can't parse names on a copy
274 assertNull(fh
.getNewName());
276 ptr
= fh
.parseGitHeaders(ptr
, fh
.buf
.length
);
279 assertEquals("a", fh
.getOldName());
280 assertEquals(" c/\u00c5ngstr\u00f6m", fh
.getNewName());
282 assertSame(FileHeader
.ChangeType
.COPY
, fh
.getChangeType());
283 assertSame(FileHeader
.PatchType
.UNIFIED
, fh
.getPatchType());
284 assertTrue(fh
.hasMetaDataChanges());
286 assertNull(fh
.getOldId());
287 assertNull(fh
.getNewId());
289 assertNull(fh
.getOldMode());
290 assertNull(fh
.getNewMode());
292 assertEquals(100, fh
.getScore());
295 public void testParseFullIndexLine_WithMode() {
296 final String oid
= "78981922613b2afb6025042ff6bd878ac1994e85";
297 final String nid
= "61780798228d17af2d34fce4cfbdf35556832472";
298 final FileHeader fh
= data("diff --git a/a b/a\n" + "index " + oid
299 + ".." + nid
+ " 100644\n" + "--- a/a\n" + "+++ b/a\n");
302 assertEquals("a", fh
.getOldName());
303 assertEquals("a", fh
.getNewName());
305 assertSame(FileMode
.REGULAR_FILE
, fh
.getOldMode());
306 assertSame(FileMode
.REGULAR_FILE
, fh
.getNewMode());
307 assertFalse(fh
.hasMetaDataChanges());
309 assertNotNull(fh
.getOldId());
310 assertNotNull(fh
.getNewId());
312 assertTrue(fh
.getOldId().isComplete());
313 assertTrue(fh
.getNewId().isComplete());
315 assertEquals(ObjectId
.fromString(oid
), fh
.getOldId().toObjectId());
316 assertEquals(ObjectId
.fromString(nid
), fh
.getNewId().toObjectId());
319 public void testParseFullIndexLine_NoMode() {
320 final String oid
= "78981922613b2afb6025042ff6bd878ac1994e85";
321 final String nid
= "61780798228d17af2d34fce4cfbdf35556832472";
322 final FileHeader fh
= data("diff --git a/a b/a\n" + "index " + oid
323 + ".." + nid
+ "\n" + "--- a/a\n" + "+++ b/a\n");
326 assertEquals("a", fh
.getOldName());
327 assertEquals("a", fh
.getNewName());
328 assertFalse(fh
.hasMetaDataChanges());
330 assertNull(fh
.getOldMode());
331 assertNull(fh
.getNewMode());
333 assertNotNull(fh
.getOldId());
334 assertNotNull(fh
.getNewId());
336 assertTrue(fh
.getOldId().isComplete());
337 assertTrue(fh
.getNewId().isComplete());
339 assertEquals(ObjectId
.fromString(oid
), fh
.getOldId().toObjectId());
340 assertEquals(ObjectId
.fromString(nid
), fh
.getNewId().toObjectId());
343 public void testParseAbbrIndexLine_WithMode() {
345 final String oid
= "78981922613b2afb6025042ff6bd878ac1994e85";
346 final String nid
= "61780798228d17af2d34fce4cfbdf35556832472";
347 final FileHeader fh
= data("diff --git a/a b/a\n" + "index "
348 + oid
.substring(0, a
- 1) + ".." + nid
.substring(0, a
- 1)
349 + " 100644\n" + "--- a/a\n" + "+++ b/a\n");
352 assertEquals("a", fh
.getOldName());
353 assertEquals("a", fh
.getNewName());
355 assertSame(FileMode
.REGULAR_FILE
, fh
.getOldMode());
356 assertSame(FileMode
.REGULAR_FILE
, fh
.getNewMode());
357 assertFalse(fh
.hasMetaDataChanges());
359 assertNotNull(fh
.getOldId());
360 assertNotNull(fh
.getNewId());
362 assertFalse(fh
.getOldId().isComplete());
363 assertFalse(fh
.getNewId().isComplete());
365 assertEquals(oid
.substring(0, a
- 1), fh
.getOldId().name());
366 assertEquals(nid
.substring(0, a
- 1), fh
.getNewId().name());
368 assertTrue(ObjectId
.fromString(oid
).startsWith(fh
.getOldId()));
369 assertTrue(ObjectId
.fromString(nid
).startsWith(fh
.getNewId()));
372 public void testParseAbbrIndexLine_NoMode() {
374 final String oid
= "78981922613b2afb6025042ff6bd878ac1994e85";
375 final String nid
= "61780798228d17af2d34fce4cfbdf35556832472";
376 final FileHeader fh
= data("diff --git a/a b/a\n" + "index "
377 + oid
.substring(0, a
- 1) + ".." + nid
.substring(0, a
- 1)
378 + "\n" + "--- a/a\n" + "+++ b/a\n");
381 assertEquals("a", fh
.getOldName());
382 assertEquals("a", fh
.getNewName());
384 assertNull(fh
.getOldMode());
385 assertNull(fh
.getNewMode());
386 assertFalse(fh
.hasMetaDataChanges());
388 assertNotNull(fh
.getOldId());
389 assertNotNull(fh
.getNewId());
391 assertFalse(fh
.getOldId().isComplete());
392 assertFalse(fh
.getNewId().isComplete());
394 assertEquals(oid
.substring(0, a
- 1), fh
.getOldId().name());
395 assertEquals(nid
.substring(0, a
- 1), fh
.getNewId().name());
397 assertTrue(ObjectId
.fromString(oid
).startsWith(fh
.getOldId()));
398 assertTrue(ObjectId
.fromString(nid
).startsWith(fh
.getNewId()));
401 private static void assertParse(final FileHeader fh
) {
402 int ptr
= fh
.parseGitFileName(0, fh
.buf
.length
);
404 ptr
= fh
.parseGitHeaders(ptr
, fh
.buf
.length
);
408 private static FileHeader
data(final String in
) {
409 return new FileHeader(Constants
.encodeASCII(in
), 0);
412 private static FileHeader
header(final String path
) {
413 return data(gitLine(path
) + "--- " + path
+ "\n");
416 private static String
gitLine(final String path
) {
417 return "a/" + path
+ " b/" + path
+ "\n";
420 private static FileHeader
dqHeader(final String path
) {
421 return data(dqGitLine(path
) + "--- " + path
+ "\n");
424 private static String
dqGitLine(final String path
) {
425 return "\"a/" + path
+ "\" \"b/" + path
+ "\"\n";