diff test/org/tmatesoft/hg/test/TestBlame.java @ 543:1e95f48d9886

Report line index for insertion and deletion, test against 'hg diff' output
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Fri, 15 Feb 2013 15:52:03 +0100
parents a71a05ec11bc
children 7f5998a9619d
line wrap: on
line diff
--- a/test/org/tmatesoft/hg/test/TestBlame.java	Thu Feb 14 16:36:13 2013 +0100
+++ b/test/org/tmatesoft/hg/test/TestBlame.java	Fri Feb 15 15:52:03 2013 +0100
@@ -16,13 +16,19 @@
  */
 package org.tmatesoft.hg.test;
 
+import java.io.ByteArrayOutputStream;
+import java.io.PrintStream;
+import java.util.Arrays;
+import java.util.regex.Pattern;
+
+import org.junit.Assert;
 import org.junit.Test;
 import org.tmatesoft.hg.internal.AnnotateFacility;
 import org.tmatesoft.hg.internal.AnnotateFacility.AddBlock;
+import org.tmatesoft.hg.internal.AnnotateFacility.Block;
 import org.tmatesoft.hg.internal.AnnotateFacility.ChangeBlock;
 import org.tmatesoft.hg.internal.AnnotateFacility.DeleteBlock;
 import org.tmatesoft.hg.internal.IntMap;
-import org.tmatesoft.hg.internal.AnnotateFacility.Block;
 import org.tmatesoft.hg.repo.HgDataFile;
 import org.tmatesoft.hg.repo.HgLookup;
 import org.tmatesoft.hg.repo.HgRepository;
