tikhomirov@648: /* tikhomirov@648: * Copyright (c) 2013 TMate Software Ltd tikhomirov@648: * tikhomirov@648: * This program is free software; you can redistribute it and/or modify tikhomirov@648: * it under the terms of the GNU General Public License as published by tikhomirov@648: * the Free Software Foundation; version 2 of the License. tikhomirov@648: * tikhomirov@648: * This program is distributed in the hope that it will be useful, tikhomirov@648: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@648: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@648: * GNU General Public License for more details. tikhomirov@648: * tikhomirov@648: * For information on how to redistribute this software under tikhomirov@648: * the terms of a license other than GNU General Public License tikhomirov@648: * contact TMate Software at support@hg4j.com tikhomirov@648: */ tikhomirov@648: package org.tmatesoft.hg.test; tikhomirov@648: tikhomirov@648: import org.junit.Rule; tikhomirov@648: import org.junit.Test; tikhomirov@648: import org.tmatesoft.hg.core.Nodeid; tikhomirov@648: import org.tmatesoft.hg.internal.RevisionSet; tikhomirov@651: import org.tmatesoft.hg.repo.HgChangelog; tikhomirov@651: import org.tmatesoft.hg.repo.HgParentChildMap; tikhomirov@651: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@648: tikhomirov@648: /** tikhomirov@648: * tikhomirov@648: * @author Artem Tikhomirov tikhomirov@648: * @author TMate Software Ltd. tikhomirov@648: */ tikhomirov@648: public class TestRevisionSet { tikhomirov@648: tikhomirov@648: @Rule tikhomirov@648: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@648: tikhomirov@648: @Test tikhomirov@648: public void testRegularSetOperations() { tikhomirov@648: Nodeid n1 = Nodeid.fromAscii("c75297c1786734589175c673db40e8ecaa032b09"); tikhomirov@648: Nodeid n2 = Nodeid.fromAscii("3b7d51ed4c65082f9235e3459e282d7ff723aa97"); tikhomirov@648: Nodeid n3 = Nodeid.fromAscii("14dac192aa262feb8ff6645a102648498483a188"); tikhomirov@648: Nodeid n4 = Nodeid.fromAscii("1deea2f332183c947937f6df988c2c6417efc217"); tikhomirov@653: Nodeid[] nodes = { n1, n2, n3 }; tikhomirov@653: RevisionSet a = new RevisionSet(nodes); tikhomirov@653: Nodeid[] nodes1 = { n3, n4 }; tikhomirov@653: RevisionSet b = new RevisionSet(nodes1); tikhomirov@653: Nodeid[] nodes2 = { n1, n2, n3, n4 }; tikhomirov@653: RevisionSet union_ab = new RevisionSet(nodes2); tikhomirov@653: Nodeid[] nodes3 = { n3 }; tikhomirov@653: RevisionSet intersect_ab = new RevisionSet(nodes3); tikhomirov@653: Nodeid[] nodes4 = { n1, n2 }; tikhomirov@653: RevisionSet subtract_ab = new RevisionSet(nodes4); tikhomirov@653: Nodeid[] nodes5 = { n4 }; tikhomirov@653: RevisionSet subtract_ba = new RevisionSet(nodes5); tikhomirov@653: Nodeid[] nodes6 = { n1, n2, n4 }; tikhomirov@653: RevisionSet symDiff_ab = new RevisionSet(nodes6); tikhomirov@648: tikhomirov@648: errorCollector.assertEquals(union_ab, a.union(b)); tikhomirov@648: errorCollector.assertEquals(union_ab, b.union(a)); tikhomirov@648: errorCollector.assertEquals(intersect_ab, a.intersect(b)); tikhomirov@648: errorCollector.assertEquals(intersect_ab, b.intersect(a)); tikhomirov@648: errorCollector.assertEquals(subtract_ab, a.subtract(b)); tikhomirov@648: errorCollector.assertEquals(subtract_ba, b.subtract(a)); tikhomirov@648: errorCollector.assertEquals(symDiff_ab, a.symmetricDifference(b)); tikhomirov@648: errorCollector.assertEquals(symDiff_ab, b.symmetricDifference(a)); tikhomirov@653: Nodeid[] nodes7 = { n1, n2, n4 }; tikhomirov@653: Nodeid[] nodes8 = { n4, n1, n2 }; tikhomirov@653: errorCollector.assertTrue(new RevisionSet(nodes7).equals(new RevisionSet(nodes8))); tikhomirov@653: Nodeid[] nodes9 = {}; tikhomirov@653: Nodeid[] nodes10 = {}; tikhomirov@653: errorCollector.assertTrue(new RevisionSet(nodes9).equals(new RevisionSet(nodes10))); tikhomirov@653: Nodeid[] nodes11 = { n1 }; tikhomirov@653: Nodeid[] nodes12 = { n2 }; tikhomirov@653: errorCollector.assertFalse(new RevisionSet(nodes11).equals(new RevisionSet(nodes12))); tikhomirov@651: } tikhomirov@651: tikhomirov@651: @Test tikhomirov@651: public void testRootsAndHeads() throws Exception { tikhomirov@651: final HgRepository repo = Configuration.get().find("test-annotate"); tikhomirov@653: Nodeid[] allRevs = RepoUtils.allRevisions(repo); tikhomirov@651: HgParentChildMap parentHelper = new HgParentChildMap(repo.getChangelog()); tikhomirov@651: parentHelper.init(); tikhomirov@653: final RevisionSet complete = new RevisionSet(allRevs); tikhomirov@653: Nodeid[] nodes = { allRevs[0] }; tikhomirov@651: // roots tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes), complete.roots(parentHelper)); tikhomirov@653: Nodeid[] nodes1 = { allRevs[0], allRevs[1] }; tikhomirov@653: RevisionSet fromR2 = complete.subtract(new RevisionSet(nodes1)); tikhomirov@653: Nodeid[] nodes2 = { allRevs[0], allRevs[1], allRevs[2] }; tikhomirov@653: RevisionSet fromR3 = complete.subtract(new RevisionSet(nodes2)); tikhomirov@653: Nodeid[] nodes3 = { allRevs[2], allRevs[3] }; tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes3), fromR2.roots(parentHelper)); tikhomirov@653: Nodeid[] nodes4 = { allRevs[3], allRevs[4], allRevs[5] }; tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes4), fromR3.roots(parentHelper)); tikhomirov@653: Nodeid[] nodes5 = { allRevs[9], allRevs[7] }; tikhomirov@651: // heads tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes5), complete.heads(parentHelper)); tikhomirov@653: Nodeid[] nodes6 = { allRevs[9], allRevs[8] }; tikhomirov@653: RevisionSet toR7 = complete.subtract(new RevisionSet(nodes6)); tikhomirov@653: Nodeid[] nodes7 = { allRevs[7], allRevs[6], allRevs[4] }; tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes7), toR7.heads(parentHelper)); tikhomirov@653: Nodeid[] nodes8 = { allRevs[5], allRevs[7] }; tikhomirov@653: RevisionSet withoutNoMergeBranch = toR7.subtract(new RevisionSet(nodes8)); tikhomirov@653: Nodeid[] nodes9 = { allRevs[6], allRevs[4] }; tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes9), withoutNoMergeBranch.heads(parentHelper)); tikhomirov@651: errorCollector.assertEquals(complete.heads(parentHelper), complete.heads(parentHelper).heads(parentHelper)); tikhomirov@651: } tikhomirov@651: tikhomirov@651: @Test tikhomirov@651: public void testAncestorsAndChildren() throws Exception { tikhomirov@651: final HgRepository repo = Configuration.get().find("test-annotate"); tikhomirov@653: Nodeid[] allRevs = RepoUtils.allRevisions(repo); tikhomirov@651: HgParentChildMap parentHelper = new HgParentChildMap(repo.getChangelog()); tikhomirov@651: parentHelper.init(); tikhomirov@653: final RevisionSet complete = new RevisionSet(allRevs); tikhomirov@653: Nodeid[] nodes = {}; tikhomirov@651: // children tikhomirov@653: errorCollector.assertTrue(new RevisionSet(nodes).children(parentHelper).isEmpty()); tikhomirov@653: Nodeid[] nodes1 = { allRevs[8], allRevs[9] }; tikhomirov@653: Nodeid[] nodes2 = { allRevs[4] }; tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes1), new RevisionSet(nodes2).children(parentHelper)); tikhomirov@653: Nodeid[] nodes3 = { allRevs[8], allRevs[9], allRevs[4], allRevs[5], allRevs[7] }; tikhomirov@651: // default branch and no-merge branch both from r2 tikhomirov@653: RevisionSet s1 = new RevisionSet(nodes3); tikhomirov@653: Nodeid[] nodes4 = { allRevs[2] }; tikhomirov@653: errorCollector.assertEquals(s1, new RevisionSet(nodes4).children(parentHelper)); tikhomirov@653: Nodeid[] nodes5 = { allRevs[0], allRevs[1] }; tikhomirov@651: // ancestors tikhomirov@653: RevisionSet fromR2 = complete.subtract(new RevisionSet(nodes5)); tikhomirov@653: Nodeid[] nodes6 = { allRevs[9], allRevs[5], allRevs[7], allRevs[8] }; tikhomirov@651: // no-merge branch and r9 are not in ancestors of r8 (as well as r8 itself) tikhomirov@653: RevisionSet s3 = fromR2.subtract(new RevisionSet(nodes6)); tikhomirov@653: Nodeid[] nodes7 = { allRevs[8] }; tikhomirov@653: errorCollector.assertEquals(s3, fromR2.ancestors(new RevisionSet(nodes7), parentHelper)); tikhomirov@653: Nodeid[] nodes8 = { allRevs[5], allRevs[7] }; tikhomirov@651: // ancestors of no-merge branch tikhomirov@653: RevisionSet branchNoMerge = new RevisionSet(nodes8); tikhomirov@653: Nodeid[] nodes9 = { allRevs[0], allRevs[1], allRevs[2] }; tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes9), complete.ancestors(branchNoMerge, parentHelper)); tikhomirov@653: Nodeid[] nodes10 = { allRevs[2] }; tikhomirov@653: errorCollector.assertEquals(new RevisionSet(nodes10), fromR2.ancestors(branchNoMerge, parentHelper)); tikhomirov@648: } tikhomirov@648: }