diff --git a/src/main/java/io/reflectoring/diffparser/unified/ParserState.java b/src/main/java/io/reflectoring/diffparser/unified/ParserState.java index b695ecb..ea21ce3 100644 --- a/src/main/java/io/reflectoring/diffparser/unified/ParserState.java +++ b/src/main/java/io/reflectoring/diffparser/unified/ParserState.java @@ -252,8 +252,9 @@ protected boolean matchesFromLinePattern(String line) { protected boolean matchesToLinePattern(String line) { return line.startsWith("+"); } - - protected boolean matchesHunkStartPattern(String line) { + + protected boolean matchesHunkStartPattern(String line) + { return LINE_RANGE_PATTERN.matcher(line).matches(); } @@ -279,6 +280,9 @@ protected boolean matchesEndPattern(String line, ParseWindow window) { // We reached the end of the stream. return true; } else { + if(line.trim().toLowerCase().startsWith("index")){ + return true; + } // some diff tools like "svn diff" do not put an empty line between two diffs // we add that empty line and call the method again String nextFromFileLine = window.getFutureLine(3); diff --git a/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java b/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java index 67f5ab9..6530904 100644 --- a/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java +++ b/src/test/java/io/reflectoring/diffparser/unified/SvnDiffTest.java @@ -1,61 +1,100 @@ package io.reflectoring.diffparser.unified; +import java.io.InputStream; +import java.util.List; + +import org.testng.annotations.Test; + import io.reflectoring.diffparser.api.DiffParser; import io.reflectoring.diffparser.api.UnifiedDiffParser; -import junit.framework.Assert; -import org.testng.annotations.Test; import io.reflectoring.diffparser.api.model.Diff; import io.reflectoring.diffparser.api.model.Hunk; import io.reflectoring.diffparser.api.model.Line; - -import java.io.InputStream; -import java.util.List; +import junit.framework.Assert; /** * Tests the DiffParser with a diff created by the "svn diff" command. */ -public class SvnDiffTest { - - @Test - public void testParse() throws Exception { - // given - DiffParser parser = new UnifiedDiffParser(); - InputStream in = getClass().getResourceAsStream("svn.diff"); - - // when - List diffs = parser.parse(in); - - // then - Assert.assertNotNull(diffs); - Assert.assertEquals(2, diffs.size()); - - Diff diff1 = diffs.get(0); - Assert.assertEquals("UnifiedDiffParser.java", diff1.getFromFileName()); - Assert.assertEquals("UnifiedDiffParser.java", diff1.getToFileName()); - Assert.assertEquals(1, diff1.getHunks().size()); - - List headerLines = diff1.getHeaderLines(); - Assert.assertEquals(2, headerLines.size()); - - Hunk hunk1 = diff1.getHunks().get(0); - Assert.assertEquals(73, hunk1.getFromFileRange().getLineStart()); - Assert.assertEquals(13, hunk1.getFromFileRange().getLineCount()); - Assert.assertEquals(73, hunk1.getToFileRange().getLineStart()); - Assert.assertEquals(13, hunk1.getToFileRange().getLineCount()); - - List lines = hunk1.getLines(); - Assert.assertEquals(16, lines.size()); - Assert.assertEquals(Line.LineType.TO, lines.get(3).getLineType()); - Assert.assertEquals(Line.LineType.FROM, lines.get(7).getLineType()); - Assert.assertEquals(Line.LineType.TO, lines.get(8).getLineType()); - - } - - @Test - public void testParse_WhenHunkRangeLineCountNotSpecified_ShouldSetHunkRangeLineCountToOne() throws Exception { - // given - DiffParser parser = new UnifiedDiffParser(); - String in = "" +public class SvnDiffTest +{ + + @Test + public void testParse() throws Exception + { + // given + DiffParser parser = new UnifiedDiffParser(); + InputStream in = getClass().getResourceAsStream("svn.diff"); + + // when + List diffs = parser.parse(in); + + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(2, diffs.size()); + + Diff diff1 = diffs.get(0); + Assert.assertEquals("UnifiedDiffParser.java", diff1.getFromFileName()); + Assert.assertEquals("UnifiedDiffParser.java", diff1.getToFileName()); + Assert.assertEquals(1, diff1.getHunks().size()); + + List headerLines = diff1.getHeaderLines(); + Assert.assertEquals(2, headerLines.size()); + + Hunk hunk1 = diff1.getHunks().get(0); + Assert.assertEquals(73, hunk1.getFromFileRange().getLineStart()); + Assert.assertEquals(13, hunk1.getFromFileRange().getLineCount()); + Assert.assertEquals(73, hunk1.getToFileRange().getLineStart()); + Assert.assertEquals(13, hunk1.getToFileRange().getLineCount()); + + List lines = hunk1.getLines(); + Assert.assertEquals(16, lines.size()); + Assert.assertEquals(Line.LineType.TO, lines.get(3).getLineType()); + Assert.assertEquals(Line.LineType.FROM, lines.get(7).getLineType()); + Assert.assertEquals(Line.LineType.TO, lines.get(8).getLineType()); + + // given + in = getClass().getResourceAsStream("svn2.diff"); + + // when + diffs = parser.parse(in); + + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(2, diffs.size()); + + diff1 = diffs.get(0); + Assert.assertEquals("MyClass1.java", diff1.getFromFileName()); + Assert.assertEquals("MyClass1.java", diff1.getToFileName()); + Assert.assertEquals(1, diff1.getHunks().size()); + + headerLines = diff1.getHeaderLines(); + Assert.assertEquals(2, headerLines.size()); + + hunk1 = diff1.getHunks().get(0); + Assert.assertEquals(0, hunk1.getFromFileRange().getLineStart()); + Assert.assertEquals(0, hunk1.getFromFileRange().getLineCount()); + Assert.assertEquals(1, hunk1.getToFileRange().getLineStart()); + Assert.assertEquals(30, hunk1.getToFileRange().getLineCount()); + + Diff diff2 = diffs.get(1); + Assert.assertEquals("MyClass2.java", diff2.getFromFileName()); + Assert.assertEquals("MyClass2.java", diff2.getToFileName()); + Assert.assertEquals(1, diff2.getHunks().size()); + + hunk1 = diff2.getHunks().get(0); + lines = hunk1.getLines(); + Assert.assertEquals(30, lines.size()); + Assert.assertEquals(Line.LineType.TO, lines.get(3).getLineType()); + Assert.assertEquals(Line.LineType.TO, lines.get(7).getLineType()); + Assert.assertEquals(Line.LineType.TO, lines.get(8).getLineType()); + } + + @Test + public void testParse_WhenHunkRangeLineCountNotSpecified_ShouldSetHunkRangeLineCountToOne() throws Exception + { + // given + DiffParser parser = new UnifiedDiffParser(); + String in = "" + "--- from 2015-12-21 17:53:29.082877088 -0500\n" + "+++ to 2015-12-21 08:41:52.663714666 -0500\n" + "@@ -10 +10 @@\n" @@ -63,40 +102,41 @@ public void testParse_WhenHunkRangeLineCountNotSpecified_ShouldSetHunkRangeLineC + "+to\n" + "\n"; - // when - List diffs = parser.parse(in.getBytes()); + // when + List diffs = parser.parse(in.getBytes()); - // then - Assert.assertNotNull(diffs); - Assert.assertEquals(1, diffs.size()); + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(1, diffs.size()); - Diff diff1 = diffs.get(0); - Assert.assertEquals(1, diff1.getHunks().size()); + Diff diff1 = diffs.get(0); + Assert.assertEquals(1, diff1.getHunks().size()); - Hunk hunk1 = diff1.getHunks().get(0); - Assert.assertEquals(1, hunk1.getFromFileRange().getLineCount()); - Assert.assertEquals(1, hunk1.getToFileRange().getLineCount()); - } + Hunk hunk1 = diff1.getHunks().get(0); + Assert.assertEquals(1, hunk1.getFromFileRange().getLineCount()); + Assert.assertEquals(1, hunk1.getToFileRange().getLineCount()); + } - @Test - public void testParse_WhenInputDoesNotEndWithEmptyLine_ShouldTransitionToEndState() throws Exception { - // given - DiffParser parser = new UnifiedDiffParser(); - String in = "" + @Test + public void testParse_WhenInputDoesNotEndWithEmptyLine_ShouldTransitionToEndState() throws Exception + { + // given + DiffParser parser = new UnifiedDiffParser(); + String in = "" + "--- from 2015-12-21 17:53:29.082877088 -0500\n" + "+++ to 2015-12-21 08:41:52.663714666 -0500\n" + "@@ -10,1 +10,1 @@\n" + "-from\n" + "+to\n"; - // when - List diffs = parser.parse(in.getBytes()); + // when + List diffs = parser.parse(in.getBytes()); - // then - Assert.assertNotNull(diffs); - Assert.assertEquals(1, diffs.size()); + // then + Assert.assertNotNull(diffs); + Assert.assertEquals(1, diffs.size()); - Diff diff1 = diffs.get(0); - Assert.assertEquals(1, diff1.getHunks().size()); - } + Diff diff1 = diffs.get(0); + Assert.assertEquals(1, diff1.getHunks().size()); + } } diff --git a/src/test/resources/io/reflectoring/diffparser/unified/svn2.diff b/src/test/resources/io/reflectoring/diffparser/unified/svn2.diff new file mode 100644 index 0000000..8646069 --- /dev/null +++ b/src/test/resources/io/reflectoring/diffparser/unified/svn2.diff @@ -0,0 +1,70 @@ +Index: MyClass1.java +=================================================================== +--- MyClass1.java (nonexistent) ++++ MyClass1.java (working copy) +@@ -0,0 +1,30 @@ ++/* ++ * Copyright 2018 XXX ++ * All Rights Reserved ++ */ ++ ++package com.xxx; ++ ++/** ++ * ++ */ ++public class MyClass1 ++{ ++ @Override ++ public boolean equals(Object obj) ++ { ++ return super.equals(obj); ++ } ++ ++ @Override ++ public int hashCode() ++ { ++ return super.hashCode(); ++ } ++ ++ @Override ++ public String toString() ++ { ++ return super.toString(); ++ } ++} +Index: MyClass2.java +=================================================================== +--- MyClass2.java (nonexistent) ++++ MyClass2.java (working copy) +@@ -0,0 +1,30 @@ ++/* ++ * Copyright 2018 xxx ++ * All Rights Reserved ++ */ ++ ++package com.xxx; ++ ++/** ++ * ++ */ ++public class MyClass2 ++{ ++ @Override ++ public boolean equals(Object obj) ++ { ++ return super.equals(obj); ++ } ++ ++ @Override ++ public int hashCode() ++ { ++ return super.hashCode(); ++ } ++ ++ @Override ++ public String toString() ++ { ++ return super.toString(); ++ } ++} \ No newline at end of file