// This product is provided under the terms of EPL (Eclipse Public License)
// version 1.0.
//
// The full license text can be read from: http://www.eclipse.org/org/documents/epl-v10.php
package org.dtangler.swingui.mainview.impl;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.swing.JList;
import org.dtangler.core.configuration.Arguments;
import org.dtangler.core.dependencies.Dependable;
import org.dtangler.core.dependencies.Dependencies;
import org.dtangler.core.dependencies.TestDependable;
import org.dtangler.core.dependencies.TestScope;
import org.dtangler.core.dependencyengine.DependencyEngine;
import org.dtangler.core.dependencyengine.DependencyEngineFactory;
import org.dtangler.core.dependencyengine.MockDependencyEngine;
import org.dtangler.swingui.dsm.DsmViewFactory;
import org.dtangler.swingui.dsm.impl.DsmViewFactoryImpl;
import org.dtangler.swingui.fileinput.FileInputSelection;
import org.dtangler.swingui.windowmanager.MockDialogManager;
import org.dtangler.swingui.windowmanager.MockWindowManager;
import org.junit.Before;
import org.junit.Test;
import org.uispec4j.ListBox;
public class MiscFeatureTest {
private MainViewDriver view;
private MockFileInputSelector fileInputSelector;
private MockRulesSelector rulesSelector;
private MockWindowManager windowManager;
private MockAboutInfoDisplayer aboutInfoDisplayer;
private Arguments arguments;
private MockFileSelector fileSelector;
private MockDialogManager dialogManager;
private MockDependencyEngine dependencyEngine;
private DependencyEngineFactory dependencyEngineFactory;
@Before
public void setUp() {
rulesSelector = new MockRulesSelector();
DsmViewFactory dsmViewFactory = new DsmViewFactoryImpl();
fileInputSelector = new MockFileInputSelector();
windowManager = new MockWindowManager();
aboutInfoDisplayer = new MockAboutInfoDisplayer();
fileSelector = new MockFileSelector();
dialogManager = new MockDialogManager();
arguments = new Arguments();
arguments.setInput(Arrays.asList("path1", "path2"));
arguments.setConfigFileName("original.properties");
dependencyEngine = new MockDependencyEngine0();
dependencyEngineFactory = new DependencyEngineFactory(dependencyEngine);
new MainViewFactoryImpl(dsmViewFactory, fileInputSelector,
rulesSelector, fileSelector, windowManager, aboutInfoDisplayer,
dialogManager, dependencyEngineFactory).openMainView(arguments);
view = new MainViewDriver(windowManager.getLastShownView());
}
private class MockDependencyEngine0 extends MockDependencyEngine {
public ArgumentsMatch getArgumentsMatchThisEngine(Arguments arguments) {
for (String path : arguments.getInput()) {
if (!path.toLowerCase().endsWith(".mock1")
&& !path.toLowerCase().endsWith(".mock2"))
return DependencyEngine.ArgumentsMatch.yes;
}
return ArgumentsMatch.no;
}
}
private class MockDependencyEngine1 extends MockDependencyEngine {
public ArgumentsMatch getArgumentsMatchThisEngine(Arguments arguments) {
for (String path : arguments.getInput()) {
if (path.toLowerCase().endsWith(".mock1"))
return DependencyEngine.ArgumentsMatch.yes;
}
return ArgumentsMatch.no;
}
}
private class MockDependencyEngine2 extends MockDependencyEngine {
public ArgumentsMatch getArgumentsMatchThisEngine(Arguments arguments) {
for (String path : arguments.getInput()) {
if (path.toLowerCase().endsWith(".mock2"))
return DependencyEngine.ArgumentsMatch.yes;
}
return ArgumentsMatch.no;
}
}
@Test
public void testGetFileInputSelection() {
FileInputSelection newInput = new FileInputSelection(dependencyEngine
.getDependencyEngineId(), Arrays.asList("path3", "path4"),
Collections.EMPTY_LIST);
fileInputSelector.setInputToReturn(newInput);
view.inputButton.click();
assertEquals(Arrays.asList("path3", "path4"), arguments.getInput());
assertEquals(Arrays.asList("path1", "path2"), fileInputSelector
.getLastUsedDefaultInput().getPaths());
view.inputButton.click();
assertEquals(newInput.getPaths(), fileInputSelector
.getLastUsedDefaultInput().getPaths());
}
@Test
public void testGetFileInputSelectionCancelled() {
fileInputSelector.setInputToReturn(null);
view.inputButton.click();
assertEquals(Arrays.asList("path1", "path2"), fileInputSelector
.getLastUsedDefaultInput().getPaths());
assertEquals("DTangler DsmUI - original.properties", view.getTitle());
view.inputButton.click();
assertEquals(Arrays.asList("path1", "path2"), fileInputSelector
.getLastUsedDefaultInput().getPaths());
}
private Dependencies getMockDependencies(int numberOfDependencies) {
Dependencies dependencies = new Dependencies();
for (int i = 1; i <= numberOfDependencies; i++) {
TestDependable dependant = new TestDependable("dependant" + i);
TestDependable dependee = new TestDependable("dependee" + i);
dependencies.addDependencies(dependant, createMap(dependee));
}
return dependencies;
}
@Test
public void testDependencyEngineSelection() {
List<String> originalInput = arguments.getInput();
MockDependencyEngine1 engine1 = new MockDependencyEngine1();
Dependencies dependenciesEngine1 = getMockDependencies(10);
engine1.setDependencies(dependenciesEngine1);
dependencyEngineFactory.addDependencyEngine("mock1", engine1);
MockDependencyEngine2 engine2 = new MockDependencyEngine2();
Dependencies dependenciesEngine2 = getMockDependencies(11);
engine2.setDependencies(dependenciesEngine2);
dependencyEngineFactory.addDependencyEngine("mock2", engine2);
DependencyEngine dependencyEngineMock = null;
arguments.setInput(Arrays.asList("test.mock1"));
dependencyEngineMock = dependencyEngineFactory
.getDependencyEngine(arguments);
assertEquals(dependencyEngineMock.getClass().getName(), engine1
.getClass().getName());
view.refreshBtn.click();
assertEquals(20, view.dsm.getRowCount());
arguments.setInput(Arrays.asList("test.mock2"));
dependencyEngineMock = dependencyEngineFactory
.getDependencyEngine(arguments);
assertEquals(dependencyEngineMock.getClass().getName(), engine2
.getClass().getName());
view.refreshBtn.click();
assertEquals(22, view.dsm.getRowCount());
arguments.setInput(originalInput);
}
@Test
public void testRules() {
view.rulesButton.click();
assertTrue(rulesSelector.wereRulesSelected());
}
@Test
public void testSimpleDsmWithoutViolations() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
TestDependable foo = new TestDependable("foo");
TestDependable bar = new TestDependable("bar");
TestDependable bay = new TestDependable("bay");
dependencies.addDependencies(foo, createMap(bar, bay));
dependencies.addDependencies(bar, createMap(bay));
view.refreshBtn.click();
assertEquals(3, view.dsm.getRowCount());
assertTrue(view.allViolations.contentEquals(new String[] {}).isTrue());
}
@Test
public void testSimpleDsmWitViolation() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
TestDependable foo = new TestDependable("foo");
TestDependable bar = new TestDependable("bar");
TestDependable bay = new TestDependable("bay");
dependencies.addDependencies(foo, createMap(bar, bay));
dependencies.addDependencies(bar, createMap(foo));
dependencies.addDependencies(bay, createMap(foo));
view.refreshBtn.click();
assertEquals(3, view.dsm.getRowCount());
assertEquals(2, view.allViolations.getSize());
}
@Test
public void testSimpleDsmWitViolationOutsideScope() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
TestDependable foo = new TestDependable("foo", TestScope.scope1);
TestDependable bar = new TestDependable("bar", TestScope.scope1);
TestDependable fooA = new TestDependable("fooA", TestScope.scope2);
TestDependable fooB = new TestDependable("fooB", TestScope.scope2);
dependencies.addDependencies(foo, createMap(bar));
dependencies.addDependencies(bar, createMap(foo));
dependencies.addDependencies(fooA, createMap(fooB));
dependencies.addDependencies(fooB, createMap(fooA));
view.refreshBtn.click();
assertEquals(2, view.dsm.getRowCount());
assertEquals(1, view.allViolations.getSize());
}
@Test
public void testShowViolationsOfSelectedCells() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
TestDependable foo = new TestDependable("foo");
TestDependable bar = new TestDependable("bar");
TestDependable bay = new TestDependable("bay");
dependencies.addDependencies(foo, createMap(bar, bay));
dependencies.addDependencies(bar, createMap(foo));
dependencies.addDependencies(bay, createMap(foo));
// increasing depweights
dependencies.addDependencies(foo, createMap(new TestDependable("x1"),
new TestDependable("x2"), new TestDependable("x3")));
dependencies.addDependencies(bar, createMap(new TestDependable("x1")));
view.refreshBtn.click();
assertEquals(0, view.cellViolations.getSize());
view.dsm.selectCell(1, 1);
assertTrue(view.cellViolations.contentEquals(
new String[] { "Cycle: foo-->bar-->foo" }).isTrue());
view.dsm.selectCell(1, 2);
assertTrue(view.cellViolations.contentEquals(
new String[] { "Cycle: foo-->bay-->foo" }).isTrue());
view.dsm.selectBlock(1, 1, 3, 1);
assertTrue(view.cellViolations.contentEquals(
new String[] { "Cycle: foo-->bar-->foo",
"Cycle: foo-->bay-->foo" }).isTrue());
}
@Test
public void testShowChildViolationsOfSelectedRow() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
TestDependable x = new TestDependable("x", TestScope.scope2);
TestDependable y = new TestDependable("y", TestScope.scope2);
TestDependable foo = new TestDependable("foo", TestScope.scope1);
TestDependable bar = new TestDependable("bar", TestScope.scope1);
dependencies.addDependencies(x, createMap(y));
dependencies.addDependencies(y, createMap(x));
dependencies.addChild(foo, x);
dependencies.addChild(foo, y);
dependencies.addDependencies(foo, createMap(bar));
view.refreshBtn.click();
assertEquals(1, view.allViolations.getSize());
assertEquals(0, view.cellViolations.getSize());
view.dsm.selectCell(0, 0);
assertTrue(getValue(view.cellViolations, 0).startsWith(
"foo contains a violation: Cycle: "));
view.dsm.selectCell(1, 0);
assertTrue(getValue(view.cellViolations, 0).startsWith(
"foo contains a violation: Cycle: "));
view.dsm.selectCell(0, 1);
assertEquals(0, view.cellViolations.getSize());
view.dsm.selectCell(1, 1);
assertTrue(getValue(view.cellViolations, 0).startsWith(
"foo contains a violation: Cycle: "));
view.dsm.selectBlock(0, 0, 1, 1);
assertTrue(getValue(view.cellViolations, 0).startsWith(
"foo contains a violation: Cycle: "));
}
// FIXME: move this to driver
private String getValue(ListBox list, int index) {
JList jList = (JList) list.getAwtComponent();
return (String) jList.getModel().getElementAt(index);
}
@Test
public void testScopeSelectionContent() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
dependencies.addChild(new TestDependable("foo", TestScope.scope2),
new TestDependable("bar", TestScope.scope2));
view.refreshBtn.click();
assertTrue(view.scope.contentEquals(new String[] { "scope2" }).isTrue());
dependencies.addChild(new TestDependable("foo", TestScope.scope3),
new TestDependable("bar", TestScope.scope1));
view.refreshBtn.click();
assertTrue(view.scope.contentEquals(
new String[] { "scope1", "scope2", "scope3" }).isTrue());
}
@Test
public void testScopeIsSetToDefaultIfNoScopeSelectedUponRefresh() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
dependencies.addChild(new TestDependable("foo", TestScope.scope1),
new TestDependable("bar", TestScope.scope2));
dependencyEngine.getDependencies(arguments).setDefaultScope(TestScope.scope2);
assertTrue(view.scope.selectionEquals(null).isTrue());
view.refreshBtn.click();
assertTrue(view.scope.selectionEquals("scope2").isTrue());
}
@Test
public void testScopeRemainsUnchangedIfSetUponRefresh() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
dependencies.addChild(new TestDependable("foo", TestScope.scope1),
new TestDependable("bar", TestScope.scope2));
dependencyEngine.getDependencies(arguments).setDefaultScope(TestScope.scope2);
view.refreshBtn.click();
view.scope.select("scope1");
view.refreshBtn.click();
assertTrue(view.scope.selectionEquals("scope1").isTrue());
}
@Test
public void testScopeIsSetToHighestAvailableScopeWhenDefaultScopeUnavailable() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
dependencies.addChild(new TestDependable("foo", TestScope.scope2),
new TestDependable("bar", TestScope.scope3));
dependencyEngine.getDependencies(arguments).setDefaultScope(TestScope.scope1);
view.refreshBtn.click();
assertTrue(view.scope.selectionEquals("scope2").isTrue());
}
@Test
public void testChangeScope() {
TestDependable a1 = new TestDependable("foo1", TestScope.scope2);
TestDependable a2 = new TestDependable("foo2", TestScope.scope2);
TestDependable a3 = new TestDependable("foo3", TestScope.scope2);
TestDependable b1 = new TestDependable("bar1", TestScope.scope1);
TestDependable b2 = new TestDependable("bar2", TestScope.scope1);
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
dependencies.addDependencies(a1, createMap(a2, a3));
dependencies.addDependencies(a2, createMap(a3));
dependencies.addChild(b1, a1);
dependencies.addChild(b1, a2);
dependencies.addChild(b2, a3);
view.refreshBtn.click();
assertTrue(view.scope.selectionEquals("scope1").isTrue());
assertEquals(2, view.dsm.getRowCount());
System.out.println(view.dsm.getCellText(0, 0));
assertTrue(view.dsm.getCellText(0, 0).contains("bar"));
view.scope.select("scope2");
assertEquals(3, view.dsm.getRowCount());
assertTrue(view.dsm.getCellText(0, 0).contains("foo"));
}
@Test
public void testAnalysisResultIsUpdatedWhenRefreshing() {
dependencyEngine.setDependencies(new Dependencies());
view.refreshBtn.click();
int violationsBefore = view.allViolations.getSize();
dependencyEngine.setDependencies(createCyclicDependencies());
view.refreshBtn.click();
int violationsAfter = view.allViolations.getSize();
assertEquals(0, violationsBefore);
assertEquals(1, violationsAfter);
}
@Test
public void testAnalysisResultIsNotUpdatedWhenNavigating() {
dependencyEngine.setDependencies(createCyclicDependencies());
view.refreshBtn.click();
dependencyEngine.setDependencies(createDirectDependencies());
view.scope.select("scope3");
view.dsm.selectBlock(0, 0, 1, 1);
view.zoomOutButton.click();
view.dsm.selectBlock(0, 0, 1, 1);
view.zoomInButton.click();
assertEquals(1, view.allViolations.getSize());
}
private Dependencies createDirectDependencies() {
TestDependable a1 = new TestDependable("a1", TestScope.scope2);
TestDependable a2 = new TestDependable("a2", TestScope.scope2);
TestDependable b1 = new TestDependable("b1", TestScope.scope3);
TestDependable b2 = new TestDependable("b2", TestScope.scope3);
Dependencies dependencies = new Dependencies();
dependencies.addDependencies(a1, createMap(a2));
dependencies.addChild(a1, b1);
dependencies.addChild(a2, b2);
return dependencies;
}
private Dependencies createCyclicDependencies() {
TestDependable a1 = new TestDependable("cycleParent1", TestScope.scope2);
TestDependable a2 = new TestDependable("cycleParent2", TestScope.scope2);
TestDependable b1 = new TestDependable("cycle1", TestScope.scope3);
TestDependable b2 = new TestDependable("cycle2", TestScope.scope3);
Dependencies dependencies = new Dependencies();
dependencies.addDependencies(a1, createMap(a2));
dependencies.addDependencies(a2, createMap(a1));
dependencies.addDependencies(b1, createMap(b2));
dependencies.addDependencies(b2, createMap(b1));
dependencies.addChild(a1, b1);
dependencies.addChild(a2, b2);
return dependencies;
}
@Test
public void testZoomInIsDisabledWhenNoDependenciesAreSelected() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
dependencies.addChild(new TestDependable("foo", TestScope.scope1),
new TestDependable("bar", TestScope.scope2));
view.refreshBtn.click();
assertTrue(view.dsm.getPopup() != null);
assertTrue(view.dsm.getPopup().getSubMenu(SwingMainView.menuItemZoomInNameHeader) != null);
assertFalse(view.dsm.getPopup().getSubMenu(SwingMainView.menuItemZoomInNameHeader).isEnabled()
.isTrue());
view.dsm.selectCell(1, 0);
assertTrue(view.dsm.getPopup().getSubMenu(SwingMainView.menuItemZoomInNameHeader).isEnabled()
.isTrue());
}
@Test
public void testZoomAndOutAreDisabledWhenNoNextLevelAvailable() {
Dependencies dependencies = new Dependencies();
dependencyEngine.setDependencies(dependencies);
dependencies.addChild(new TestDependable("foo", TestScope.scope1),
new TestDependable("bar", TestScope.scope2));
view.refreshBtn.click();
view.dsm.selectCell(1, 0);
assertTrue(view.dsm.getPopup().getSubMenu("Zoom in").isEnabled()
.isTrue());
assertFalse(view.dsm.getPopup().getSubMenu("Zoom out").isEnabled()
.isTrue());
view.scope.select("scope2");
view.dsm.selectCell(1, 0);
assertFalse(view.dsm.getPopup().getSubMenu("Zoom in").isEnabled()
.isTrue());
assertTrue(view.dsm.getPopup().getSubMenu("Zoom out").isEnabled()
.isTrue());
}
private Map<Dependable, Integer> createMap(Dependable... items) {
Map<Dependable, Integer> result = new HashMap();
for (Dependable item : items) {
result.put(item, 1);
}
return result;
}
}