tikhomirov@691: /* tikhomirov@691: * Copyright (c) 2013 TMate Software Ltd tikhomirov@691: * tikhomirov@691: * This program is free software; you can redistribute it and/or modify tikhomirov@691: * it under the terms of the GNU General Public License as published by tikhomirov@691: * the Free Software Foundation; version 2 of the License. tikhomirov@691: * tikhomirov@691: * This program is distributed in the hope that it will be useful, tikhomirov@691: * but WITHOUT ANY WARRANTY; without even the implied warranty of tikhomirov@691: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the tikhomirov@691: * GNU General Public License for more details. tikhomirov@691: * tikhomirov@691: * For information on how to redistribute this software under tikhomirov@691: * the terms of a license other than GNU General Public License tikhomirov@691: * contact TMate Software at support@hg4j.com tikhomirov@691: */ tikhomirov@691: package org.tmatesoft.hg.test; tikhomirov@691: tikhomirov@691: import static org.tmatesoft.hg.core.HgIterateDirection.NewToOld; tikhomirov@691: import static org.tmatesoft.hg.core.HgIterateDirection.OldToNew; tikhomirov@691: tikhomirov@691: import org.junit.Assert; tikhomirov@691: import org.junit.Rule; tikhomirov@691: import org.junit.Test; tikhomirov@691: import org.tmatesoft.hg.core.HgChangesetFileSneaker; tikhomirov@691: import org.tmatesoft.hg.core.HgException; tikhomirov@691: import org.tmatesoft.hg.core.HgIterateDirection; tikhomirov@691: import org.tmatesoft.hg.internal.FileRenameHistory; tikhomirov@691: import org.tmatesoft.hg.internal.FileRenameHistory.Chunk; tikhomirov@691: import org.tmatesoft.hg.repo.HgDataFile; tikhomirov@691: import org.tmatesoft.hg.repo.HgRepository; tikhomirov@691: tikhomirov@691: /** tikhomirov@691: * TODO add tests for {@link HgChangesetFileSneaker} tikhomirov@691: * @author Artem Tikhomirov tikhomirov@691: * @author TMate Software Ltd. tikhomirov@691: */ tikhomirov@691: public class TestFileRenameUtils { tikhomirov@691: tikhomirov@691: tikhomirov@691: @Rule tikhomirov@691: public ErrorCollectorExt errorCollector = new ErrorCollectorExt(); tikhomirov@691: tikhomirov@691: @Test tikhomirov@691: public void testFileRenameHistory() throws HgException { tikhomirov@691: HgRepository repo = Configuration.get().find("log-renames"); tikhomirov@691: // history of files from their TIP perspective tikhomirov@691: // series of (fname, fileRefStart, fileRevEnd, csetStart, csetEnd), new to old tikhomirov@691: Object[] historyA = new Object[] {"a", 2, 2, 5, 5, "c", 0, 1, 2, 4, "b", 0, 1, 0, 1}; tikhomirov@691: Object[] historyB = new Object[] {"b", 2, 3, 3, 4, "a", 0, 1, 0, 2 }; tikhomirov@691: Object[] historyC = new Object[] {"c", 0, 1, 2, 4, "b", 0, 1, 0, 1 }; tikhomirov@691: Object[] historyD = new Object[] {"d", 1, 1, 5, 5, "b", 2, 3, 3, 4, "a", 0, 1, 0, 2}; tikhomirov@691: tikhomirov@691: FileRenameHistory frh = new FileRenameHistory(0, 5); tikhomirov@691: for (Object[] history : new Object[][] {historyA, historyB, historyC, historyD}) { tikhomirov@691: String fname = history[0].toString(); tikhomirov@691: HgDataFile df = repo.getFileNode(fname); tikhomirov@691: Assert.assertFalse(frh.isOutOfRange(df, df.getLastRevision())); tikhomirov@691: frh.build(df, df.getLastRevision()); tikhomirov@691: int recordIndex = 0; tikhomirov@691: errorCollector.assertEquals(history.length / 5, frh.chunks()); tikhomirov@691: for (Chunk c : frh.iterate(HgIterateDirection.NewToOld)) { tikhomirov@691: compareChunk(fname, c, history, recordIndex++); tikhomirov@691: } tikhomirov@691: errorCollector.assertEquals("Shall compare full history", history.length, recordIndex * 5); tikhomirov@691: } tikhomirov@691: // tikhomirov@691: HgDataFile df = repo.getFileNode("d"); tikhomirov@691: Assert.assertFalse(frh.isOutOfRange(df, 0)); tikhomirov@691: frh.build(df, 0); tikhomirov@691: errorCollector.assertEquals(1, frh.chunks()); tikhomirov@691: Chunk c = frh.iterate(NewToOld).iterator().next(); tikhomirov@691: compareChunk("abandoned d(0)", c, new Object[] { "d", 0, 0, 4, 4 }, 0); tikhomirov@691: // tikhomirov@691: df = repo.getFileNode("a"); tikhomirov@691: Assert.assertFalse(frh.isOutOfRange(df, 0)); tikhomirov@691: frh.build(df, 0); tikhomirov@691: errorCollector.assertEquals(1, frh.chunks()); tikhomirov@691: c = frh.iterate(NewToOld).iterator().next(); tikhomirov@691: compareChunk("a(0) and boundary checks", c, new Object[] { "a", 0, 0, 0, 0 }, 0); tikhomirov@691: // tikhomirov@691: repo = Configuration.get().find("test-annotate"); // need a long file history tikhomirov@691: df = repo.getFileNode("file1"); tikhomirov@691: Assert.assertTrue("[sanity]", repo.getChangelog().getLastRevision() >=9); tikhomirov@691: Assert.assertTrue("[sanity]", df.exists() && df.getLastRevision() >= 9); tikhomirov@691: frh = new FileRenameHistory(0, 9); tikhomirov@691: frh.build(df, 9); tikhomirov@691: errorCollector.assertEquals(1, frh.chunks()); tikhomirov@691: c = frh.iterate(NewToOld).iterator().next(); tikhomirov@691: compareChunk("regular file, no renames", c, new Object[] { "file1", 0, 9, 0, 9 }, 0); tikhomirov@691: // restricted range tikhomirov@691: frh = new FileRenameHistory(3, 6); tikhomirov@691: Assert.assertFalse(frh.isOutOfRange(df, 9)); tikhomirov@691: frh.build(df, 9); // start from out of range revision tikhomirov@691: errorCollector.assertEquals(1, frh.chunks()); tikhomirov@691: c = frh.iterate(OldToNew).iterator().next(); tikhomirov@691: compareChunk("regular file, no renames, in range 3..6", c, new Object[] { "file1", 3, 6, 3, 6 }, 0); tikhomirov@691: } tikhomirov@691: tikhomirov@691: private void compareChunk(String msg, Chunk chunk, Object[] expected, int recordOffset) { tikhomirov@691: int off = recordOffset * 5; tikhomirov@691: errorCollector.assertEquals(msg, expected[off], chunk.file().getPath().toString()); tikhomirov@691: errorCollector.assertEquals(msg, expected[off+1], chunk.firstFileRev()); tikhomirov@691: errorCollector.assertEquals(msg, expected[off+2], chunk.lastFileRev()); tikhomirov@691: errorCollector.assertEquals(msg, expected[off+3], chunk.firstCset()); tikhomirov@691: errorCollector.assertEquals(msg, expected[off+4], chunk.lastCset()); tikhomirov@691: } tikhomirov@691: tikhomirov@691: }