tikhomirov@635: /* tikhomirov@635: * Copyright (c) 2013 TMate Software Ltd tikhomirov@635: * tikhomirov@635: * This program is free software; you can redistribute it and/or modify tikhomirov@635: * it under the terms of the GNU General Public License as published by tikhomirov@635: * the Free Software Foundation; version 2 of the License. tikhomirov@635: * tikhomirov@635: * This program is distributed in the hope that it will be useful, tikhomirov@635: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@635: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@635: * GNU General Public License for more details. tikhomirov@635: * tikhomirov@635: * For information on how to redistribute this software under tikhomirov@635: * the terms of a license other than GNU General Public License tikhomirov@635: * contact TMate Software at support@hg4j.com tikhomirov@635: */ tikhomirov@635: package org.tmatesoft.hg.test; tikhomirov@635: tikhomirov@635: import static org.junit.Assert.*; tikhomirov@635: tikhomirov@635: import java.io.File; tikhomirov@635: tikhomirov@635: import org.junit.Rule; tikhomirov@635: import org.junit.Test; tikhomirov@635: import org.tmatesoft.hg.core.HgAddRemoveCommand; tikhomirov@635: import org.tmatesoft.hg.core.HgCheckoutCommand; tikhomirov@635: import org.tmatesoft.hg.core.HgCommitCommand; tikhomirov@637: import org.tmatesoft.hg.core.HgInitCommand; tikhomirov@635: import org.tmatesoft.hg.core.HgRevertCommand; tikhomirov@635: import org.tmatesoft.hg.repo.HgManifest; tikhomirov@635: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@635: import org.tmatesoft.hg.util.Path; tikhomirov@635: tikhomirov@635: /** tikhomirov@635: * @author Artem Tikhomirov tikhomirov@635: * @author TMate Software Ltd. tikhomirov@635: */ tikhomirov@635: public class ComplexTest { tikhomirov@635: tikhomirov@635: @Rule tikhomirov@635: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@635: tikhomirov@635: /** tikhomirov@636: * Regular work sequence with checkout, add, remove, revert and commit tikhomirov@635: */ tikhomirov@635: @Test tikhomirov@635: public void testLocalScenario1() throws Exception { tikhomirov@635: File repoLoc = RepoUtils.createEmptyDir("composite-scenario-1"); tikhomirov@635: // init empty tikhomirov@637: HgRepository hgRepo = new HgInitCommand().location(repoLoc).revlogV1().execute(); tikhomirov@635: assertFalse("[sanity]", hgRepo.isInvalid()); tikhomirov@635: assertEquals("[sanity]", 0, hgRepo.getChangelog().getRevisionCount()); tikhomirov@635: // add 2 files tikhomirov@635: Path fa = Path.create("a"), fb = Path.create("b"); tikhomirov@635: final File fileA = new File(repoLoc, fa.toString()); tikhomirov@635: final File fileB = new File(repoLoc, fb.toString()); tikhomirov@635: RepoUtils.createFile(fileA, "first file"); tikhomirov@635: RepoUtils.createFile(fileB, "second file"); tikhomirov@635: new HgAddRemoveCommand(hgRepo).add(fa, fb).execute(); tikhomirov@635: new HgCommitCommand(hgRepo).message("FIRST").execute(); tikhomirov@635: // add one more file tikhomirov@635: // remove one initial file tikhomirov@635: Path fc = Path.create("c"); tikhomirov@635: final File fileC = new File(repoLoc, fc.toString()); tikhomirov@635: RepoUtils.createFile(fileC, "third file"); tikhomirov@635: fileB.delete(); tikhomirov@635: // TODO HgAddRemoveCommand needs #copy(from, to) method tikhomirov@635: new HgAddRemoveCommand(hgRepo).add(fc).remove(fb).execute(); tikhomirov@635: new HgCommitCommand(hgRepo).message("SECOND").execute(); tikhomirov@635: // tikhomirov@635: assertEquals(2, hgRepo.getChangelog().getRevisionCount()); tikhomirov@636: errorCollector.assertEquals("SECOND", hgRepo.getCommitLastMessage()); tikhomirov@635: // checkout previous version tikhomirov@635: new HgCheckoutCommand(hgRepo).changeset(0).clean(true).execute(); tikhomirov@635: assertTrue(fileA.isFile()); tikhomirov@635: assertTrue(fileB.isFile()); tikhomirov@635: assertFalse(fileC.isFile()); tikhomirov@635: // branch/two heads tikhomirov@635: RepoUtils.modifyFileAppend(fileA, "A1"); tikhomirov@635: RepoUtils.modifyFileAppend(fileB, "B1"); tikhomirov@635: new HgCommitCommand(hgRepo).message("THIRD").execute(); tikhomirov@635: // tikhomirov@635: new HgCheckoutCommand(hgRepo).changeset(1).clean(true).execute(); tikhomirov@635: assertTrue(fileA.isFile()); tikhomirov@635: assertFalse(fileB.isFile()); tikhomirov@635: assertTrue(fileC.isFile()); tikhomirov@635: RepoUtils.modifyFileAppend(fileA, "A2"); tikhomirov@635: RepoUtils.modifyFileAppend(fileC, "C1"); tikhomirov@635: new HgRevertCommand(hgRepo).changeset(1).file(fa).execute(); tikhomirov@635: errorCollector.assertTrue(new File(fileA.getParent(), fileA.getName() + ".orig").isFile()); tikhomirov@635: new HgCommitCommand(hgRepo).message("FOURTH").execute(); tikhomirov@635: // TODO merge and HgMergeCommand tikhomirov@635: tikhomirov@635: errorCollector.assertEquals(2, hgRepo.getFileNode(fa).getRevisionCount()); tikhomirov@635: errorCollector.assertEquals(2, hgRepo.getFileNode(fb).getRevisionCount()); tikhomirov@635: errorCollector.assertEquals(2, hgRepo.getFileNode(fc).getRevisionCount()); tikhomirov@635: final HgManifest mf = hgRepo.getManifest(); tikhomirov@635: errorCollector.assertEquals(mf.getFileRevision(0, fa), mf.getFileRevision(3, fa)); // "A2" was reverted tikhomirov@635: } tikhomirov@635: }