blob: 86ab670283aad557b5023eed8239fc3c4634473a [file] [log] [blame]
/*
* Copyright 2000-2012 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 com.intellij.roots;
import com.intellij.application.options.ReplacePathToMacroMap;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.application.ex.PathManagerEx;
import com.intellij.openapi.components.ExpandMacroToPathMap;
import com.intellij.openapi.components.PathMacroManager;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.projectRoots.impl.JavaSdkImpl;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.impl.ModuleRootManagerImpl;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.util.io.FileUtil;
import com.intellij.openapi.vfs.LocalFileSystem;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.IdeaTestUtil;
import com.intellij.testFramework.ModuleTestCase;
import com.intellij.ide.highlighter.ModuleFileType;
import com.intellij.testFramework.PsiTestUtil;
import org.jdom.Element;
import org.jdom.output.XMLOutputter;
import java.io.File;
import java.io.IOException;
import java.util.Iterator;
/**
* @author dsl
*/
public class ModuleRootsExternalizationTest extends ModuleTestCase {
private static final Logger LOG = Logger.getInstance("#com.intellij.openapi.roots.impl.ExternalizationTest");
public void testEmptyModuleWrite() throws Exception {
try {
ModuleRootManagerImpl moduleRootManager = createTempModuleRootManager();
Element root = new Element("root");
moduleRootManager.getState().writeExternal(root);
assertEquals(root.getText(), "");
}
catch (IOException e) {
LOG.error(e);
}
}
private ModuleRootManagerImpl createTempModuleRootManager() throws IOException {
File tmpModule = FileUtil.createTempFile("tst", ModuleFileType.DOT_DEFAULT_EXTENSION);
myFilesToDelete.add(tmpModule);
final Module module = createModule(tmpModule);
final ModuleRootManagerImpl moduleRootManager =
(ModuleRootManagerImpl)ModuleRootManager.getInstance(module);
return moduleRootManager;
}
public void testContentWrite() throws Exception {
File content = getTestRoot();
File source = new File(content, "source");
File testSource = new File(content, "testSource");
File exclude = new File(content, "exclude");
File classes = new File(content, "classes");
File testClasses = new File(content, "testClasses");
final VirtualFile contentFile = LocalFileSystem.getInstance().findFileByIoFile(content);
assertNotNull(contentFile);
final VirtualFile sourceFile = LocalFileSystem.getInstance().findFileByIoFile(source);
assertNotNull(sourceFile);
final VirtualFile testSourceFile = LocalFileSystem.getInstance().findFileByIoFile(testSource);
assertNotNull(testSourceFile);
final VirtualFile excludeFile = LocalFileSystem.getInstance().findFileByIoFile(exclude);
assertNotNull(excludeFile);
final VirtualFile classesFile = LocalFileSystem.getInstance().findFileByIoFile(classes);
assertNotNull(classesFile);
final VirtualFile testClassesFile = LocalFileSystem.getInstance().findFileByIoFile(testClasses);
assertNotNull(testClassesFile);
final File moduleFile = new File(content, "test.iml");
final Module module = createModule(moduleFile);
final ModuleRootManagerImpl moduleRootManager =
(ModuleRootManagerImpl)ModuleRootManager.getInstance(module);
PsiTestUtil.addContentRoot(module, contentFile);
PsiTestUtil.addSourceRoot(module, sourceFile);
PsiTestUtil.addSourceRoot(module, testSourceFile, true);
ModuleRootModificationUtil.setModuleSdk(module, IdeaTestUtil.getMockJdk17());
PsiTestUtil.addExcludedRoot(module, excludeFile);
PsiTestUtil.setCompilerOutputPath(module, classesFile.getUrl(), false);
PsiTestUtil.setCompilerOutputPath(module, testClassesFile.getUrl(), true);
final Element element = new Element("root");
moduleRootManager.getState().writeExternal(element);
assertElementEquals(element,
"<root inherit-compiler-output=\"false\">" +
"<output url=\"file://$MODULE_DIR$/classes\" />" +
"<output-test url=\"file://$MODULE_DIR$/testClasses\" />" +
"<exclude-output />" +
"<content url=\"file://$MODULE_DIR$\">" +
"<sourceFolder url=\"file://$MODULE_DIR$/source\" isTestSource=\"false\" />" +
"<sourceFolder url=\"file://$MODULE_DIR$/testSource\" isTestSource=\"true\" />" +
"<excludeFolder url=\"file://$MODULE_DIR$/exclude\" />" +
"</content>" +
"<orderEntry type=\"jdk\" jdkName=\"java 1.7\" jdkType=\"JavaSDK\" />" +
"<orderEntry type=\"sourceFolder\" forTests=\"false\" />" +
"</root>",
module);
}
public void testModuleLibraries() throws Exception {
File moduleFile = new File(getTestRoot(), "test.iml");
Module module = createModule(moduleFile);
final ModuleRootManagerImpl moduleRootManager =
(ModuleRootManagerImpl)ModuleRootManager.getInstance(module);
final ModifiableRootModel rootModel = moduleRootManager.getModifiableModel();
final LibraryTable moduleLibraryTable = rootModel.getModuleLibraryTable();
final Library unnamedLibrary = moduleLibraryTable.createLibrary();
final File unnamedLibClasses = new File(getTestRoot(), "unnamedLibClasses");
final VirtualFile unnamedLibClassesRoot = LocalFileSystem.getInstance().findFileByIoFile(unnamedLibClasses);
final Library.ModifiableModel libraryModifyableModel = unnamedLibrary.getModifiableModel();
libraryModifyableModel.addRoot(unnamedLibClassesRoot.getUrl(), OrderRootType.CLASSES);
final Library namedLibrary = moduleLibraryTable.createLibrary("namedLibrary");
final File namedLibClasses = new File(getTestRoot(), "namedLibClasses");
final VirtualFile namedLibClassesRoot = LocalFileSystem.getInstance().findFileByIoFile(namedLibClasses);
final Library.ModifiableModel namedLibraryModel = namedLibrary.getModifiableModel();
namedLibraryModel.addRoot(namedLibClassesRoot.getUrl(), OrderRootType.CLASSES);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
libraryModifyableModel.commit();
namedLibraryModel.commit();
}
});
final Iterator libraryIterator = moduleLibraryTable.getLibraryIterator();
assertEquals(libraryIterator.next(), unnamedLibrary);
assertEquals(libraryIterator.next(), namedLibrary);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
rootModel.commit();
}
});
final Element element = new Element("root");
moduleRootManager.getState().writeExternal(element);
assertElementEquals(element,
"<root inherit-compiler-output=\"true\">" +
"<exclude-output />" +
"<orderEntry type=\"sourceFolder\" forTests=\"false\" />" +
"<orderEntry type=\"module-library\">" +
"<library>" +
"<CLASSES><root url=\"file://$MODULE_DIR$/unnamedLibClasses\" /></CLASSES>" +
"<JAVADOC />" +
"<SOURCES />" +
"</library>" +
"</orderEntry>" +
"<orderEntry type=\"module-library\">" +
"<library name=\"namedLibrary\">" +
"<CLASSES><root url=\"file://$MODULE_DIR$/namedLibClasses\" /></CLASSES>" +
"<JAVADOC />" +
"<SOURCES />" +
"</library>" +
"</orderEntry>" +
"</root>", module);
}
public void testCompilerOutputInheritance() throws Exception {
File moduleFile = new File(getTestRoot(), "test.iml");
Module module = createModule(moduleFile);
final ModuleRootManagerImpl moduleRootManager =
(ModuleRootManagerImpl)ModuleRootManager.getInstance(module);
final ModifiableRootModel rootModel = moduleRootManager.getModifiableModel();
rootModel.getModuleExtension(CompilerModuleExtension.class).inheritCompilerOutputPath(true);
ApplicationManager.getApplication().runWriteAction(new Runnable() {
@Override
public void run() {
rootModel.commit();
}
});
Element element = new Element("root");
moduleRootManager.getState().writeExternal(element);
assertElementEquals(element,
"<root inherit-compiler-output=\"true\">" +
"<exclude-output />" +
"<orderEntry type=\"sourceFolder\" forTests=\"false\" />" +
"</root>", module);
}
public void testMacroSubstituteWin() {
final ReplacePathToMacroMap map = new ReplacePathToMacroMap();
final String path = "jar://C:/idea/lib/forms_rt.jar!/";
map.put("jar://C:/", "jar://$MODULE_DIR$/../../");
final String substituted = map.substitute(path, false);
assertEquals("jar://$MODULE_DIR$/../../idea/lib/forms_rt.jar!/", substituted);
}
public void testExpandMacro1() {
final ExpandMacroToPathMap map = new ExpandMacroToPathMap();
map.addMacroExpand("MACRO", "C:/idea");
final String expanded = map.substitute("jar://$MACRO$/lib/forms_rt.jar!/", false);
assertEquals("jar://C:/idea/lib/forms_rt.jar!/", expanded);
}
public void testExpandMacro2() {
final ExpandMacroToPathMap map = new ExpandMacroToPathMap();
map.addMacroExpand("MACRO", "forms_rt.jar!/");
final String expanded = map.substitute("jar://C:/idea/lib/$MACRO$", false);
assertEquals("jar://C:/idea/lib/forms_rt.jar!/", expanded);
}
public void testExpandMacro3() {
final ExpandMacroToPathMap map = new ExpandMacroToPathMap();
map.addMacroExpand("MACRO1", "C:/idea");
map.addMacroExpand("MACRO2", "forms_rt.jar!/");
final String expanded = map.substitute("jar://$MACRO1$/lib/$MACRO2$", false);
assertEquals("jar://C:/idea/lib/forms_rt.jar!/", expanded);
}
public void testExpandMacroNoExpand() {
final ExpandMacroToPathMap map = new ExpandMacroToPathMap();
map.addMacroExpand("MACRO", "C:/idea");
final String expanded = map.substitute("jar://C:/idea$/lib/forms_rt.jar!/", false);
assertEquals("jar://C:/idea$/lib/forms_rt.jar!/", expanded);
}
public void testExpandMacroNoExpand2() {
final ExpandMacroToPathMap map = new ExpandMacroToPathMap();
map.addMacroExpand("MACRO", "C:/idea");
final String expanded = map.substitute("jar://C:/idea/lib/forms_rt.jar!/$", false);
assertEquals("jar://C:/idea/lib/forms_rt.jar!/$", expanded);
}
public void testExpandMacroNoExpand3() {
final ExpandMacroToPathMap map = new ExpandMacroToPathMap();
map.addMacroExpand("MACRO", "C:/idea");
final String expanded = map.substitute("jar://$UNKNOWN$/lib/forms_rt.jar!/", false);
assertEquals("jar://$UNKNOWN$/lib/forms_rt.jar!/", expanded);
}
public void testMacroSubstitute2() {
final ReplacePathToMacroMap map = new ReplacePathToMacroMap();
final String path = "jar://C:/idea/lib/forms_rt.jar!/";
map.put("jar://C:/id", "*SUBST*");
final String substituted = map.substitute(path, false);
assertEquals(path, substituted);
}
public static void assertElementEquals(final Element element, String value, Module module) {
PathMacroManager.getInstance(module).collapsePaths(element);
assertEquals(value, new XMLOutputter().outputString(element));
}
private File getTestRoot() {
File testRoot = new File(PathManagerEx.getTestDataPath());
File moduleRootManagerRoot = new File(testRoot, "moduleRootManager");
File thisTestRoot = new File(moduleRootManagerRoot, getTestName(true));
return thisTestRoot;
}
}