/* * Copyright 2012-2015 Sergey Ignatov * * 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.intellij.erlang.refactoring; import com.intellij.openapi.application.ApplicationManager; import com.intellij.openapi.project.Project; import com.intellij.openapi.util.Computable; import com.intellij.psi.PsiDirectory; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiFile; import com.intellij.refactoring.move.moveFilesOrDirectories.MoveFilesOrDirectoriesProcessor; import com.intellij.testFramework.fixtures.CodeInsightFixtureTestCase; import org.intellij.erlang.roots.ErlangIncludeDirectoryUtil; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; public class ErlangMoveHeaderTest extends CodeInsightFixtureTestCase { public void testMoveFromIncludeDirToModuleDir() { PsiFile includeFile = myFixture.addFileToProject("include/a.hrl", ""); PsiDirectory includeDir = includeFile.getParent(); markAsIncludeDirectory(includeDir); String moduleText = "-module(a).\n-include(\"a.hrl\")."; PsiFile moduleFile = myFixture.configureByText("a.erl", moduleText); PsiDirectory moduleDir = moduleFile.getParent(); move(includeFile, moduleDir); assertEquals(moduleText, moduleFile.getText()); } public void testMoveFromIncludeDirToIncludeDirChild() { PsiFile includeFile = myFixture.addFileToProject("include/a.hrl", ""); PsiDirectory includeDir = includeFile.getParent(); markAsIncludeDirectory(includeDir); PsiDirectory includeDirChild = createSubdirectory(includeDir, "child"); PsiFile moduleFile = myFixture.configureByText("a.erl", "-module(a).\n-include(\"a.hrl\")."); move(includeFile, includeDirChild); assertEquals("-module(a).\n-include(\"child/a.hrl\").", moduleFile.getText()); } public void testMoveFromModuleDirToIncludeDir() { PsiFile includeFile = myFixture.addFileToProject("a.hrl", ""); String moduleText = "-module(a).\n-include(\"a.hrl\")."; PsiFile moduleFile = myFixture.configureByText("a.erl", moduleText); PsiDirectory includeDir = createSubdirectory(moduleFile.getParent(), "include"); markAsIncludeDirectory(includeDir); move(includeFile, includeDir); assertEquals(moduleText, moduleFile.getText()); } public void testMoveFromModuleDirToChildDir() { PsiFile includeFile = myFixture.addFileToProject("a.hrl", ""); PsiFile moduleFile = myFixture.configureByText("a.erl", "-module(a).\n-include(\"a.hrl\")."); PsiDirectory childDir = createSubdirectory(moduleFile.getParent(), "child"); move(includeFile, childDir); assertEquals("-module(a).\n-include(\"child/a.hrl\").", moduleFile.getText()); } private void move(@Nullable PsiFile what, @Nullable PsiDirectory where) { assertNotNull(what); assertNotNull(where); Project project = getProject(); PsiElement[] files = {what}; new MoveFilesOrDirectoriesProcessor(project, files, where, true, false, false, null, null).run(); } private void markAsIncludeDirectory(@Nullable final PsiDirectory dir) { assertNotNull(dir); ApplicationManager.getApplication().runWriteAction(() -> ErlangIncludeDirectoryUtil.markAsIncludeDirectory(myModule, dir.getVirtualFile())); } @NotNull private static PsiDirectory createSubdirectory(@Nullable final PsiDirectory dir, @Nullable final String name) { assertNotNull(dir); assertNotNull(name); return ApplicationManager.getApplication().runWriteAction((Computable<PsiDirectory>) () -> dir.createSubdirectory(name)); } }