@@ -38,38 +44,47 @@
 	@Test
 	public void testSingleParentBlame() throws Exception {
 		HgRepository repo = new HgLookup().detectFromWorkingDir();
-		HgDataFile df = repo.getFileNode("src/org/tmatesoft/hg/internal/PatchGenerator.java");
-		final IntMap<String> linesOld= new IntMap<String>(100);
-		final IntMap<String> linesNew = new IntMap<String>(100);
-		new AnnotateFacility().annotate(df, 539, new AnnotateFacility.Inspector() {
-			
-			public void same(Block block) {
-				// TODO Auto-generated method stub
-				
+		final String fname = "src/org/tmatesoft/hg/internal/PatchGenerator.java";
+		final int checkChangeset = 539;
+		HgDataFile df = repo.getFileNode(fname);
+		ByteArrayOutputStream bos = new ByteArrayOutputStream();
+		new AnnotateFacility().annotate(df, checkChangeset, new DiffOutInspector(new PrintStream(bos)));
+		LineGrepOutputParser gp = new LineGrepOutputParser("^@@.+");
+		ExecHelper eh = new ExecHelper(gp, null);
+		eh.run("hg", "diff", "-c", String.valueOf(checkChangeset), "-U", "0", fname);
+		//
+		String[] apiResult = splitLines(bos.toString());
+		String[] expected = splitLines(gp.result());
+		Assert.assertArrayEquals(expected, apiResult);
+	}
+	
+	private static String[] splitLines(CharSequence seq) {
+		int lineCount = 0;
+		for (int i = 0, x = seq.length(); i < x; i++) {
+			if (seq.charAt(i) == '\n') {
+				lineCount++;
 			}
-			
-			public void deleted(DeleteBlock block) {
-				String[] lines = block.removedLines();
-				assert lines.length == block.totalRemovedLines();
-				for (int i = 0, ln = block.firstRemovedLine(); i < lines.length; i++, ln++) {
-					linesOld.put(ln, String.format("%3d:---:%s", ln, lines[i]));
-				}
+		}
+		if (seq.length() > 0 && seq.charAt(seq.length()-1) != '\n') {
+			lineCount++;
+		}
+		String[] rv = new String[lineCount];
+		int lineStart = 0, lineEnd = 0, ix = 0;
+		do {
+			while (lineEnd < seq.length() && seq.charAt(lineEnd) != '\n') lineEnd++;
+			if (lineEnd == lineStart) {
+				continue;
 			}
-			
-			public void changed(ChangeBlock block) {
-				deleted(block);
-				added(block);
-			}
-			
-			public void added(AddBlock block) {
-				String[] addedLines = block.addedLines();
-				assert addedLines.length == block.totalAddedLines();
-				for (int i = 0, ln = block.firstAddedLine(), x = addedLines.length; i < x; i++, ln++) {
-					linesNew.put(ln, String.format("%3d:+++:%s", ln, addedLines[i]));
-				}
-			}
-		});
-		
+			CharSequence line = seq.subSequence(lineStart, lineEnd);
+			rv[ix++] = line.toString();
+			lineStart = ++lineEnd;
+		} while (lineStart < seq.length());
+		assert ix == lineCount;
+		return rv;
+	}
+	
+	private void leftovers() {
+		IntMap<String> linesOld = new IntMap<String>(100), linesNew = new IntMap<String>(100);
 		System.out.println("Changes to old revision:");
 		for (int i = linesOld.firstKey(), x = linesOld.lastKey(); i < x; i++) {
 			if (linesOld.containsKey(i)) {
@@ -86,6 +101,74 @@
 	}
 	
 	public static void main(String[] args) throws Exception {
+		System.out.println(Arrays.equals(new String[0], splitLines("")));
+		System.out.println(Arrays.equals(new String[] { "abc" }, splitLines("abc")));
 		new TestBlame().testSingleParentBlame();
 	}
+
+	static class DiffOutInspector implements AnnotateFacility.Inspector {
+		private final PrintStream out;
+		
+		DiffOutInspector(PrintStream ps) {
+			out = ps;
+		}
+		
+		public void same(Block block) {
+			// nothing 
+		}
+		
+		public void deleted(DeleteBlock block) {
+			out.printf("@@ -%d,%d +%d,0 @@\n", block.firstRemovedLine() + 1, block.totalRemovedLines(), block.removedAt());
+//			String[] lines = block.removedLines();
+//			assert lines.length == block.totalRemovedLines();
+//			for (int i = 0, ln = block.firstRemovedLine(); i < lines.length; i++, ln++) {
+//				linesOld.put(ln, String.format("%3d:---:%s", ln, lines[i]));
+//			}
+		}
+		
+		public void changed(ChangeBlock block) {
+//			deleted(block);
+//			added(block);
+			out.printf("@@ -%d,%d +%d,%d @@\n", block.firstRemovedLine() + 1, block.totalRemovedLines(), block.firstAddedLine() + 1, block.totalAddedLines());
+		}
+		
+		public void added(AddBlock block) {
+			out.printf("@@ -%d,0 +%d,%d @@\n", block.insertedAt(), block.firstAddedLine() + 1, block.totalAddedLines());
+//			String[] addedLines = block.addedLines();
+//			assert addedLines.length == block.totalAddedLines();
+//			for (int i = 0, ln = block.firstAddedLine(), x = addedLines.length; i < x; i++, ln++) {
+//				linesNew.put(ln, String.format("%3d:+++:%s", ln, addedLines[i]));
+//			}
+		}
+	}
+	
+	public static class LineGrepOutputParser implements OutputParser {
+		
+		private final Pattern pattern;
+		private final StringBuilder result = new StringBuilder();
+
+		public LineGrepOutputParser(String regexp) {
+			pattern = Pattern.compile(regexp);
+		}
+		
+		public CharSequence result() {
+			return result;
+		}
+
+		public void parse(CharSequence seq) {
+			int lineStart = 0, lineEnd = 0;
+			do {
+				while (lineEnd < seq.length() && seq.charAt(lineEnd) != '\n') lineEnd++;
+				if (lineEnd == lineStart) {
+					continue;
+				}
+				CharSequence line = seq.subSequence(lineStart, lineEnd);
+				if (pattern.matcher(line).matches()) {
+					result.append(line);
+					result.append('\n');
+				}
+				lineStart = ++lineEnd;
+			} while (lineStart < seq.length());
+		}
+	}
 }