/*
* Copyright (c) 2007-2009, Osmorc Development Team
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
* * Redistributions of source code must retain the above copyright notice, this list
* of conditions and the following disclaimer.
* * Redistributions in binary form must reproduce the above copyright notice, this
* list of conditions and the following disclaimer in the documentation and/or other
* materials provided with the distribution.
* * Neither the name of 'Osmorc Development Team' nor the names of its contributors may be
* used to endorse or promote products derived from this software without specific
* prior written permission.
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
* TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
package org.osmorc.frameworkintegration;
import com.intellij.openapi.application.Application;
import com.intellij.openapi.application.ApplicationManager;
import com.intellij.openapi.components.ServiceManager;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleManager;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.roots.LibraryOrderEntry;
import com.intellij.openapi.roots.ModuleRootManager;
import com.intellij.openapi.roots.OrderEntry;
import com.intellij.openapi.roots.libraries.Library;
import com.intellij.openapi.roots.libraries.LibraryTable;
import com.intellij.openapi.roots.libraries.LibraryTablesRegistrar;
import com.intellij.testFramework.builders.JavaModuleFixtureBuilder;
import com.intellij.testFramework.fixtures.*;
import org.easymock.classextension.EasyMock;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.osmorc.SwingRunner;
import org.osmorc.facet.OsmorcFacetUtil;
import org.osmorc.settings.ProjectSettings;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static org.easymock.EasyMock.*;
import static org.hamcrest.Matchers.*;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* @author Robert F. Beeger (robert@beeger.net)
*/
@SuppressWarnings({"ConstantConditions"})
@RunWith(SwingRunner.class)
public class FrameworkInstanceModuleManagerTest {
private Module module;
private TempDirTestFixture myTempDirFixture;
private OsmorcFacetUtil osmorcFacetUtil;
@Before
public void setUp() throws Exception {
TestFixtureBuilder<IdeaProjectTestFixture> fixtureBuilder =
JavaTestFixtureFactory.createFixtureBuilder();
final JavaModuleFixtureBuilder moduleBuilder = fixtureBuilder.addModule(JavaModuleFixtureBuilder.class);
myTempDirFixture = IdeaTestFixtureFactory.getFixtureFactory().createTempDirTestFixture();
myTempDirFixture.setUp();
moduleBuilder.addContentRoot(myTempDirFixture.getTempDirPath());
fixture = fixtureBuilder.getFixture();
fixture.setUp();
osmorcFacetUtil = createMock(OsmorcFacetUtil.class);
Application application = ApplicationManager.getApplication();
projectSettings = new ProjectSettings();
testObject = new FrameworkInstanceModuleManager(ServiceManager.getService(LibraryHandler.class), projectSettings,
application, fixture.getProject(),
ModuleManager.getInstance(fixture.getProject()), osmorcFacetUtil);
project = fixture.getProject();
module = fixture.getModule();
application.runWriteAction(new Runnable() {
public void run() {
LibraryTable.ModifiableModel modifiableModel =
LibraryTablesRegistrar.getInstance().getLibraryTable().getModifiableModel();
libraryA1 = modifiableModel.createLibrary("Osmorc/an Instance/libA1_1.0.0");
libraryA2 = modifiableModel.createLibrary("Osmorc/an Instance/libA2_1.0.0");
libraryB1 = modifiableModel.createLibrary("Osmorc/another Instance/libB1_1.0.0");
libraryB2 = modifiableModel.createLibrary("Osmorc/another Instance/libB2_1.0.0");
libraryB3 = modifiableModel.createLibrary("Osmorc/another Instance/libB3_1.0.0");
modifiableModel.commit();
}
});
}
@After
public void tearDown() throws Exception {
fixture.tearDown();
}
@Test
public void testUpdateFrameworkInstanceModuleCreatesAndUpdatesModule() {
expect(osmorcFacetUtil.hasOsmorcFacet(EasyMock.not(same(module)))).andReturn(false).anyTimes();
expect(osmorcFacetUtil.hasOsmorcFacet(same(module))).andReturn(true).times(2);
replay(osmorcFacetUtil);
projectSettings.setCreateFrameworkInstanceModule(true);
projectSettings.setFrameworkInstanceName("an Instance");
testObject.updateFrameworkInstanceModule();
Module module = ModuleManager.getInstance(project)
.findModuleByName(FrameworkInstanceModuleManager.FRAMEWORK_INSTANCE_MODULE_NAME);
OrderEntry[] orderEntries = ModuleRootManager.getInstance(module).getOrderEntries();
assertContainsOnlyGivenLibraries(orderEntries, libraryA1, libraryA2);
projectSettings.setFrameworkInstanceName("another Instance");
testObject.updateFrameworkInstanceModule();
orderEntries = ModuleRootManager.getInstance(module).getOrderEntries();
assertContainsOnlyGivenLibraries(orderEntries, libraryB1, libraryB2, libraryB3);
projectSettings.setCreateFrameworkInstanceModule(false);
projectSettings.setFrameworkInstanceName("an Instance");
testObject.updateFrameworkInstanceModule();
module = ModuleManager.getInstance(project)
.findModuleByName(FrameworkInstanceModuleManager.FRAMEWORK_INSTANCE_MODULE_NAME);
assertThat(module, nullValue());
verify(osmorcFacetUtil);
}
@Test
public void testUpdateFrameworkInstanceModuleDoesntCreateModule() {
expect(osmorcFacetUtil.hasOsmorcFacet(EasyMock.not(same(module)))).andReturn(false).anyTimes();
expect(osmorcFacetUtil.hasOsmorcFacet(same(module))).andReturn(false).once();
replay(osmorcFacetUtil);
projectSettings.setCreateFrameworkInstanceModule(true);
projectSettings.setFrameworkInstanceName("an Instance");
testObject.updateFrameworkInstanceModule();
Module module = ModuleManager.getInstance(project)
.findModuleByName(FrameworkInstanceModuleManager.FRAMEWORK_INSTANCE_MODULE_NAME);
assertThat(module, nullValue());
verify(osmorcFacetUtil);
}
@Test
public void testUpdateFrameworkInstanceModuleRemovesModule() {
expect(osmorcFacetUtil.hasOsmorcFacet(EasyMock.not(same(module)))).andReturn(false).anyTimes();
expect(osmorcFacetUtil.hasOsmorcFacet(same(module))).andReturn(true).once();
expect(osmorcFacetUtil.hasOsmorcFacet(same(module))).andReturn(false).once();
replay(osmorcFacetUtil);
projectSettings.setCreateFrameworkInstanceModule(true);
projectSettings.setFrameworkInstanceName("an Instance");
testObject.updateFrameworkInstanceModule();
module = ModuleManager.getInstance(project)
.findModuleByName(FrameworkInstanceModuleManager.FRAMEWORK_INSTANCE_MODULE_NAME);
assertThat(module, notNullValue());
testObject.updateFrameworkInstanceModule();
Module module = ModuleManager.getInstance(project)
.findModuleByName(FrameworkInstanceModuleManager.FRAMEWORK_INSTANCE_MODULE_NAME);
assertThat(module, nullValue());
verify(osmorcFacetUtil);
}
public void assertContainsOnlyGivenLibraries(OrderEntry[] orderEntries, Library... libraries) {
List<Library> libs = new ArrayList<Library>(Arrays.asList(libraries));
int findCount = 0;
for (OrderEntry orderEntry : orderEntries) {
if (orderEntry instanceof LibraryOrderEntry) {
assertTrue(libs.remove(((LibraryOrderEntry) orderEntry).getLibrary()));
findCount++;
}
}
assertThat(libraries.length, equalTo(findCount));
}
private IdeaProjectTestFixture fixture;
private FrameworkInstanceModuleManager testObject;
private Project project;
private Library libraryA1;
private Library libraryA2;
private Library libraryB1;
private Library libraryB2;
private Library libraryB3;
private ProjectSettings projectSettings;
}