/*
* Copyright 2017 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.kie.workbench.common.stunner.cm.client.palette;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import org.hamcrest.BaseMatcher;
import org.hamcrest.Description;
import org.jboss.errai.common.client.api.Caller;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.stunner.bpmn.definition.AdHocSubprocess;
import org.kie.workbench.common.stunner.bpmn.definition.AdHocSubprocess.AdHocSubprocessBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.BusinessRuleTask;
import org.kie.workbench.common.stunner.bpmn.definition.BusinessRuleTask.BusinessRuleTaskBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.EndNoneEvent;
import org.kie.workbench.common.stunner.bpmn.definition.EndNoneEvent.EndNoneEventBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.EndTerminateEvent;
import org.kie.workbench.common.stunner.bpmn.definition.EndTerminateEvent.EndTerminateEventBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.ExclusiveDatabasedGateway;
import org.kie.workbench.common.stunner.bpmn.definition.ExclusiveDatabasedGateway.ExclusiveDatabasedGatewayBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.IntermediateTimerEvent;
import org.kie.workbench.common.stunner.bpmn.definition.IntermediateTimerEvent.IntermediateTimerEventBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.Lane;
import org.kie.workbench.common.stunner.bpmn.definition.Lane.LaneBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.NoneTask;
import org.kie.workbench.common.stunner.bpmn.definition.NoneTask.NoneTaskBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.ParallelGateway;
import org.kie.workbench.common.stunner.bpmn.definition.ParallelGateway.ParallelGatewayBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.ScriptTask;
import org.kie.workbench.common.stunner.bpmn.definition.ScriptTask.ScriptTaskBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.SequenceFlow;
import org.kie.workbench.common.stunner.bpmn.definition.SequenceFlow.SequenceFlowBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.StartNoneEvent;
import org.kie.workbench.common.stunner.bpmn.definition.StartNoneEvent.StartNoneEventBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.StartSignalEvent;
import org.kie.workbench.common.stunner.bpmn.definition.StartSignalEvent.StartSignalEventBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.StartTimerEvent;
import org.kie.workbench.common.stunner.bpmn.definition.StartTimerEvent.StartTimerEventBuilder;
import org.kie.workbench.common.stunner.bpmn.definition.UserTask;
import org.kie.workbench.common.stunner.bpmn.definition.UserTask.UserTaskBuilder;
import org.kie.workbench.common.stunner.cm.CaseManagementDefinitionSet;
import org.kie.workbench.common.stunner.cm.definition.CaseManagementDiagram;
import org.kie.workbench.common.stunner.cm.definition.ReusableSubprocess;
import org.kie.workbench.common.stunner.cm.definition.ReusableSubprocess.ReusableSubprocessBuilder;
import org.kie.workbench.common.stunner.core.api.DefinitionManager;
import org.kie.workbench.common.stunner.core.api.FactoryManager;
import org.kie.workbench.common.stunner.core.client.api.ClientFactoryManager;
import org.kie.workbench.common.stunner.core.client.api.ShapeManager;
import org.kie.workbench.common.stunner.core.client.components.palette.model.PaletteDefinitionBuilder;
import org.kie.workbench.common.stunner.core.client.components.palette.model.definition.DefinitionPaletteItem;
import org.kie.workbench.common.stunner.core.client.components.palette.model.definition.DefinitionSetPalette;
import org.kie.workbench.common.stunner.core.client.service.ClientFactoryService;
import org.kie.workbench.common.stunner.core.client.service.ClientRuntimeError;
import org.kie.workbench.common.stunner.core.definition.adapter.AdapterManager;
import org.kie.workbench.common.stunner.core.definition.adapter.DefinitionAdapter;
import org.kie.workbench.common.stunner.core.definition.adapter.DefinitionSetAdapter;
import org.kie.workbench.common.stunner.core.service.FactoryService;
import org.kie.workbench.common.stunner.core.util.DefinitionUtils;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import org.uberfire.mocks.CallerMock;
import static org.junit.Assert.*;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class CaseManagementDefinitionSetPaletteBuilderImplTest {
final Set<String> definitions = new HashSet<String>() {{
add(CaseManagementDiagram.class.getName());
add(Lane.class.getName());
add(NoneTask.class.getName());
add(UserTask.class.getName());
add(ScriptTask.class.getName());
add(BusinessRuleTask.class.getName());
add(StartNoneEvent.class.getName());
add(StartSignalEvent.class.getName());
add(StartTimerEvent.class.getName());
add(EndNoneEvent.class.getName());
add(EndTerminateEvent.class.getName());
add(IntermediateTimerEvent.class.getName());
add(ParallelGateway.class.getName());
add(ExclusiveDatabasedGateway.class.getName());
add(AdHocSubprocess.class.getName());
add(ReusableSubprocess.class.getName());
add(SequenceFlow.class.getName());
}};
@Mock
private ShapeManager shapeManager;
@Mock
private DefinitionManager definitionManager;
@Mock
private FactoryManager factoryManager;
@Mock
private ClientFactoryManager clientFactoryManager;
@Mock
private FactoryService factoryService;
private Caller<FactoryService> factoryServiceCaller;
@Mock
private AdapterManager adapterManager;
@Mock
private DefinitionSetAdapter definitionSetAdapter;
@Mock
private DefinitionAdapter definitionAdapter;
private DefinitionUtils definitionUtils;
private ClientFactoryService clientFactoryServices;
private CaseManagementDefinitionSetPaletteBuilderImpl builder;
@Before
@SuppressWarnings("unchecked")
public void setup() {
this.definitionUtils = new DefinitionUtils(definitionManager,
factoryManager);
this.factoryServiceCaller = new CallerMock<>(factoryService);
this.clientFactoryServices = new ClientFactoryService(clientFactoryManager,
factoryServiceCaller);
this.builder = new CaseManagementDefinitionSetPaletteBuilderImpl(definitionUtils,
clientFactoryServices);
when(definitionManager.adapters()).thenReturn(adapterManager);
when(adapterManager.forDefinitionSet()).thenReturn(definitionSetAdapter);
when(definitionSetAdapter.getId(anyObject())).thenReturn(CaseManagementDefinitionSet.class.getName());
when(definitionSetAdapter.getDefinitions(anyObject())).thenReturn(definitions);
when(adapterManager.forDefinition()).thenReturn(definitionAdapter);
when(definitionAdapter.getId(anyObject())).thenAnswer((i) -> i.getArguments()[0].getClass().getName());
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(CaseManagementDiagram.class)))).thenReturn(CaseManagementDiagram.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(Lane.class)))).thenReturn(Lane.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(StartNoneEvent.class)))).thenReturn(StartNoneEvent.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(StartSignalEvent.class)))).thenReturn(StartSignalEvent.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(StartTimerEvent.class)))).thenReturn(StartTimerEvent.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(EndNoneEvent.class)))).thenReturn(EndNoneEvent.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(EndTerminateEvent.class)))).thenReturn(EndTerminateEvent.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(IntermediateTimerEvent.class)))).thenReturn(IntermediateTimerEvent.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(ParallelGateway.class)))).thenReturn(ParallelGateway.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(ExclusiveDatabasedGateway.class)))).thenReturn(ExclusiveDatabasedGateway.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(SequenceFlow.class)))).thenReturn(SequenceFlow.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(AdHocSubprocess.class)))).thenReturn(AdHocSubprocess.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(NoneTask.class)))).thenReturn(NoneTask.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(UserTask.class)))).thenReturn(UserTask.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(ScriptTask.class)))).thenReturn(ScriptTask.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(BusinessRuleTask.class)))).thenReturn(BusinessRuleTask.category);
when(definitionAdapter.getCategory(argThat(new ClassOrSubclassMatcher(ReusableSubprocess.class)))).thenReturn(ReusableSubprocess.category);
when(clientFactoryManager.newDefinition(eq(CaseManagementDiagram.class.getName()))).thenReturn(new CaseManagementDiagram.CaseManagementDiagramBuilder().build());
when(clientFactoryManager.newDefinition(eq(Lane.class.getName()))).thenReturn(new LaneBuilder().build());
when(clientFactoryManager.newDefinition(eq(StartNoneEvent.class.getName()))).thenReturn(new StartNoneEventBuilder().build());
when(clientFactoryManager.newDefinition(eq(StartSignalEvent.class.getName()))).thenReturn(new StartSignalEventBuilder().build());
when(clientFactoryManager.newDefinition(eq(StartTimerEvent.class.getName()))).thenReturn(new StartTimerEventBuilder().build());
when(clientFactoryManager.newDefinition(eq(EndNoneEvent.class.getName()))).thenReturn(new EndNoneEventBuilder().build());
when(clientFactoryManager.newDefinition(eq(EndTerminateEvent.class.getName()))).thenReturn(new EndTerminateEventBuilder().build());
when(clientFactoryManager.newDefinition(eq(IntermediateTimerEvent.class.getName()))).thenReturn(new IntermediateTimerEventBuilder().build());
when(clientFactoryManager.newDefinition(eq(ParallelGateway.class.getName()))).thenReturn(new ParallelGatewayBuilder().build());
when(clientFactoryManager.newDefinition(eq(ExclusiveDatabasedGateway.class.getName()))).thenReturn(new ExclusiveDatabasedGatewayBuilder().build());
when(clientFactoryManager.newDefinition(eq(SequenceFlow.class.getName()))).thenReturn(new SequenceFlowBuilder().build());
when(clientFactoryManager.newDefinition(eq(AdHocSubprocess.class.getName()))).thenReturn(new AdHocSubprocessBuilder().build());
when(clientFactoryManager.newDefinition(eq(NoneTask.class.getName()))).thenReturn(new NoneTaskBuilder().build());
when(clientFactoryManager.newDefinition(eq(UserTask.class.getName()))).thenReturn(new UserTaskBuilder().build());
when(clientFactoryManager.newDefinition(eq(ScriptTask.class.getName()))).thenReturn(new ScriptTaskBuilder().build());
when(clientFactoryManager.newDefinition(eq(BusinessRuleTask.class.getName()))).thenReturn(new BusinessRuleTaskBuilder().build());
when(clientFactoryManager.newDefinition(eq(ReusableSubprocess.class.getName()))).thenReturn(new ReusableSubprocessBuilder().build());
}
@Test
@SuppressWarnings("unchecked")
public void checkConstruction() {
//Must use PaletteDefinitionFactory to correctly initialise the builder
final CaseManagementPaletteDefinitionFactory factory = new CaseManagementPaletteDefinitionFactory(shapeManager,
builder);
factory.configureBuilder();
//Construct palette
final Object definitionSet = new CaseManagementDefinitionSet();
builder.build(definitionSet,
new PaletteDefinitionBuilder.Callback<DefinitionSetPalette, ClientRuntimeError>() {
@Override
public void onSuccess(final DefinitionSetPalette paletteDefinition) {
assertPaletteConstruction(paletteDefinition);
}
@Override
public void onError(final ClientRuntimeError error) {
fail(error.getMessage());
}
});
}
private void assertPaletteConstruction(final DefinitionSetPalette paletteDefinition) {
assertNotNull(paletteDefinition);
assertEquals(CaseManagementDefinitionSet.class.getName(),
paletteDefinition.getDefinitionSetId());
assertEquals(2,
paletteDefinition.getItems().size());
assertEquals(CaseManagementPaletteDefinitionFactory.ACTIVITIES,
paletteDefinition.getItems().get(0).getTitle());
final List<DefinitionPaletteItem> item0Items = paletteDefinition.getItems().get(0).getItems();
assertEquals(4,
item0Items.size());
assertPaletteContains(UserTask.class.getName(),
item0Items);
assertPaletteContains(ScriptTask.class.getName(),
item0Items);
assertPaletteContains(BusinessRuleTask.class.getName(),
item0Items);
assertPaletteContains(ReusableSubprocess.class.getName(),
item0Items);
assertEquals(CaseManagementPaletteDefinitionFactory.STAGES,
paletteDefinition.getItems().get(1).getTitle());
final List<DefinitionPaletteItem> item1Items = paletteDefinition.getItems().get(1).getItems();
assertEquals(1,
item1Items.size());
assertPaletteContains(AdHocSubprocess.class.getName(),
item1Items);
}
private void assertPaletteContains(final String defId,
final List<DefinitionPaletteItem> items) {
assertTrue("Expected Definition '" + defId + "' not found.",
items.stream().filter((i) -> i.getDefinitionId().equals(defId)).findFirst().isPresent());
}
private static class ClassOrSubclassMatcher<T> extends BaseMatcher<Class<T>> {
private final Class<T> targetClass;
public ClassOrSubclassMatcher(final Class<T> targetClass) {
this.targetClass = targetClass;
}
@SuppressWarnings("unchecked")
public boolean matches(final Object obj) {
if (obj != null) {
return targetClass.isAssignableFrom(obj.getClass());
}
return false;
}
public void describeTo(final Description desc) {
desc.appendText("Matches a class or subclass.");
}
}
}