blob: 388d6ab1b7d7d5f6ee417501ec65ee838657c0de [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2010, 2019 Mia-Software and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v2.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v20.html
*
* Contributors:
* Nicolas Bros (Mia-Software)
*******************************************************************************/
package org.eclipse.modisco.infra.browser.tests;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.modisco.facet.util.tests.swtbot.internal.exported.SWTBotUtils;
import org.eclipse.modisco.infra.browser.MoDiscoBrowserPlugin;
import org.eclipse.modisco.infra.browser.editors.EcoreBrowser;
import org.eclipse.modisco.infra.browser.editors.MetaclassViewer;
import org.eclipse.modisco.infra.browser.preferences.PreferenceConstants;
import org.eclipse.modisco.infra.browser.tests.project.WorkspaceSetup;
import org.eclipse.modisco.infra.browser.tests.utils.TestUtils;
import org.eclipse.modisco.infra.browser.uicore.internal.model.BigListItem;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.Tree;
import org.eclipse.swtbot.eclipse.finder.SWTWorkbenchBot;
import org.eclipse.swtbot.eclipse.finder.widgets.SWTBotEditor;
import org.eclipse.swtbot.swt.finder.utils.SWTBotPreferences;
import org.eclipse.swtbot.swt.finder.utils.TableCollection;
import org.eclipse.swtbot.swt.finder.waits.DefaultCondition;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTree;
import org.eclipse.swtbot.swt.finder.widgets.SWTBotTreeItem;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
/**
* Tests about metaclasses and the metaclass pane.
*/
@Ignore //cf. https://bugs.eclipse.org/bugs/show_bug.cgi?id=359257
@SuppressWarnings("restriction")
@RunWith(Parameterized.class)
public class TestMetaclasses {
private static SWTWorkbenchBot fBot = new SWTWorkbenchBot();
/** parameterized model filename */
private final String modelFilename;
/** The main tree (instances) */
private static SWTBotTree fTree;
/** The metaclass tree */
private static SWTBotTree metaclassTree;
static {
// System.setProperty("org.eclipse.swtbot.search.timeout", "1000");
// System.setProperty("org.eclipse.swtbot.playback.delay", "200");
}
@BeforeClass
public static void init0() throws IOException {
SWTBotPreferences.TIMEOUT = 20000;
WorkspaceSetup.importTestProject(TestMetaclasses.fBot);
setInfiniteReferencedResourcesLoadingDepth();
}
@Parameters
public static Collection<Object[]> modelFilenames() {
return Arrays.asList(new Object[][] { { "Company.uml" },
{ "java.ecore" } });
}
/** Constructor for the parameterized test */
public TestMetaclasses(final String modelFilename) throws Exception {
this.modelFilename = modelFilename;
}
private final boolean initialized = false;
public void init() throws Exception {
if (this.initialized) {
return;
}
TestUtils.closeAllEditors();
TestUtils.openModel(this.modelFilename);
// bot.menu("Navigate").menu("Open Resource...").click();
// bot.text().setText(modelFilename);
//
// final SWTBotTable table = bot.table();
// // see SWTBot bug 261360
// SWTBotMenu menu = UIThreadRunnable.syncExec(new Result<SWTBotMenu>()
// {
// public SWTBotMenu run() {
// return table.contextMenu("Open With").click().menu(
// "MoDisco Model Browser").click();
// }
// });
// menu.click();
// bot.table().contextMenu("Open With").menu("MoDisco Model Browser")
// .click();
// bot.button(1).click();
// bot.menu("MoDisco Model Browser").click();
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
EcoreBrowser ecoreEditor = (EcoreBrowser) editor.getReference()
.getEditor(false);
TestUtils.resetToolbarButtons(editor);
Tree treeWidget = (Tree) ecoreEditor.getViewer().getControl();
MetaclassViewer metaclassViewer = ecoreEditor.getMetaclassViewer();
Tree metaclassTreeWidget = (Tree) metaclassViewer.getViewer()
.getControl();
TestMetaclasses.fTree = new SWTBotTree(treeWidget);
TestMetaclasses.metaclassTree = new SWTBotTree(metaclassTreeWidget);
TestUtils.waitUntilLoaded();
}
/**
* Check that the "Model" metaclass is selected right after the model was
* opened
*/
@Test
public void testModelMetaclassSelectedAfterOpen() throws Exception {
// before each model parameter (for the parameterized test)
init();
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("1");
TableCollection selection = TestMetaclasses.metaclassTree.selection();
assertEquals("Only one initial metaclass should be selected", 1, selection
.rowCount());
String name = selection.get(0).get(0);
SWTBotUtils.captureScreenShot("2");
assertTrue("Model metaclass should be selected (was: " + name + ")", name
.matches("Model \\(\\d+\\)")
|| name.matches("EPackage \\(\\d+\\)"));
}
/**
* Check that the number in parentheses after the metaclass name really
* corresponds to the number of instances
*/
@Test
public void checkMetaclassCount() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotTreeItem[] allMetaclassTreeItems = TestMetaclasses.metaclassTree.getAllItems();
for (SWTBotTreeItem metaclassTreeItem : allMetaclassTreeItems) {
String text = metaclassTreeItem.getText();
// find the number in parentheses
int instanceCount = Integer.parseInt(text.substring(text
.indexOf('(') + 1, text.indexOf(')')));
metaclassTreeItem.select();
TestUtils.waitUntilRefreshed();
waitUntilLoaded(TestMetaclasses.fTree);
// check in the case when items are displayed directly (not
// partitioned)
if (instanceCount <= BigListItem.SPLIT_THRESHOLD) {
SWTBotTreeItem[] allItems = TestMetaclasses.fTree.getAllItems();
assertEquals("Wrong instance count for metaclass '" + text + "'",
instanceCount, allItems.length);
}
// items are partitioned : expand and count
else {
SWTBotTreeItem[] allItems = TestMetaclasses.fTree.getAllItems();
int count = 0;
for (int i = 0; i < allItems.length; i++) {
final SWTBotTreeItem rangeItem = allItems[i];
// only really test a few items (too time consuming
// otherwise)
if (i == 0 || i % 13 == 0 || i == allItems.length - 1) {
rangeItem.expand();
TestUtils.waitUntilRefreshed();
List<SWTBotTreeItem> children = TestUtils
.getChildren(rangeItem);
count += children.size();
TestUtils.collapse(rangeItem);
TestUtils.waitUntilRefreshed();
} else {
count += BigListItem.SPLIT_THRESHOLD;
}
}
assertEquals("Wrong instance count for metaclass '" + text + "'",
instanceCount, count);
}
}
}
private void waitUntilLoaded(final SWTBotTree tree) {
SWTWorkbenchBot bot = new SWTWorkbenchBot();
bot.waitUntil(new DefaultCondition() {
public boolean test() throws Exception {
SWTBotTreeItem[] allItems = tree.getAllItems();
for (SWTBotTreeItem treeItem : allItems) {
if ("loading...".equals(treeItem.getText())) {
return false;
}
}
return true;
}
public String getFailureMessage() {
return "Browser elements did not load";
}
}, 10000);
}
@Test
public void checkMetaclassCountWithEmptyMetaclasses() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
TestUtils.resetToolbarButtons(editor);
TestUtils.setToolbarButtonState(editor, "Show Empty Metaclasses", true);
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("2");
checkMetaclassCount();
}
@Test
public void checkMetaclassCountWithInstancesOfSubclasses() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
TestUtils.resetToolbarButtons(editor);
TestUtils.setToolbarButtonState(editor,
"Display Instances of Subclasses", true);
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("2");
checkMetaclassCount();
}
/**
* Check that metaclasses are really sorted by name when "sort by name" is
* activated.
*/
@Test
public void checkSortByName() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
TestUtils.resetToolbarButtons(editor);
final Menu menu = TestUtils.openMetaclassViewMenu(editor);
TestUtils.setViewMenuButtonState(menu, "Sort by Name", true);
TestUtils.closeMenu(menu);
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("2");
SWTBotTreeItem[] allMetaclassTreeItems = TestMetaclasses.metaclassTree.getAllItems();
String previousText = "";
String text = "";
Pattern metaclassNamePattern = Pattern.compile("(.*?) \\(\\d+\\)");
for (SWTBotTreeItem metaclassTreeItem : allMetaclassTreeItems) {
Matcher matcher = metaclassNamePattern.matcher(metaclassTreeItem.getText());
if (matcher.matches()) {
text = matcher.group(1);
} else {
fail("couldn't match: " + metaclassTreeItem.getText());
}
assertTrue("Metaclass names are not sorted '" + previousText
+ "', '" + text + "'", previousText
.compareToIgnoreCase(text) <= 0);
previousText = text;
}
}
/**
* Check that metaclasses are really sorted by count when "sort by count" is
* activated.
*/
@Test
public void checkSortByCount() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
TestUtils.resetToolbarButtons(editor);
final Menu menu = TestUtils.openMetaclassViewMenu(editor);
TestUtils.setViewMenuButtonState(menu, "Sort by Count", true);
TestUtils.closeMenu(menu);
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("2");
SWTBotTreeItem[] allMetaclassTreeItems = TestMetaclasses.metaclassTree.getAllItems();
int previousCount = 0;
int count;
for (SWTBotTreeItem metaclassTreeItem : allMetaclassTreeItems) {
String text = metaclassTreeItem.getText();
count = Integer.parseInt(text.substring(text.indexOf('(') + 1, text
.indexOf(')')));
assertTrue("Metaclass names are not sorted by count: '"
+ previousCount + "', followed by '" + count + "'",
previousCount <= count);
previousCount = count;
}
}
/**
* Check that the metaclass name contains a "." when
* "Show Full Qualified Names" is activated.
*/
@Test
public void checkShowFullQualifiedNames() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
TestUtils.resetToolbarButtons(editor);
final Menu menu = TestUtils.openMetaclassViewMenu(editor);
TestUtils.setViewMenuButtonState(menu, "Show Full Qualified Names",
true);
TestUtils.closeMenu(menu);
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("2");
SWTBotTreeItem[] allMetaclassTreeItems = TestMetaclasses.metaclassTree.getAllItems();
for (SWTBotTreeItem metaclassTreeItem : allMetaclassTreeItems) {
String text = metaclassTreeItem.getText();
assertTrue("Metaclass name is not fully qualified: '" + text + "'",
text.contains("."));
}
}
/**
* Check that empty metaclasses are shown when "Show Empty Metaclasses" is
* selected
*/
@Test
public void checkShowEmptyMetaclassesTrue() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
TestUtils.resetToolbarButtons(editor);
TestUtils.setToolbarButtonState(editor, "Show Empty Metaclasses", true);
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("2");
SWTBotTreeItem[] allMetaclassTreeItems = TestMetaclasses.metaclassTree.getAllItems();
for (SWTBotTreeItem metaclassTreeItem : allMetaclassTreeItems) {
String text = metaclassTreeItem.getText();
// find the number in parentheses
int instanceCount = Integer.parseInt(text.substring(text
.indexOf('(') + 1, text.indexOf(')')));
// OK
if (instanceCount == 0) {
return;
}
}
assertTrue("No empty metaclasses are shown", false);
}
/**
* Check that no empty metaclasses are shown when "Show Empty Metaclasses"
* is deselected
*/
@Test
public void checkShowEmptyMetaclassesFalse() throws Exception {
init();
SWTBotUtils.captureScreenShot("1");
SWTBotEditor editor = TestMetaclasses.fBot.editorByTitle(this.modelFilename);
TestUtils.resetToolbarButtons(editor);
TestUtils
.setToolbarButtonState(editor, "Show Empty Metaclasses", false);
TestUtils.waitUntilRefreshed();
SWTBotUtils.captureScreenShot("2");
SWTBotTreeItem[] allMetaclassTreeItems = TestMetaclasses.metaclassTree.getAllItems();
for (SWTBotTreeItem metaclassTreeItem : allMetaclassTreeItems) {
String text = metaclassTreeItem.getText();
// find the number in parentheses
int instanceCount = Integer.parseInt(text.substring(text
.indexOf('(') + 1, text.indexOf(')')));
// OK
if (instanceCount == 0) {
assertTrue("Empty metaclasses are shown: " + text, false);
}
}
}
private static void setInfiniteReferencedResourcesLoadingDepth() {
MoDiscoBrowserPlugin
.getPlugin()
.getPreferenceStore()
.setValue(
PreferenceConstants.P_BROWSER_LOADING_DEPTH, -1);
}
@AfterClass
public static void dontCloseEclipse() {
// bot.sleep(10000000);
}
}