/*******************************************************************************
* Copyright (c) 2014 Bruno Medeiros and other Contributors.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Bruno Medeiros - initial API and implementation
*******************************************************************************/
package melnorme.util.swt.components.fields;
import static melnorme.utilbox.core.Assert.AssertNamespace.assertTrue;
import org.eclipse.swt.SWT;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.RGB;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Combo;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import melnorme.util.swt.components.AbstractFieldComponentTest;
import melnorme.util.swt.components.AbstractWidgetTest;
import melnorme.utilbox.misc.ArrayUtil;
import melnorme.utilbox.misc.StringUtil;
import melnorme.utilbox.tests.CommonTest;
public abstract class FieldWidget_Tests extends CommonTest {
public static class TextFieldTest extends AbstractFieldComponentTest {
protected TextFieldWidget field;
@Override
public TextFieldWidget createField() {
return field = new TextFieldWidget("") {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
};
};
}
@Override
protected Object getValueFromControl() {
return field.getFieldControl().getText();
}
@Override
public void setFirstFieldValue() {
field.setFieldValue("blah");
}
@Override
public void setSecondFieldValue() {
field.setFieldValue("foo");
}
@Override
public void doChangeFromControl() {
field.getFieldControl().setText("setText");
}
@Override
protected void runTestWithCreatedComponent_extra() {
field.setFieldValue("blah");
field.getFieldControl().setTextLimit(5);
valueChangeCount_expected = valueChangeCount;
controlsUpdateCount_expected = controlsUpdateCount;
// test non-identical value update
field.setFieldValue("1234567");
assertEquals(field.getFieldValue(), "12345");
valueChangeCount_expected++; controlsUpdateCount_expected++;
__checkUpdatesInvariant();
}
}
public static class TextField_SelectionTest extends AbstractWidgetTest {
@Override
protected void doRunTest(Shell shell) {
TextFieldWidget textFieldWidget = new TextFieldWidget("blah");
textFieldWidget.createComponent(shell);
textFieldWidget.set("1234");
Text textControl = textFieldWidget.getFieldControl();
assertTrue(textControl.getCaretPosition() == 0);
checkSelection(textControl, 0, 0);
textControl.setSelection(1, 3);
checkSelection(textControl, 1, 3);
textFieldWidget.doUpdateWidgetFromInput();
checkSelection(textControl, 1, 3);
textFieldWidget.set("123");
checkSelection(textControl, 0, 0);
}
protected void checkSelection(Text textControl, int start, int end) {
assertTrue(textControl.getSelection().equals(new Point(start, end)));
}
}
public static class TextField_ExtTest extends TextFieldTest {
@Override
public TextFieldWidget createField() {
return field = new TextFieldWidget("") {
@Override
protected void doSetFieldValue(String value) {
if(value.contains("XXX")) {
return; // Cancel field update. Controls remain unused
}
super.doSetFieldValue(value);
}
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
};
};
}
@Override
protected void doRunTest(Shell shell) {
field.setFieldValue("aaa");
assertEquals(field.getFieldValue(), "aaa");
field.setFieldValue("aXXXa");
assertEquals(field.getFieldValue(), "aaa");
field.createComponent(shell);
field.setFieldValue("aXXXa");
assertEquals(field.getFieldValue(), "aaa");
assertEquals(field.getFieldControl().getText(), "aaa");
field.getFieldControl().setText("aXXXa");
assertEquals(field.getFieldValue(), "aaa");
assertEquals(field.getFieldControl().getText(), "aXXXa");
}
@Override
protected void runTestWithCreatedComponent() {
}
}
public static class SpinnerNumberFieldTest extends AbstractFieldComponentTest {
protected SpinnerNumberField field;
@Override
public SpinnerNumberField createField() {
return field = new SpinnerNumberField("blah") {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
};
};
}
@Override
protected Object getValueFromControl() {
return field.getSpinner().getSelection();
}
@Override
public void setFirstFieldValue() {
field.setFieldValue(10);
}
@Override
public void setSecondFieldValue() {
field.setFieldValue(20);
}
@Override
public void doChangeFromControl() {
field.getSpinner().setSelection(30);
}
@Override
protected void runTestWithCreatedComponent_extra() {
field.setValueMinimum(100);
// assertTrue(field.getFieldValue() == 100);
}
}
public static class TextField2Test extends AbstractFieldComponentTest {
protected TextFieldExt field;
@Override
public TextFieldExt createField() {
return field = new TextFieldExt("blah", 20) {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
}
};
}
@Override
protected Object getValueFromControl() {
return field.getFieldControl().getText();
}
@Override
public void setFirstFieldValue() {
field.setFieldValue("blah");
}
@Override
public void setSecondFieldValue() {
field.setFieldValue("foo");
}
@Override
public void doChangeFromControl() {
field.getFieldControl().setText("setText");
}
}
public static class CheckBoxFieldTest extends AbstractFieldComponentTest {
protected CheckBoxField field;
@Override
public CheckBoxField createField() {
return field = new CheckBoxField("blah") {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
}
};
}
@Override
protected Object getValueFromControl() {
return field.getFieldControl().getSelection();
}
@Override
public void setFirstFieldValue() {
field.setFieldValue(true);
}
@Override
public void setSecondFieldValue() {
field.setFieldValue(false);
}
@Override
public void doChangeFromControl() {
field.getFieldControl().setSelection(true);
field.getFieldControl().notifyListeners(SWT.Selection, null);
}
}
public static class ComboBoxFieldTest extends AbstractFieldComponentTest {
protected ComboBoxField field;
protected static String[] VALUES = array(":0", ":1", ":2");
protected static String[] LABELS = array("zero", "one", "two");
@Override
public ComboBoxField createField() {
return field = new ComboBoxField("blah", LABELS, VALUES) {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
}
};
}
@Override
protected Object getValueFromControl() {
return field.getFieldControl().getSelectionIndex();
}
@Override
public void setFirstFieldValue() {
field.setFieldValue(2);
}
@Override
public void setSecondFieldValue() {
field.setFieldValue(0);
}
@Override
public void doChangeFromControl() {
field.getFieldControl().setText("one");
field.getFieldControl().notifyListeners(SWT.Selection, null);
}
@Override
protected void runTestWithCreatedComponent_extra() {
field.setFieldValue(0);
assertEquals(field.getFieldStringValue(), ":0");
field.setFieldStringValue(":2");
assertEquals(field.getFieldValue(), 2);
field.setFieldValue(-1);
assertEquals(field.getFieldValue(), -1);
assertEquals(field.getFieldStringValue(), "");
}
}
public static enum Values {
ZERO("0"),
ONE("One"),
TWO("Two"),
THREE("3");
private String toString;
Values(String toString) {
this.toString = toString;
}
@Override
public String toString() {
return toString;
}
}
public static class RadioSelectionFieldTest extends AbstractFieldComponentTest {
protected RadioSelectionField<Values> field;
@Override
public RadioSelectionField<Values> createField() {
return field = new RadioSelectionField<Values>(Values.values()) {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
}
};
}
@Override
public void setFirstFieldValue() {
field.setFieldValue(Values.TWO);
}
@Override
public void setSecondFieldValue() {
field.setFieldValue(Values.ZERO);
}
@Override
public void doChangeFromControl() {
Button[] radioControls = field.getRadioControls();
radioControls[field.getSelectionIndex()].setSelection(false);
radioControls[1].setSelection(true);
for (Button button : radioControls) {
button.notifyListeners(SWT.Selection, null);
}
}
@Override
protected Object getValueFromControl() {
return field.getValueFromControl();
}
@Override
protected void runTestWithCreatedComponent_extra() {
assertTrue(field.getFieldValue() == Values.ZERO);
checkSelectionCount(1);
field.setFieldValue(Values.TWO);
assertTrue(field.getFieldValue() == Values.TWO);
checkSelectionCount(1);
field.setFieldValue(null);
assertEquals(field.getFieldValue(), Values.ZERO);
checkSelectionCount(1);
}
protected void checkSelectionCount(int selectionCount) {
int count = 0;
for (Button button : field.getRadioControls()) {
if(button.getSelection()) {
count++;
}
}
assertTrue(count == selectionCount);
}
}
public static class ComboOptionsFieldComponentTest extends AbstractFieldComponentTest {
protected ComboOptionsField field;
@Override
public ComboOptionsField createField() {
field = new ComboOptionsField("label") {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
}
};
field.setFieldOptions(
ArrayUtil.map(Values.values(), (Values value) -> value.toString(), String.class));
return field;
}
@Override
protected void checkValueIsNotNull() {
//
}
@Override
protected void doRunTest(Shell shell) {
testSetComboOptions(shell, false);
testSetComboOptions(shell, true);
ComboOptionsField comboField = new ComboOptionsField("blah");
comboField.setFieldOptions(array("1", "2", "3"));
comboField.setFieldValue("2");
comboField.createComponent(shell);
checkComboValues(comboField, "2");
comboField.setFieldOptions(array("abc", "xxx"));
assertTrue(comboField.getFieldControl().getSelectionIndex() == 0);
assertTrue(comboField.getFieldControl().getText().equals("abc"));
comboField.setFieldOptions(array());
assertTrue(comboField.getFieldControl().getSelectionIndex() == -1);
assertTrue(comboField.getFieldControl().getText().equals(""));
testSetFieldValue(comboField, "InvalidValue", null);
testSetFieldValue(comboField, null, null);
// -----------
comboField.setFieldOptions("One", "Two");
testSetFieldValue(comboField, "InvalidValue", "One");
testSetFieldValue(comboField, "One", "One");
testSetFieldValue(comboField, null, "One");
testSetValueFromControl(comboField, "One", "One");
testSetValueFromControl(comboField, "Blah", "One");
super.doRunTest(shell);
}
protected void testSetComboOptions(Composite parent, boolean createComponent) {
ComboOptionsField comboField = new ComboOptionsField("label");
if(createComponent) {
comboField.createComboControl(parent);
}
assertAreEqual(comboField.getFieldValue(), null);
comboField.setFieldOptions(array("1", "2", "3"));
comboField.setFieldValue("2");
comboField.setFieldOptions(array("1", "xxx", "2", "b"));
assertAreEqual(comboField.getFieldValue(), "2");
comboField.setFieldOptions(array("a", "b", "c"));
assertAreEqual(comboField.getFieldValue(), "a");
}
public static void testSetValueFromControl(ComboOptionsField comboField, String newValue,
String expectedFieldValue) {
setFromControl(comboField.getFieldControl(), newValue);
checkComboValues(comboField, expectedFieldValue);
}
public static void testSetFieldValue(ComboOptionsField comboField, String newValue,
String expectedFieldValue) {
comboField.setFieldValue(newValue);
checkComboValues(comboField, expectedFieldValue);
}
public static void checkComboValues(ComboOptionsField comboField, String expectedFieldValue) {
assertEquals(expectedFieldValue == null, comboField.getFieldControl().getSelectionIndex() == -1);
String expectedControl = StringUtil.nullAsEmpty(expectedFieldValue);
assertAreEqual(comboField.getFieldControl().getText(), expectedControl);
assertAreEqual(comboField.getFieldValue(), expectedFieldValue);
}
@Override
public void setFirstFieldValue() {
field.setFieldValue(Values.TWO.toString());
}
@Override
public void setSecondFieldValue() {
field.setFieldValue(Values.ZERO.toString());
}
@Override
public void doChangeFromControl() {
setFromControl(field.getFieldControl(), field.getFieldValue());
}
public static void setFromControl(Combo combo, String newText) {
combo.setText(newText);
combo.notifyListeners(SWT.Selection, null);
}
@Override
protected Object getValueFromControl() {
return field.combo.getText();
}
}
public static class ColorFieldTest extends AbstractFieldComponentTest {
protected ColorField field;
@Override
public ColorField createField() {
return field = new ColorField("blah") {
@Override
protected void doUpdateWidgetFromValue() {
controlsUpdateCount++;
super.doUpdateWidgetFromValue();
}
};
}
@Override
protected Object getValueFromControl() {
return field.getColorSelector().getColorValue();
}
@Override
public void setFirstFieldValue() {
field.setFieldValue(new RGB(1, 1, 1));
}
@Override
public void setSecondFieldValue() {
field.setFieldValue(new RGB(2, 2, 2));
}
@Override
public void doChangeFromControl() {
field.getColorSelector().setColorValue(new RGB(3, 3, 3));
}
}
}