diff test/org/tmatesoft/hg/test/TestManifest.java @ 479:59b7c817bc4d

Methods from Main graduated as tests
author Artem Tikhomirov <tikhomirov.artem@gmail.com>
date Thu, 12 Jul 2012 20:02:49 +0200
parents d78cb5ca3053
children
line wrap: on
line diff
--- a/test/org/tmatesoft/hg/test/TestManifest.java	Thu Jul 12 19:11:12 2012 +0200
+++ b/test/org/tmatesoft/hg/test/TestManifest.java	Thu Jul 12 20:02:49 2012 +0200
@@ -18,13 +18,14 @@
 
 import static org.hamcrest.CoreMatchers.equalTo;
 import static org.hamcrest.CoreMatchers.notNullValue;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
 import static org.tmatesoft.hg.repo.HgRepository.TIP;
 
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.regex.Pattern;
 
 import org.junit.Rule;
 import org.junit.Test;
@@ -32,8 +33,11 @@
 import org.tmatesoft.hg.core.HgFileRevision;
 import org.tmatesoft.hg.core.HgManifestCommand;
 import org.tmatesoft.hg.core.Nodeid;
+import org.tmatesoft.hg.internal.IntMap;
 import org.tmatesoft.hg.repo.HgLookup;
+import org.tmatesoft.hg.repo.HgManifest;
 import org.tmatesoft.hg.repo.HgRepository;
+import org.tmatesoft.hg.repo.HgManifest.Flags;
 import org.tmatesoft.hg.util.Path;
 
 
@@ -67,6 +71,7 @@
 		tm.testTip();
 		tm.testFirstRevision();
 		tm.testRevisionInTheMiddle();
+		tm.testWalkFileRevisions();
 		tm.errorCollector.verify();
 	}
 	
@@ -98,6 +103,65 @@
 		}
 		testRevision(rev);
 	}
+	
+	@Test
+	public void testWalkFileRevisions() throws Exception {
+		//  hg --debug manifest --rev 150 | grep cmdline/org/tmatesoft/hg/console/Main.java
+		String fname = "cmdline/org/tmatesoft/hg/console/Main.java";
+		Pattern ptrn = Pattern.compile("(\\w+)\\s+\\d{3}\\s+\\Q" + fname + "\\E$", Pattern.MULTILINE);
+		OutputParser.Stub output = new OutputParser.Stub();
+		ExecHelper eh = new ExecHelper(output, repo.getWorkingDir());
+		int[] revisions = new int[] { 100, 150, 200, 210, 300 };
+		final IntMap<Nodeid> expected = new IntMap<Nodeid>(10);
+		for (int r : revisions) {
+			eh.run("hg", "--debug", "manifest", "--rev", Integer.toString(r));
+			for (String l : output.lines(ptrn, 1)) {
+				assertFalse(expected.containsKey(r));
+				expected.put(r, Nodeid.fromAscii(l));
+			}
+			if (!expected.containsKey(r)) {
+				expected.put(r, Nodeid.NULL);
+			}
+		}
+		assertEquals(revisions.length, expected.size());
+		final Path path = Path.create(fname);
+		repo.getManifest().walkFileRevisions(path, new HgManifest.Inspector() {
+
+			private Nodeid expectedNodeid;
+			private int clogRev;
+
+			public boolean begin(int mainfestRevision, Nodeid nid, int changelogRevision) {
+				clogRev = changelogRevision;
+				assertTrue(expected.containsKey(changelogRevision));
+				expectedNodeid = expected.get(changelogRevision);
+				// we walk revisions of specific file, hence can't get into manifest without
+				// that file, expectedNodeid should have been reported by `hg manifest`:
+				assertTrue(!expectedNodeid.isNull());
+				return true;
+			}
+
+			public boolean next(Nodeid nid, Path fname, Flags flags) {
+				assertEquals(path, fname); // only selected path shall pass
+				assertEquals(expectedNodeid, nid);
+				expected.remove(clogRev);
+				return true;
+			}
+			
+			public boolean end(int manifestRevision) {
+				return true;
+			}
+			
+		}, revisions);
+		for (int r : revisions) {
+			if (expected.containsKey(r)) {
+				// Each  manifest entry reported by `hg manifest` shall be 
+				// reported (and removed) by walkFileRevisions(), too. Only null nodeids
+				// (revisions where the file was missing) are left 
+				assertTrue(expected.get(r).isNull());
+			}
+		}
+	}
+
 
 	private void testRevision(int rev) throws Exception {
 		manifestParser.reset();