package com.intellij.flex.bc;
import com.intellij.flex.util.FlexTestUtils;
import com.intellij.javascript.flex.css.FlexStylesIndexableSetContributor;
import com.intellij.lang.javascript.flex.FlexModuleType;
import com.intellij.lang.javascript.flex.library.FlexLibraryProperties;
import com.intellij.lang.javascript.flex.library.FlexLibraryType;
import com.intellij.lang.javascript.flex.projectStructure.model.FlexBuildConfigurationManager;
import com.intellij.lang.javascript.flex.projectStructure.model.ModifiableBuildConfigurationEntry;
import com.intellij.lang.javascript.flex.projectStructure.model.ModifiableFlexBuildConfiguration;
import com.intellij.lang.javascript.flex.projectStructure.model.ModifiableModuleLibraryEntry;
import com.intellij.lang.javascript.flex.projectStructure.model.impl.FlexProjectConfigurationEditor;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleType;
import com.intellij.openapi.options.ConfigurationException;
import com.intellij.openapi.projectRoots.Sdk;
import com.intellij.openapi.roots.*;
import com.intellij.openapi.roots.impl.libraries.LibraryEx;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.util.Disposer;
import com.intellij.openapi.vfs.newvfs.impl.VfsRootAccess;
import com.intellij.testFramework.ModuleTestCase;
import com.intellij.util.containers.ContainerUtil;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.UUID;
import static com.intellij.openapi.vfs.VfsUtilCore.convertFromUrl;
import static com.intellij.openapi.vfs.VfsUtilCore.urlToPath;
public class FlexProjectConfigTest extends ModuleTestCase {
@Override
protected void tearDown() throws Exception {
Disposer.dispose(getTestRootDisposable());
super.tearDown();
}
@Override
public void setUp() throws Exception {
VfsRootAccess.allowRootAccess(getTestRootDisposable(),
urlToPath(convertFromUrl(FlexStylesIndexableSetContributor.class.getResource("FlexStyles.as"))));
super.setUp();
}
@Override
protected ModuleType getModuleType() {
return FlexModuleType.getInstance();
}
public void testModuleLibrary() throws ConfigurationException {
assertEquals(1, FlexBuildConfigurationManager.getInstance(myModule).getBuildConfigurations().length);
final String libraryId = createModuleLibrary();
FlexTestUtils.modifyConfigs(myProject, configEditor -> {
ModifiableFlexBuildConfiguration[] configurations = configEditor.getConfigurations(myModule);
assertEquals(1, configurations.length);
ModifiableFlexBuildConfiguration c = configurations[0];
configEditor.createModuleLibraryEntry(c.getDependencies(), libraryId);
});
OrderEntry libraryEntry = findLibraryEntry(myModule, libraryId);
assertNull(libraryEntry);
}
public void testModuleLibrary2() throws ConfigurationException {
assertEquals(1, FlexBuildConfigurationManager.getInstance(myModule).getBuildConfigurations().length);
final String libraryId = createModuleLibrary();
FlexTestUtils.modifyConfigs(myProject, configEditor -> {
ModifiableFlexBuildConfiguration[] configurations = configEditor.getConfigurations(myModule);
assertEquals(1, configurations.length);
ModifiableFlexBuildConfiguration c = configurations[0];
final ModifiableModuleLibraryEntry e = configEditor.createModuleLibraryEntry(c.getDependencies(), libraryId);
c.getDependencies().getModifiableEntries().add(e);
});
OrderEntry libraryEntry = findLibraryEntry(myModule, libraryId);
assertNotNull(libraryEntry);
}
public void testBcDependency() throws ConfigurationException {
final Module module2 = createModule("module2");
assertFalse(doesDepend(myModule, module2));
assertFalse(doesDepend(module2, myModule));
FlexTestUtils.modifyConfigs(myProject, editor -> {
ModifiableFlexBuildConfiguration module1Config = editor.getConfigurations(myModule)[0];
ModifiableFlexBuildConfiguration module2Config = editor.getConfigurations(module2)[0];
ModifiableBuildConfigurationEntry entry = editor.createBcEntry(module1Config.getDependencies(), module2Config, null);
editor.setEntries(module1Config.getDependencies(), Collections.singletonList(entry));
});
assertTrue(doesDepend(myModule, module2));
assertFalse(doesDepend(module2, myModule));
FlexTestUtils.modifyConfigs(myProject, editor -> {
ModifiableFlexBuildConfiguration module1Config = editor.getConfigurations(myModule)[0];
editor.setEntries(module1Config.getDependencies(), new ArrayList<>());
});
assertFalse(doesDepend(myModule, module2));
assertFalse(doesDepend(module2, myModule));
final Module module3 = createModule("module3");
final Module module4 = createModule("module4");
FlexTestUtils.modifyConfigs(myProject, editor -> {
ModifiableFlexBuildConfiguration m1bc1 = editor.getConfigurations(myModule)[0];
ModifiableFlexBuildConfiguration m1bc2 = createConfiguration(editor, myModule);
ModifiableFlexBuildConfiguration m1bc3 = createConfiguration(editor, myModule);
ModifiableFlexBuildConfiguration m1bc4 = createConfiguration(editor, myModule);
ModifiableFlexBuildConfiguration m2bc1 = editor.getConfigurations(module2)[0];
ModifiableFlexBuildConfiguration m3bc1 = editor.getConfigurations(module3)[0];
ModifiableFlexBuildConfiguration m2bc2 = createConfiguration(editor, module2);
ModifiableBuildConfigurationEntry e1 = editor.createBcEntry(m1bc1.getDependencies(), m2bc1, null);
editor.setEntries(m1bc1.getDependencies(), Collections.singletonList(e1));
ModifiableBuildConfigurationEntry e2 = editor.createBcEntry(m1bc2.getDependencies(), m2bc2, null);
ModifiableBuildConfigurationEntry e3 = editor.createBcEntry(m1bc2.getDependencies(), m3bc1, null);
editor.setEntries(m1bc1.getDependencies(), Arrays.asList(e2, e3));
});
assertTrue(doesDepend(myModule, module2));
assertTrue(doesDepend(myModule, module3));
assertFalse(doesDepend(myModule, module4));
}
public void testSdkListener() {
final Sdk sdk = FlexTestUtils.createSdk(FlexTestUtils.getPathToMockFlex(getClass(), getTestName(false)), "4.6.0");
RootProvider.RootSetChangedListener listener = wrapper -> {
};
// See IDEA-140175: if different BCs of the same module have different SDKs then the listener may be first set by FlexCompositeSdk (when
// 'multi-SDK module is being loaded) and then the same listener via standard way (when loading the next Flash module with a single BC)
sdk.getRootProvider().addRootSetChangedListener(listener);
sdk.getRootProvider().addRootSetChangedListener(listener);
}
private static ModifiableFlexBuildConfiguration createConfiguration(FlexProjectConfigurationEditor editor, Module module) {
int i = 1;
String name = "Config";
while (true) {
boolean found = false;
for (ModifiableFlexBuildConfiguration configuration : editor.getConfigurations(module)) {
if (configuration.getName().equals(name = "Config " + String.valueOf(i))) {
found = true;
break;
}
}
if (found) {
i++;
}
else {
break;
}
}
ModifiableFlexBuildConfiguration c = editor.createConfiguration(module);
c.setName(name);
return c;
}
private static boolean doesDepend(Module dependant, final Module dependency) {
return !ContainerUtil.process(ModuleRootManager.getInstance(dependant).getOrderEntries(),
orderEntry -> !(orderEntry instanceof ModuleOrderEntry) ||
((ModuleOrderEntry)orderEntry).getModule() != dependency);
}
@Nullable
private static OrderEntry findLibraryEntry(Module module, final String libraryId) {
return ContainerUtil.find(ModuleRootManager.getInstance(module).getOrderEntries(), orderEntry -> {
if (!(orderEntry instanceof LibraryOrderEntry)) {
return false;
}
Library library = ((LibraryOrderEntry)orderEntry).getLibrary();
if (!(library instanceof LibraryEx)) {
return false;
}
return libraryId == ((FlexLibraryProperties)((LibraryEx)library).getProperties()).getId();
});
}
private String createModuleLibrary() {
final ModifiableRootModel modifiableModel = ModuleRootManager.getInstance(myModule).getModifiableModel();
final LibraryTable.ModifiableModel libraryTable = modifiableModel.getModuleLibraryTable().getModifiableModel();
LibraryEx library = (LibraryEx)libraryTable.createLibrary("test", FlexLibraryType.FLEX_LIBRARY);
String libraryId = UUID.randomUUID().toString();
((FlexLibraryProperties)library.getProperties()).setId(libraryId);
ApplicationManager.getApplication().runWriteAction(() -> {
libraryTable.commit();
modifiableModel.commit();
});
return libraryId;
}
}