/* * Copyright 2000-2010 JetBrains s.r.o. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.zmlx.hg4idea.test; import com.intellij.execution.process.ProcessOutput; import com.intellij.openapi.vfs.VirtualFile; import com.intellij.testFramework.vcs.AbstractVcsTestCase; import com.intellij.testFramework.fixtures.IdeaTestFixtureFactory; import com.intellij.testFramework.fixtures.TempDirTestFixture; import com.intellij.vcsUtil.VcsUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; /** * Representation of a Mercurial repository for tests purposes. * @author Kirill Likhodedov */ public class HgTestRepository { @NotNull private final HgTest myTest; @NotNull private final TempDirTestFixture myDirFixture; private VirtualFile myDir; @Nullable private final HgTestRepository myParent; // cloned from public HgTestRepository(@NotNull HgTest test, @NotNull TempDirTestFixture dir) { this(test, dir, null); } /** * @param test test instance * @param dir repository root * @param parent parent repository where this repository is cloned from, if one exists. */ public HgTestRepository(@NotNull HgTest test, @NotNull TempDirTestFixture dir, @Nullable HgTestRepository parent) { myTest = test; myDirFixture = dir; myParent = parent; } /** * Creates a new Mercurial repository in a new temporary test directory. * @param test reference to the test case instance. * @return created repository. */ public static HgTestRepository create(HgTest test) throws Exception { final TempDirTestFixture dirFixture = createFixtureDir(); final File repo = new File(dirFixture.getTempDirPath()); final ProcessOutput processOutput = test.runHg(repo, "init"); AbstractVcsTestCase.verify(processOutput); return new HgTestRepository(test, dirFixture); } private static TempDirTestFixture createFixtureDir() throws Exception { final TempDirTestFixture fixture = IdeaTestFixtureFactory.getFixtureFactory().createTempDirTestFixture(); fixture.setUp(); return fixture; } /** * Clones a repository from this one. New repository is located in a new temporary test directory. * @return New repository cloned from this one. */ public HgTestRepository cloneRepository() throws Exception { final TempDirTestFixture dirFixture = createFixtureDir(); final ProcessOutput processOutput = myTest.runHg(null, "clone", getDirFixture().getTempDirPath(), dirFixture.getTempDirPath()); AbstractVcsTestCase.verify(processOutput); return new HgTestRepository(myTest, dirFixture); } @NotNull public TempDirTestFixture getDirFixture() { return myDirFixture; } @Nullable public VirtualFile getDir() { if (myDir == null) { myDir = VcsUtil.getVirtualFile(myDirFixture.getTempDirPath()); } return myDir; } /** * Creates a file in this repository. * @param filename relative path to the file. * @return The created file. */ public VirtualFile createFile(String filename) throws FileNotFoundException { return createFile(filename, "initial content"); } /** * Creates a file in this repository and fills it with the given content. * @param filename relative path to the file. * @param content initial content for the file. * @return The created file. */ public VirtualFile createFile(String filename, String content) throws FileNotFoundException { return myTest.createFileInCommand(filename, content); } /** * Natively executes the given mercurial command. * @param commandWithParameters Mercurial command with parameters. E.g. ["status", "-a"] */ public void execute(String... commandWithParameters) throws IOException { myTest.runHg(new File(myDirFixture.getTempDirPath()), commandWithParameters); } public void add() throws IOException { execute("add"); } public void commit() throws IOException { execute("commit", "-m", "Sample commit message"); } public void merge() throws IOException { execute("merge"); } public void pull() throws IOException { execute("pull"); } public void push() throws IOException { execute("push"); } public void update() throws IOException { execute("update"); } /** * Calls add() and then commit(). A shorthand for usual test situations when a file is added and then immediately committed. */ public void addCommit() throws IOException { add(); commit(); } /** * Calls pull, update and merge on this repository. Common for merge testing. */ public void pullUpdateMerge() throws IOException { pull(); update(); merge(); } }