/*
* 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.kie.workbench.common.stunner.bpmn.client.forms.widgets;
import java.util.Arrays;
import java.util.List;
import com.google.gwtmockito.GwtMockitoTestRunner;
import org.gwtbootstrap3.client.ui.TextBox;
import org.gwtbootstrap3.client.ui.ValueListBox;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.kie.workbench.common.stunner.bpmn.client.forms.util.ListBoxValues;
import org.kie.workbench.common.stunner.bpmn.client.forms.util.StringUtils;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
/**
* The tests in this class run ComboBox, ComboBoxView and ListBoxValues
* through some realistic user interactions.
*/
@RunWith(GwtMockitoTestRunner.class)
public class ComboBoxAllTest {
@Mock
ComboBoxView.ModelPresenter modelPresenter;
ComboBoxView view = new ComboBoxViewImpl();
@Mock
ValueListBox<String> listBox;
String listBoxValue = "";
boolean listBoxIsVisible = true;
@Mock
TextBox textBox;
String textBoxValue = "";
boolean textBoxIsVisible = false;
@Spy
ComboBox comboBox = new ComboBox();
boolean quoteStringValues;
String editPrefix;
String editSuffix;
String customPrompt;
ListBoxValues getListBoxValues() {
return comboBox.getListBoxValues();
}
private final boolean processVarNotifyModelChanges = false;
private final boolean processVarQuoteStringValues = true;
private final boolean processVarAddCustomValues = true;
private final String processVarConstantPrompt = "Constant ...";
private final String processVarConstantPlaceholder = "Enter constant ...";
private final String processVarEditPrefix = "Edit ";
private final String processVarEditSuffix = " ...";
List<String> processVarListBoxStartValues = Arrays.asList(
"** Variable Definitions **",
"employee",
"reason",
"performance"
);
private final boolean dataTypeNotifyModelChanges = false;
private final boolean dataTypeQuoteStringValues = false;
private final boolean dataTypeAddCustomValues = true;
private final String dataTypeCustomPrompt = "Custom ...";
private final String dataTypeCustomPlaceholder = "Enter type ...";
private final String dataTypeEditPrefix = "Edit ";
private final String dataTypeEditSuffix = " ...";
List<String> dataTypeListBoxStartValues = Arrays.asList(
"String",
"Integer",
"Boolean",
"Float",
"Object",
"Department [org.test.Department]",
"Employee [org.test.Employee]",
"Organization [org.test.Organization]"
);
private void initComboBoxTest(boolean notifyModelChanges,
boolean quoteStringValues,
boolean addCustomValues,
String customPrompt,
String placeholder,
String editPrefix,
String editSuffix,
List<String> listBoxStartValues) {
initPresenter();
initListBox();
initTextBox();
ListBoxValues listBoxValues = new ListBoxValues(customPrompt,
editPrefix,
null);
listBoxValues.addValues(listBoxStartValues);
comboBox.view = view;
comboBox.init(modelPresenter,
notifyModelChanges,
listBox,
textBox,
quoteStringValues,
addCustomValues,
customPrompt,
placeholder);
comboBox.setListBoxValues(listBoxValues);
comboBox.setShowCustomValues(true);
this.quoteStringValues = quoteStringValues;
this.editPrefix = editPrefix;
this.editSuffix = editSuffix;
this.customPrompt = customPrompt;
}
private void initPresenter() {
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
String value = (String) invocation.getArguments()[1];
textBox.setValue(value);
return null;
}
}).when(modelPresenter).setTextBoxModelValue(any(TextBox.class),
anyString());
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
String value = (String) invocation.getArguments()[1];
listBox.setValue(value);
return null;
}
}).when(modelPresenter).setListBoxModelValue(any(ValueListBox.class),
anyString());
when(modelPresenter.getModelValue(any(ValueListBox.class))).thenAnswer(new Answer<Object>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return listBoxValue;
}
});
}
private void initListBox() {
when(listBox.getValue()).thenAnswer(new Answer<Object>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return listBoxValue;
}
});
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
listBoxValue = (String) invocation.getArguments()[0];
return null;
}
}).when(listBox).setValue(anyString());
when(listBox.isVisible()).thenAnswer(new Answer<Object>() {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
return listBoxIsVisible;
}
});
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
listBoxIsVisible = (Boolean) invocation.getArguments()[0];
return null;
}
}).when(listBox).setVisible(anyBoolean());
}
private void initTextBox() {
when(textBox.getValue()).thenAnswer(new Answer<Object>() {
@Override
public String answer(InvocationOnMock invocation) throws Throwable {
return textBoxValue;
}
});
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
textBoxValue = (String) invocation.getArguments()[0];
return null;
}
}).when(textBox).setValue(anyString());
when(textBox.isVisible()).thenAnswer(new Answer<Object>() {
@Override
public Boolean answer(InvocationOnMock invocation) throws Throwable {
return textBoxIsVisible;
}
});
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Throwable {
textBoxIsVisible = (Boolean) invocation.getArguments()[0];
return null;
}
}).when(textBox).setVisible(anyBoolean());
}
@Test
public void testProcessVarComboBox() {
initComboBoxTest(processVarNotifyModelChanges,
processVarQuoteStringValues,
processVarAddCustomValues,
processVarConstantPrompt,
processVarConstantPlaceholder,
processVarEditPrefix,
processVarEditSuffix,
processVarListBoxStartValues);
setNonCustomValue(processVarListBoxStartValues.get(2),
1);
String customStringValue1 = "first constant";
setCustomValue(customStringValue1);
setNonCustomValue(processVarListBoxStartValues.get(2),
2);
String customNumericValue1 = "123";
setCustomValue(customNumericValue1);
setNonCustomValue(StringUtils.createQuotedConstant(customStringValue1),
2);
String customNumericValue2 = "123.456";
setCustomValue(customNumericValue2);
aboutToEditCustomValue(customNumericValue2,
2);
String customNumericValue3 = "100";
editCustomValue(customNumericValue3);
String customStringValue2 = "second constant";
setCustomValue(customStringValue2);
setNonCustomValue(StringUtils.createQuotedConstant(customStringValue1),
3);
setNonCustomValue(processVarListBoxStartValues.get(2),
3);
assertTrue(getListBoxValues().getAcceptableValuesWithCustomValues().
contains(StringUtils.createQuotedConstant(customStringValue1)));
assertTrue(getListBoxValues().getAcceptableValuesWithCustomValues().
contains(customNumericValue1));
assertTrue(!getListBoxValues().getAcceptableValuesWithCustomValues().
contains(customNumericValue2));
assertTrue(getListBoxValues().getAcceptableValuesWithCustomValues().
contains(customNumericValue3));
assertTrue(getListBoxValues().getAcceptableValuesWithCustomValues().
contains(StringUtils.createQuotedConstant(customStringValue2)));
// System.out.println(comboBox.getListBoxValues().toString());
}
@Test
public void testDataTypeComboBox() {
initComboBoxTest(dataTypeNotifyModelChanges,
dataTypeQuoteStringValues,
dataTypeAddCustomValues,
dataTypeCustomPrompt,
dataTypeCustomPlaceholder,
dataTypeEditPrefix,
dataTypeEditSuffix,
dataTypeListBoxStartValues);
setNonCustomValue(dataTypeListBoxStartValues.get(2),
1);
String customDataType1 = "com.acme.parts.Nut";
setCustomValue(customDataType1);
setNonCustomValue(dataTypeListBoxStartValues.get(6),
1);
setNonCustomValue(customDataType1,
2);
setNonCustomValue(dataTypeListBoxStartValues.get(5),
1);
String customDataType2 = "com.acme.parts.Bolt";
setCustomValue(customDataType2);
setNonCustomValue(customDataType1,
3);
// System.out.println(comboBox.getListBoxValues().toString());
}
private void setCustomValue(String value) {
comboBox.view.listBoxGotFocus();
comboBox.listBoxValueChanged(this.customPrompt);
assertEquals(listBox.isVisible(),
false);
assertEquals(textBox.isVisible(),
true);
comboBox.view.textBoxGotFocus();
textBox.setValue(value);
comboBox.view.textBoxLostFocus();
comboBox.view.listBoxGotFocus();
assertEquals(listBox.isVisible(),
true);
assertEquals(textBox.isVisible(),
false);
String listBoxValue = this.quoteStringValues ? StringUtils.createQuotedConstant(value) : value;
verify(modelPresenter).setTextBoxModelValue(textBox,
value);
assertEquals(comboBox.getValue(),
listBoxValue);
}
private void setNonCustomValue(String value,
int times) {
comboBox.view.listBoxGotFocus();
comboBox.listBoxValueChanged(value);
assertEquals(listBox.isVisible(),
true);
assertEquals(textBox.isVisible(),
false);
verify(modelPresenter,
times(times)).setListBoxModelValue(listBox,
value);
assertEquals(comboBox.getValue(),
value);
}
private void aboutToEditCustomValue(String value,
int times) {
comboBox.view.listBoxGotFocus();
comboBox.listBoxValueChanged(this.editPrefix + value + this.editSuffix);
assertEquals(listBox.isVisible(),
false);
assertEquals(textBox.isVisible(),
true);
verify(modelPresenter,
times(times)).setTextBoxModelValue(textBox,
value);
assertEquals(textBox.getValue(),
value);
}
private void editCustomValue(String value) {
comboBox.view.textBoxGotFocus();
textBox.setValue(value);
comboBox.view.textBoxLostFocus();
comboBox.view.listBoxGotFocus();
assertEquals(listBox.isVisible(),
true);
assertEquals(textBox.isVisible(),
false);
String listBoxValue = this.quoteStringValues ? StringUtils.createQuotedConstant(value) : value;
verify(modelPresenter).setTextBoxModelValue(textBox,
listBoxValue);
assertEquals(comboBox.getValue(),
listBoxValue);
}
}