// Copyright 2000-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file.
package com.intellij.roots;
import com.intellij.configurationStore.StoreUtil;
import com.intellij.openapi.application.WriteAction;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.roots.ContentEntry;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.ModuleRootModel;
import com.intellij.openapi.roots.ModuleRootModificationUtil;
import com.intellij.openapi.util.JDOMUtil;
import com.intellij.openapi.vfs.VfsUtilCore;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.testFramework.JavaProjectTestCase;
import com.intellij.testFramework.PsiTestUtil;
import com.intellij.util.io.PathKt;
import org.jdom.Element;
import java.nio.file.Path;
public class ManagingContentRootsTest extends JavaProjectTestCase {
private VirtualFile dir;
@Override
protected void setUp() throws Exception {
super.setUp();
dir = getTempDir().createVirtualDir();
}
public void testCreationOfContentRootWithFile() {
VirtualFile root = createChildDirectory(dir, "root");
String url = root.getUrl();
PsiTestUtil.addContentRoot(myModule, root);
assertEquals(root, findContentEntry(url).getFile());
delete(root);
assertNotNull(findContentEntry(url));
root = createChildDirectory(dir, "root");
assertEquals(root, findContentEntry(url).getFile());
}
public void testCreationOfContentRootWithUrl() {
VirtualFile root = createChildDirectory(dir, "root");
String url = root.getUrl();
String path = root.getPath();
delete(root);
addContentRoot(path);
assertNotNull(findContentEntry(url));
root = createChildDirectory(dir, "root");
assertEquals(root, findContentEntry(url).getFile());
}
public void testCreationOfContentRootWithUrlWhenFileExists() {
VirtualFile root = createChildDirectory(dir, "root");
addContentRoot(root.getPath());
assertEquals(root, findContentEntry(root.getUrl()).getFile());
}
public void testExcludePatternSerialization() throws Exception {
PsiTestUtil.addContentRoot(myModule, dir);
ModuleRootModificationUtil.updateModel(myModule, model -> findContentEntry(dir.getUrl(), model).addExcludePattern("exc"));
StoreUtil.saveDocumentsAndProjectSettings(myProject);
Element root = JDOMUtil.load(myModule.getModuleNioFile());
String elementText = "\n" +
" \n" +
"";
assertEquals(elementText, JDOMUtil.writeElement(root.getChild("component").getChild("content")));
}
public void testExcludePatternDeserialization() throws Exception {
Path dir = getTempDir().createDir();
String dirUrl = VfsUtilCore.pathToUrl(dir.toString());
Path iml = dir.resolve("module.iml");
PathKt.write(
iml,
"\n" +
"\n" +
" \n" +
" \n" +
" \n" +
" \n" +
" \n" +
"");
Module module = WriteAction.computeAndWait(() -> ModuleManager.getInstance(myProject).loadModule(iml));
assertEquals("exc", assertOneElement(findContentEntry(dirUrl, ModuleRootManager.getInstance(module)).getExcludePatterns()));
}
private ContentEntry findContentEntry(String url) {
return findContentEntry(url, getRootManager());
}
private static ContentEntry findContentEntry(String url, ModuleRootModel m) {
for (ContentEntry e : m.getContentEntries()) {
if (e.getUrl().equals(url)) return e;
}
return null;
}
private void addContentRoot(final String path) {
ModuleRootModificationUtil.addContentRoot(getModule(), path);
}
private ModuleRootManager getRootManager() {
return ModuleRootManager.getInstance(myModule);
}
}