/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.drools.workbench.screens.guided.dtable.client.editor;
import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.util.concurrent.atomic.AtomicInteger;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.drools.workbench.screens.guided.dtable.client.editor.clipboard.Clipboard;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.EditMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.InsertMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.RadarMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.RadarMenuView;
import org.drools.workbench.screens.guided.dtable.client.editor.menu.ViewMenuBuilder;
import org.drools.workbench.screens.guided.dtable.client.type.GuidedDTableResourceType;
import org.drools.workbench.screens.guided.dtable.client.widget.table.GuidedDecisionTableModellerView;
import org.drools.workbench.screens.guided.dtable.client.widget.table.events.cdi.DecisionTableSelectedEvent;
import org.drools.workbench.screens.guided.dtable.service.GuidedDecisionTableEditorService;
import org.guvnor.common.services.project.context.ProjectContext;
import org.jboss.errai.common.client.api.Caller;
import org.jboss.errai.ioc.client.api.ManagedInstance;
import org.jboss.errai.ioc.client.container.SyncBeanManager;
import org.jboss.errai.ui.client.local.spi.TranslationService;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.widgets.client.menu.FileMenuBuilder;
import org.kie.workbench.common.widgets.client.menu.FileMenuBuilderImpl;
import org.kie.workbench.common.widgets.client.popups.validation.ValidationPopup;
import org.kie.workbench.common.widgets.configresource.client.widget.bound.ImportsWidgetPresenter;
import org.kie.workbench.common.widgets.metadata.client.KieMultipleDocumentEditorWrapperView;
import org.kie.workbench.common.widgets.metadata.client.menu.RegisteredDocumentsMenuBuilder;
import org.kie.workbench.common.widgets.metadata.client.menu.RegisteredDocumentsMenuView;
import org.kie.workbench.common.widgets.metadata.client.menu.RegisteredDocumentsMenuView.DocumentMenuItem;
import org.kie.workbench.common.widgets.metadata.client.widget.OverviewWidgetPresenter;
import org.mockito.Mock;
import org.mockito.Spy;
import org.uberfire.client.mvp.PlaceManager;
import org.uberfire.client.workbench.events.ChangeTitleWidgetEvent;
import org.uberfire.ext.editor.commons.client.file.popups.CopyPopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.DeletePopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.RenamePopUpPresenter;
import org.uberfire.ext.editor.commons.client.file.popups.SavePopUpPresenter;
import org.uberfire.ext.editor.commons.client.history.VersionRecordManager;
import org.uberfire.ext.editor.commons.client.menu.BasicFileMenuBuilder;
import org.uberfire.ext.editor.commons.client.menu.BasicFileMenuBuilderImpl;
import org.uberfire.ext.editor.commons.client.menu.RestoreVersionCommandProvider;
import org.uberfire.ext.editor.commons.client.validation.DefaultFileNameValidator;
import org.uberfire.ext.editor.commons.version.VersionService;
import org.uberfire.ext.editor.commons.version.events.RestoreEvent;
import org.uberfire.ext.widgets.common.client.common.BusyIndicatorView;
import org.uberfire.ext.widgets.common.client.menu.MenuItemDivider;
import org.uberfire.ext.widgets.common.client.menu.MenuItemDividerView;
import org.uberfire.ext.widgets.common.client.menu.MenuItemFactory;
import org.uberfire.ext.widgets.common.client.menu.MenuItemHeader;
import org.uberfire.ext.widgets.common.client.menu.MenuItemHeaderView;
import org.uberfire.ext.widgets.common.client.menu.MenuItemView;
import org.uberfire.ext.widgets.common.client.menu.MenuItemWithIcon;
import org.uberfire.ext.widgets.common.client.menu.MenuItemWithIconView;
import org.uberfire.mocks.CallerMock;
import org.uberfire.mocks.EventSourceMock;
import org.uberfire.mvp.Command;
import org.uberfire.workbench.events.NotificationEvent;
import org.uberfire.workbench.model.menu.MenuCustom;
import org.uberfire.workbench.model.menu.MenuGroup;
import org.uberfire.workbench.model.menu.MenuItem;
import org.uberfire.workbench.model.menu.MenuItemCommand;
import org.uberfire.workbench.model.menu.MenuItemPerspective;
import org.uberfire.workbench.model.menu.MenuItemPlain;
import org.uberfire.workbench.model.menu.MenuVisitor;
import org.uberfire.workbench.model.menu.Menus;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
@RunWith(GwtMockitoTestRunner.class)
public class GuidedDecisionTableEditorMenusTest {
@Mock
protected BaseGuidedDecisionTableEditorPresenter.View view;
@Mock
protected GuidedDecisionTableEditorService dtService;
protected Caller<GuidedDecisionTableEditorService> dtServiceCaller;
@Mock
protected EventSourceMock<NotificationEvent> notification;
@Mock
protected EventSourceMock<DecisionTableSelectedEvent> decisionTableSelectedEvent;
@Mock
protected ValidationPopup validationPopup;
@Mock
protected Clipboard clipboard;
@Mock
protected TranslationService ts;
@Mock
private ManagedInstance<MenuItemView> menuItemViewProducer;
@Mock
private ManagedInstance<MenuItemView> menuItemViewHeaderProducer;
@Mock
private ManagedInstance<MenuItemView> menuItemViewWithIconProducer;
@Mock
private ManagedInstance<MenuItemView> menuItemViewDividerProducer;
private MenuItemFactory menuItemFactory;
protected EditMenuBuilder editMenuBuilder;
protected InsertMenuBuilder insertMenuBuilder;
protected ViewMenuBuilder viewMenuBuilder;
@Mock
protected RadarMenuView radarMenuView;
protected RadarMenuBuilder radarMenuBuilder = new RadarMenuBuilder(radarMenuView);
@Mock
protected RegisteredDocumentsMenuView registeredDocumentsMenuView;
@Mock
protected ManagedInstance<DocumentMenuItem> documentMenuItems;
protected RegisteredDocumentsMenuBuilder registeredDocumentsMenuBuilder = new RegisteredDocumentsMenuBuilder(registeredDocumentsMenuView,
documentMenuItems);
@Mock
protected MenuItem saveMenuItem;
@Mock
protected MenuItem versionManagerMenuItem;
@Mock
protected GuidedDecisionTableModellerView.Presenter modeller;
@Mock
protected GuidedDecisionTableModellerView modellerView;
@Mock
protected KieMultipleDocumentEditorWrapperView kieEditorWrapperView;
@Mock
protected OverviewWidgetPresenter overviewWidget;
@Mock
protected SavePopUpPresenter savePopUpPresenter;
@Mock
protected ImportsWidgetPresenter importsWidget;
@Mock
protected EventSourceMock<NotificationEvent> notificationEvent;
@Mock
protected EventSourceMock<ChangeTitleWidgetEvent> changeTitleEvent;
@Mock
protected ProjectContext workbenchContext;
@Mock
protected VersionRecordManager versionRecordManager;
@Mock
protected VersionService versionService;
protected CallerMock<VersionService> versionServiceCaller;
@Mock
protected EventSourceMock<RestoreEvent> restoreEvent;
@Mock
protected DeletePopUpPresenter deletePopUpPresenter;
@Mock
protected CopyPopUpPresenter copyPopUpPresenter;
@Mock
protected RenamePopUpPresenter renamePopUpPresenter;
@Mock
protected BusyIndicatorView busyIndicatorView;
@Spy
protected RestoreVersionCommandProvider restoreVersionCommandProvider = getRestoreVersionCommandProvider();
@Spy
protected BasicFileMenuBuilder basicFileMenuBuilder = getBasicFileMenuBuilder();
@Spy
protected FileMenuBuilder fileMenuBuilder = getFileMenuBuilder();
@Mock
protected DefaultFileNameValidator fileNameValidator;
@Mock
protected SyncBeanManager beanManager;
@Mock
protected PlaceManager placeManager;
private GuidedDecisionTableEditorPresenter presenter;
private GuidedDTableResourceType resourceType = new GuidedDTableResourceType();
private String[] menuItemIdentifiers = new String[]{
"org.uberfire.workbench.model.menu.impl.MenuBuilderImpl$CurrentContext$1#Delete",
"org.uberfire.workbench.model.menu.impl.MenuBuilderImpl$CurrentContext$1#Rename",
"org.uberfire.workbench.model.menu.impl.MenuBuilderImpl$CurrentContext$1#Copy",
"org.uberfire.workbench.model.menu.impl.MenuBuilderImpl$CurrentContext$1#Validate",
"org.uberfire.workbench.model.menu.impl.DefaultMenuGroup#EditMenu.title",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#EditMenu.cut",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#EditMenu.copy",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#EditMenu.paste",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#EditMenu.deleteCells",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#EditMenu.deleteColumns",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#EditMenu.deleteRows",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#EditMenu.otherwise",
"org.uberfire.workbench.model.menu.impl.DefaultMenuGroup#ViewMenu.title",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$4$1#ViewMenu.zoom",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#125%",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#100%",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#75%",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#50%",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$6$1#null",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#ViewMenu.merged",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#ViewMenu.auditLog",
"org.uberfire.workbench.model.menu.impl.DefaultMenuGroup#InsertMenu.title",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#InsertMenu.appendRow",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#InsertMenu.insertRowAbove",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#InsertMenu.insertRowBelow",
"org.uberfire.ext.widgets.common.client.menu.MenuItemFactory$2$1#InsertMenu.insertColumn",
"org.drools.workbench.screens.guided.dtable.client.editor.menu.RadarMenuBuilder$1#null"};
@Before
public void setup() {
when(modeller.getView()).thenReturn(modellerView);
when(versionRecordManager.newSaveMenuItem(any(Command.class))).thenReturn(saveMenuItem);
when(versionRecordManager.buildMenu()).thenReturn(versionManagerMenuItem);
when(ts.getTranslation(any(String.class))).thenAnswer(invocation -> invocation.getArguments()[0]);
when(menuItemViewProducer.select(any(Annotation.class))).thenAnswer((o) -> {
final Annotation a = (Annotation) o.getArguments()[0];
if (a.annotationType().equals(MenuItemHeader.class)) {
return menuItemViewHeaderProducer;
} else if (a.annotationType().equals(MenuItemWithIcon.class)) {
return menuItemViewWithIconProducer;
} else if (a.annotationType().equals(MenuItemDivider.class)) {
return menuItemViewDividerProducer;
}
throw new IllegalArgumentException("Unexpected MenuItemView");
});
when(menuItemViewHeaderProducer.get()).thenReturn(mock(MenuItemHeaderView.class));
when(menuItemViewWithIconProducer.get()).thenReturn(mock(MenuItemWithIconView.class));
when(menuItemViewDividerProducer.get()).thenReturn(mock(MenuItemDividerView.class));
this.dtServiceCaller = new CallerMock<>(dtService);
this.versionServiceCaller = new CallerMock<>(versionService);
this.menuItemFactory = new MenuItemFactory(menuItemViewProducer);
this.editMenuBuilder = new EditMenuBuilder(clipboard,
ts,
menuItemFactory);
this.editMenuBuilder.setup();
this.insertMenuBuilder = new InsertMenuBuilder(ts,
menuItemFactory);
this.insertMenuBuilder.setup();
this.insertMenuBuilder.setModeller(modeller);
this.viewMenuBuilder = new ViewMenuBuilder(ts,
menuItemFactory);
this.viewMenuBuilder.setup();
this.viewMenuBuilder.setModeller(modeller);
final GuidedDecisionTableEditorPresenter wrapped = new GuidedDecisionTableEditorPresenter(view,
dtServiceCaller,
notification,
decisionTableSelectedEvent,
validationPopup,
resourceType,
editMenuBuilder,
viewMenuBuilder,
insertMenuBuilder,
radarMenuBuilder,
modeller,
beanManager,
placeManager);
wrapped.setKieEditorWrapperView(kieEditorWrapperView);
wrapped.setOverviewWidget(overviewWidget);
wrapped.setSavePopUpPresenter(savePopUpPresenter);
wrapped.setImportsWidget(importsWidget);
wrapped.setNotificationEvent(notificationEvent);
wrapped.setChangeTitleEvent(changeTitleEvent);
wrapped.setWorkbenchContext(workbenchContext);
wrapped.setVersionRecordManager(versionRecordManager);
wrapped.setRegisteredDocumentsMenuBuilder(registeredDocumentsMenuBuilder);
wrapped.setFileMenuBuilder(fileMenuBuilder);
wrapped.setFileNameValidator(fileNameValidator);
this.presenter = spy(wrapped);
presenter.init();
presenter.setupMenuBar();
}
@Test
public void checkMenuStructure() {
final AtomicInteger i = new AtomicInteger(0);
final Menus menus = presenter.getMenus();
final MenuVisitor visitor = new MenuVisitor() {
@Override
public boolean visitEnter(final Menus menus) {
return true;
}
@Override
public void visitLeave(final Menus menus) {
}
@Override
public boolean visitEnter(final MenuGroup menuGroup) {
assertEquals(menuItemIdentifiers[i.getAndIncrement()],
menuGroup.getIdentifier());
return true;
}
@Override
public void visitLeave(final MenuGroup menuGroup) {
}
@Override
public void visit(final MenuItemPlain menuItemPlain) {
assertEquals(menuItemIdentifiers[i.getAndIncrement()],
menuItemPlain.getIdentifier());
}
@Override
public void visit(final MenuItemCommand menuItemCommand) {
assertEquals(menuItemIdentifiers[i.getAndIncrement()],
menuItemCommand.getIdentifier());
}
@Override
public void visit(final MenuItemPerspective menuItemPerspective) {
assertEquals(menuItemIdentifiers[i.getAndIncrement()],
menuItemPerspective.getIdentifier());
}
@Override
public void visit(final MenuCustom<?> menuCustom) {
assertEquals(menuItemIdentifiers[i.getAndIncrement()],
menuCustom.getIdentifier());
}
};
menus.accept(visitor);
}
private RestoreVersionCommandProvider getRestoreVersionCommandProvider() {
final RestoreVersionCommandProvider restoreVersionCommandProvider = new RestoreVersionCommandProvider();
setField(restoreVersionCommandProvider,
"versionService",
versionServiceCaller);
setField(restoreVersionCommandProvider,
"restoreEvent",
restoreEvent);
setField(restoreVersionCommandProvider,
"busyIndicatorView",
view);
return restoreVersionCommandProvider;
}
private BasicFileMenuBuilder getBasicFileMenuBuilder() {
final BasicFileMenuBuilder basicFileMenuBuilder = new BasicFileMenuBuilderImpl(deletePopUpPresenter,
copyPopUpPresenter,
renamePopUpPresenter,
busyIndicatorView,
notification,
restoreVersionCommandProvider);
setField(basicFileMenuBuilder,
"restoreVersionCommandProvider",
restoreVersionCommandProvider);
setField(basicFileMenuBuilder,
"notification",
notificationEvent);
setField(restoreVersionCommandProvider,
"busyIndicatorView",
view);
return basicFileMenuBuilder;
}
private FileMenuBuilder getFileMenuBuilder() {
final FileMenuBuilder fileMenuBuilder = new FileMenuBuilderImpl();
setField(fileMenuBuilder,
"menuBuilder",
basicFileMenuBuilder);
return fileMenuBuilder;
}
private void setField(final Object o,
final String fieldName,
final Object value) {
try {
final Field field = o.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
field.set(o,
value);
} catch (NoSuchFieldException | IllegalAccessException e) {
fail(e.getMessage());
}
}
}