Mercurial > hg4j
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();