// Copyright 2011 Palantir Technologies // // 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 com.palantir.ptoss.cinch; import java.util.List; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.ListSelectionModel; import com.google.common.collect.ImmutableList; import com.palantir.ptoss.cinch.core.Bindable; import com.palantir.ptoss.cinch.core.Bindings; import com.palantir.ptoss.cinch.core.CallOnUpdate; import com.palantir.ptoss.cinch.core.ModelUpdates; import com.palantir.ptoss.cinch.example.demo.DemoController; import com.palantir.ptoss.cinch.example.demo.DemoModel; import com.palantir.ptoss.cinch.example.demo.DemoModel.DemoEnum; import com.palantir.ptoss.cinch.swing.Action; import com.palantir.ptoss.cinch.swing.Bound; import com.palantir.ptoss.cinch.swing.BoundSelection; import junit.framework.TestCase; @Bindable public class BindingsTest extends TestCase { @Bound(to = "demoBoolean") // TODO: autodiscover bound variable name private final JCheckBox demoBooleanCheckBox = new JCheckBox("demoBoolean"); // @Bound(to = "thisBoolean") // TODO: autodiscover bound variable name // private final JCheckBox thisBooleanCheckBox = new JCheckBox("thisBoolean"); @Action(call = "demoAction") // @EnabledIf(method = "isDemoBoolean") private final JButton demoButton1 = new JButton("demo1"); @Action(call = "demoAction2") private final JButton demoButton2 = new JButton("demo2"); @Action(call = "count") private final JButton countButton = new JButton("count"); private final DemoModel demoModel = new DemoModel(); @Bindable private final DemoController controller = new DemoController(demoModel); @Bound(to = "demoEnum", value = "FOO") private final JRadioButton fooButton = new JRadioButton("Foo"); @Bound(to = "demoEnum", value = "BAR") private final JRadioButton barButton = new JRadioButton("Bar"); @Bound(to = "demoEnum", value = "BAZ") private final JRadioButton bazButton = new JRadioButton("Baz (Red Background)"); @Action(call = "setToFoo") private final JButton setToFooButton = new JButton("Foo"); @Bound(to = "demoList", on = "LIST") @BoundSelection(to = "selectedItem") private final JList demoList = new JList(); @Bound(to = "demoMultiList", on = "MULTILIST") @BoundSelection(to = "multiSelectedItems", multi = true) private final JList demoMultiselectList = new JList(); @Action(call = "changeList") private final JButton changeList = new JButton("Change List"); @Action(call = "selectFox") private final JButton changeSelection = new JButton("Select Fox"); @Action(call = "controller.duplicate") private final JButton dup1 = new JButton("dup1"); @Action(call = "this.duplicate") private final JButton dup2 = new JButton("dup2"); @Bound(to = "demoString") private final JTextField textField = new JTextField(); @Bound(to = "demoString") private final JLabel label = new JLabel(); private final Bindings bindings = new Bindings(); @Override protected void setUp() throws Exception { bindings.bind(this); } public void testDuplicateMethods() { assertEquals(0, duplicateCount); assertEquals(0, controller.duplicateCount); dup1.doClick(); assertEquals(0, duplicateCount); assertEquals(1, controller.duplicateCount); dup2.doClick(); assertEquals(1, duplicateCount); assertEquals(1, controller.duplicateCount); } int duplicateCount = 0; public void duplicate() { duplicateCount++; } int testCount = 0; public void count() { testCount++; } boolean thisBoolean; public void setThisBoolean(boolean state) { thisBoolean = state; } public boolean isThisBoolean() { return thisBoolean; } public void testOne() { assertEquals(false, demoModel.isDemoBoolean()); demoBooleanCheckBox.doClick(); assertEquals(true, demoModel.isDemoBoolean()); } public void testTwo() { assertEquals(false, demoBooleanCheckBox.isSelected()); demoModel.setDemoBoolean(true); assertEquals(true, demoBooleanCheckBox.isSelected()); } public void testDoActionFar() { assertEquals(0, controller.demo1ActionCount); demoButton1.doClick(); assertEquals(1, controller.demo1ActionCount); } public void testTextField() { assertEquals("", demoModel.getDemoString()); textField.setText("abc"); assertEquals("abc", demoModel.getDemoString()); demoModel.setDemoString("def"); assertEquals("def", textField.getText()); } public void testLabel() { assertEquals("", demoModel.getDemoString()); demoModel.setDemoString("def"); assertEquals("def", label.getText()); } // public void testLocal() { // assertEquals(false, thisBoolean); // thisBooleanCheckBox.doClick(); // assertEquals(true, thisBoolean); // } public void testDoActionLocal() { assertEquals(0, testCount); countButton.doClick(); assertEquals(1, testCount); } public void testRadioButtons() { demoModel.setDemoEnum(DemoEnum.FOO); assertEquals(DemoEnum.FOO, demoModel.getDemoEnum()); barButton.doClick(); assertEquals(DemoEnum.BAR, demoModel.getDemoEnum()); demoModel.setDemoEnum(DemoEnum.BAZ); assertEquals(true, bazButton.isSelected()); setToFooButton.doClick(); assertEquals(true, fooButton.isSelected()); assertEquals(DemoEnum.FOO, demoModel.getDemoEnum()); } int count1 = 0; @CallOnUpdate(model = "demoModel") public void callback1() { count1++; } int count2 = 0; @CallOnUpdate(model = "demoModel", on = "LIST") public void callback2() { count2++; } public void testCallbacks() { assertEquals(1, count1); assertEquals(1, count2); demoModel.update(); assertEquals(2, count1); assertEquals(1, count2); demoModel.modelUpdated(DemoModel.UpdateType.LIST); assertEquals(3, count1); assertEquals(2, count2); demoModel.modelUpdated(DemoModel.UpdateType.OTHER); assertEquals(4, count1); assertEquals(2, count2); demoModel.modelUpdated(ModelUpdates.ALL); assertEquals(5, count1); assertEquals(3, count2); } public void testList1() { assertEquals("Quick", demoList.getModel().getElementAt(0)); assertEquals(5, demoList.getModel().getSize()); changeList.doClick(); assertEquals("The", demoList.getModel().getElementAt(0)); assertEquals(7, demoList.getModel().getSize()); } public void testList2() { demoList.setSelectedIndex(1); assertEquals("Quickly", demoModel.getSelectedItem()); changeSelection.doClick(); assertEquals("Fox", demoModel.getSelectedItem()); demoModel.setSelectedItem("Quick"); assertEquals("Quick", demoList.getSelectedValue()); } public void testMultiList() { demoMultiselectList.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION); assertEquals(0, demoMultiselectList.getSelectedValues().length); demoMultiselectList.setSelectedIndices(new int[] { 1, 2, 4 }); List<String> items = demoModel.getMultiSelectedItems(); assertEquals(3, items.size()); assertEquals("bravo", items.get(0)); assertEquals("charlie", items.get(1)); assertEquals("echo", items.get(2)); demoModel.setMultiSelectedItems(ImmutableList.of("bravo", "delta")); Object[] selectedValues = demoMultiselectList.getSelectedValues(); assertEquals("bravo", selectedValues[0]); assertEquals("delta", selectedValues[1]); } }