diff test/org/tmatesoft/hg/test/TestHistory.java @ 514:5dcb4581c8ef

Report renames when following file history tree with HgFileRenameHandlerMixin
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Mon, 17 Dec 2012 19:06:07 +0100
parents 90093ee56c0d
children 9922d1f7cb2a
line wrap: on
line diff
--- a/test/org/tmatesoft/hg/test/TestHistory.java	Mon Dec 17 15:01:57 2012 +0100
+++ b/test/org/tmatesoft/hg/test/TestHistory.java	Mon Dec 17 19:06:07 2012 +0100
@@ -18,14 +18,17 @@
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.is;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -33,6 +36,7 @@
 import org.tmatesoft.hg.core.HgChangeset;
 import org.tmatesoft.hg.core.HgChangesetHandler;
 import org.tmatesoft.hg.core.HgChangesetTreeHandler;
+import org.tmatesoft.hg.core.HgFileRenameHandlerMixin;
 import org.tmatesoft.hg.core.HgFileRevision;
 import org.tmatesoft.hg.core.HgLogCommand;
 import org.tmatesoft.hg.core.HgLogCommand.CollectHandler;
@@ -40,6 +44,7 @@
 import org.tmatesoft.hg.repo.HgLookup;
 import org.tmatesoft.hg.repo.HgRepository;
 import org.tmatesoft.hg.test.LogOutputParser.Record;
+import org.tmatesoft.hg.util.Adaptable;
 import org.tmatesoft.hg.util.Pair;
 import org.tmatesoft.hg.util.Path;
 
@@ -142,12 +147,24 @@
 		final String fname = "file1_b";
 		assertTrue("[sanity]", repo.getFileNode(fname).exists());
 		eh.run("hg", "log", "--debug", "--follow", fname, "--cwd", repo.getLocation());
-		
+
+		final Map<Path,Path> renames = new HashMap<Path, Path>();
 		TreeCollectHandler h = new TreeCollectHandler(true);
+		h.attachAdapter(HgFileRenameHandlerMixin.class, new HgFileRenameHandlerMixin() {
+			
+			public void copy(HgFileRevision from, HgFileRevision to) throws HgCallbackTargetException {
+				renames.put(from.getPath(), to.getPath());
+			}
+		});
 		h.checkPrevInParents = true;
 		new HgLogCommand(repo).file(fname, true).execute(h);
+
+		assertEquals(1, h.getAdapterUse(HgFileRenameHandlerMixin.class));
 		
 		report("execute with HgChangesetTreeHandler(follow == true)", h.getResult(), false);
+		
+		assertEquals(1, renames.size());
+		assertEquals(Path.create(fname), renames.get(Path.create("file1_a")));
 	}
 
 	private void report(String what, List<HgChangeset> r, boolean reverseConsoleResult) {
@@ -288,7 +305,35 @@
 
 	////
 	
-	private final class TreeCollectHandler implements HgChangesetTreeHandler {
+	private static class AdapterPlug implements Adaptable {
+		private final Map<Class<?>, Object> adapters = new HashMap<Class<?>, Object>();
+		private final List<Class<?>> adapterUses = new ArrayList<Class<?>>();
+		
+		public <T> void attachAdapter(Class<T> adapterClass, T instance) {
+			adapters.put(adapterClass, instance);
+		}
+
+		public <T> T getAdapter(Class<T> adapterClass) {
+			Object instance = adapters.get(adapterClass);
+			if (instance != null) {
+				adapterUses.add(adapterClass);
+				return adapterClass.cast(instance);
+			}
+			return null;
+		}
+		
+		public int getAdapterUse(Class<?> adapterClass) {
+			int uses = 0;
+			for (Class<?> c : adapterUses) {
+				if (c == adapterClass) {
+					uses++;
+				}
+			}
+			return uses;
+		}
+	}
+	
+	private final class TreeCollectHandler extends AdapterPlug implements HgChangesetTreeHandler {
 		private final LinkedList<HgChangeset> cmdResult = new LinkedList<HgChangeset>();
 		private final boolean reverseResult;
 		boolean checkPrevInChildren = false;