package org.jactr.eclipse.runtime.ui.log2;
import java.util.ArrayList;
import java.util.Dictionary;
import java.util.List;
import javolution.util.FastList;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.jface.action.Action;
import org.eclipse.jface.action.ActionContributionItem;
import org.eclipse.jface.action.IContributionItem;
import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IAction;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.jface.viewers.ISelectionProvider;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.ui.IActionBars;
import org.eclipse.ui.IViewSite;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.hamcrest.FeatureMatcher;
import org.hamcrest.Matcher;
import org.hamcrest.core.IsEqual;
import org.jactr.eclipse.runtime.RuntimePlugin;
import org.jactr.eclipse.runtime.log2.ILogSessionDataStream;
import org.jactr.eclipse.runtime.session.ISession;
import org.jactr.eclipse.runtime.session.control.ISessionController;
import org.jactr.eclipse.runtime.session.data.ISessionData;
import org.jactr.eclipse.test.DisplayHelper;
import org.jmock.Expectations;
import org.jmock.integration.junit4.JUnitRuleMockery;
import org.jmock.lib.action.ActionSequence;
import org.junit.Rule;
import org.junit.Test;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import static org.junit.Assert.*;
import static org.hamcrest.CoreMatchers.*;
/**
* Note: Run as JUnit Plug-in Test
*/
public class ModelLogView2Test {
@Rule
public DisplayHelper displayHelper = new DisplayHelper();
@Rule
public JUnitRuleMockery context = new JUnitRuleMockery();
@Test
public void testCreateTableViewerAddsASingleToggleColumnActionForIdenticallyNamedColumns()
throws Exception {
final List<IContributionItem> items = new ArrayList<>();
items.add(new ActionContributionItem(new MockToggleColumnAction("TIME")));
items.add(new ActionContributionItem(new MockToggleColumnAction("MARKERS")));
items.add(new ActionContributionItem(new MockToggleColumnAction("OUTPUT")));
items.add(new ActionContributionItem(new MockToggleColumnAction("GOAL")));
items.add(new ActionContributionItem(new MockToggleColumnAction("IMAGINAL")));
items.add(new ActionContributionItem(new MockToggleColumnAction("RETRIEVAL")));
items.add(new ActionContributionItem(new MockToggleColumnAction("PROCEDURAL")));
items.add(new ActionContributionItem(new MockToggleColumnAction("DECLARATIVE")));
items.add(new ActionContributionItem(new MockToggleColumnAction("VISUAL")));
items.add(new ActionContributionItem(new MockToggleColumnAction("AURAL")));
items.add(new ActionContributionItem(new MockToggleColumnAction("MOTOR")));
final IContributionItem[] items0 = new IContributionItem[0],
items1 = items.subList(0, 1).toArray(items0),
items2 = items.subList(0, 2).toArray(items0),
items3 = items.subList(0, 3).toArray(items0),
items4 = items.subList(0, 4).toArray(items0),
items5 = items.subList(0, 5).toArray(items0),
items6 = items.subList(0, 6).toArray(items0),
items7 = items.subList(0, 7).toArray(items0),
items8 = items.subList(0, 8).toArray(items0),
items9 = items.subList(0, 9).toArray(items0),
items10 = items.subList(0, 10).toArray(items0),
items11 = items.subList(0, 11).toArray(items0);
final BundleContext bundleContext = context.mock(BundleContext.class);
final Bundle bundle = context.mock(Bundle.class);
final IViewSite viewSite = context.mock(IViewSite.class);
final IActionBars actionBars = context.mock(IActionBars.class);
final IMenuManager menuManager = context.mock(IMenuManager.class);
final IToolBarManager toolBarManager = context.mock(IToolBarManager.class);
final ISession model1Session = context.mock(ISession.class, "model1Session");
final ISessionData model1Data = context.mock(ISessionData.class, "model1Data");
final ISessionController model1Controller = context.mock(ISessionController.class, "model1Controller");
final ILogSessionDataStream model1Stream = context.mock(ILogSessionDataStream.class, "model1Stream");
final ISession model2Session = context.mock(ISession.class, "model2Session");
final ISessionData model2Data = context.mock(ISessionData.class, "model2Data");
final ISessionController model2Controller = context.mock(ISessionController.class, "model2Controller");
final ILogSessionDataStream model2Stream = context.mock(ILogSessionDataStream.class, "model2Stream");
@SuppressWarnings("unchecked")
Expectations expectations = new Expectations() {{
allowing(bundleContext).getBundle();
will(returnValue(bundle));
allowing(bundleContext).registerService(
with(aNonNull(String.class)),
with(aNonNull(Object.class)),
with(aNonNull(Dictionary.class)));
allowing(bundle).getSymbolicName();
will(returnValue("bundleName"));
allowing(viewSite).setSelectionProvider(with(aNonNull(ISelectionProvider.class)));
allowing(viewSite).getActionBars();
will(returnValue(actionBars));
allowing(actionBars).getToolBarManager();
will(returnValue(toolBarManager));
allowing(toolBarManager).add(with(aNonNull(IContributionItem.class)));
allowing(toolBarManager).add(with(aNonNull(IAction.class)));
allowing(toolBarManager).update(with(any(Boolean.class)));
allowing(model1Data).getDataStream("log");
will(returnValue(model1Stream));
allowing(model1Data).getSession();
will(returnValue(model1Session));
allowing(model2Data).getDataStream("log");
will(returnValue(model2Stream));
allowing(model2Data).getSession();
will(returnValue(model2Session));
allowing(model1Session).isOpen();
allowing(model1Session).hasBeenDestroyed();
will(returnValue(true));
allowing(model1Session).getController();
will(returnValue(model1Controller));
allowing(model2Session).isOpen();
allowing(model2Session).hasBeenDestroyed();
will(returnValue(true));
allowing(model2Session).getController();
will(returnValue(model2Controller));
allowing(model1Controller).isTerminated();
will(returnValue(true));
allowing(model1Controller).canTerminate();
will(returnValue(false));
allowing(model1Controller).canSuspend();
will(returnValue(false));
allowing(model1Controller).canResume();
will(returnValue(false));
allowing(model2Controller).isTerminated();
will(returnValue(true));
allowing(model2Controller).canTerminate();
will(returnValue(false));
allowing(model2Controller).canSuspend();
will(returnValue(false));
allowing(model2Controller).canResume();
will(returnValue(false));
allowing(model1Stream).getStartTime();
will(returnValue(0.0d));
allowing(model1Stream).getEndTime();
will(returnValue(0.0d));
allowing(model1Stream).getData(0.0d, 0.0d, FastList.newInstance());
allowing(model2Stream).getStartTime();
will(returnValue(0.0d));
allowing(model2Stream).getEndTime();
will(returnValue(0.0d));
allowing(model2Stream).getData(0.0d, 0.0d, FastList.newInstance());
allowing(actionBars).getMenuManager();
will(returnValue(menuManager));
exactly(1).of(actionBars).updateActionBars();
exactly(22).of(menuManager).getItems();
will(new ActionSequence(
returnValue(items0),
returnValue(items1),
returnValue(items2),
returnValue(items3),
returnValue(items4),
returnValue(items5),
returnValue(items6),
returnValue(items7),
returnValue(items8),
returnValue(items9),
returnValue(items10),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11),
returnValue(items11)
));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("TIME")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("MARKERS")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("OUTPUT")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("GOAL")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("IMAGINAL")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("RETRIEVAL")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("PROCEDURAL")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("DECLARATIVE")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("VISUAL")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("AURAL")));
exactly(1).of(menuManager).add(with(new ToggleColumnActionMatcher("MOTOR")));
}};
context.checking(expectations);
new RuntimePlugin().start(bundleContext);
Shell shell = displayHelper.createShell();
ModelLogView2 view = new ModelLogView2();
view.init(viewSite);
view.createPartControl(shell);
view.addModelData("model1", model1Data);
view.addModelData("model2", model2Data);
items.forEach(item -> {
int numberOfColumns = ((MockToggleColumnAction)
((ActionContributionItem)item).getAction()).getNumberOfColumns();
assertThat(numberOfColumns, is(2));
});
//RuntimePlugin.getDefault().stop(bundleContext);
}
private static class ToggleColumnActionMatcher extends FeatureMatcher<IToggleColumnAction,String> {
private ToggleColumnActionMatcher(String columnName) {
super(new IsEqual<String>(columnName), "the column text", "text");
}
@Override
protected String featureValueOf(IToggleColumnAction action) {
return action.getColumnText();
}
}
private static class MockToggleColumnAction extends Action implements IToggleColumnAction {
private int numberOfColumns = 1;
protected MockToggleColumnAction(String columnName) {
super(columnName, IAction.AS_CHECK_BOX);
}
@Override
public String getColumnText() {
return getText();
}
@Override
public int getNumberOfColumns() {
return numberOfColumns;
}
@Override
public void add(TableColumn column, Table table) {
numberOfColumns++;
}
@Override
public void remove(TableColumn column) {
numberOfColumns--;
}
}
}