// 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 javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
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;
public class BindingsSubclassTest extends TestCase {
@Bindable
public static class View {
@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();
@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();
int count1 = 0;
@CallOnUpdate(model = "demoModel")
public void callback1() {
count1++;
}
int count2 = 0;
@CallOnUpdate(model = "demoModel", on = "LIST")
public void callback2() {
count2++;
}
int duplicateCount = 0;
public void duplicate() {
duplicateCount++;
}
int testCount = 0;
public void count() {
testCount++;
}
}
private static class SubView extends View {
//do nothing
}
private final View view = new SubView();
@Override
protected void setUp() throws Exception {
view.bindings.bind(view);
}
public void testDuplicateMethods() {
assertEquals(0, view.duplicateCount);
assertEquals(0, view.controller.duplicateCount);
view.dup1.doClick();
assertEquals(0, view.duplicateCount);
assertEquals(1, view.controller.duplicateCount);
view.dup2.doClick();
assertEquals(1, view.duplicateCount);
assertEquals(1, view.controller.duplicateCount);
}
boolean thisBoolean;
public void setThisBoolean(boolean state) {
thisBoolean = state;
}
public boolean isThisBoolean() {
return thisBoolean;
}
public void testOne() {
assertEquals(false, view.demoModel.isDemoBoolean());
view.demoBooleanCheckBox.doClick();
assertEquals(true, view.demoModel.isDemoBoolean());
}
public void testTwo() {
assertEquals(false, view.demoBooleanCheckBox.isSelected());
view.demoModel.setDemoBoolean(true);
assertEquals(true, view.demoBooleanCheckBox.isSelected());
}
public void testDoActionFar() {
assertEquals(0, view.controller.demo1ActionCount);
view.demoButton1.doClick();
assertEquals(1, view.controller.demo1ActionCount);
}
public void testTextField() {
assertEquals("", view.demoModel.getDemoString());
view.textField.setText("abc");
assertEquals("abc", view.demoModel.getDemoString());
view.demoModel.setDemoString("def");
assertEquals("def", view.textField.getText());
}
public void testLabel() {
assertEquals("", view.demoModel.getDemoString());
view.demoModel.setDemoString("def");
assertEquals("def", view.label.getText());
}
// public void testLocal() {
// assertEquals(false, thisBoolean);
// thisBooleanCheckBox.doClick();
// assertEquals(true, thisBoolean);
// }
public void testDoActionLocal() {
assertEquals(0, view.testCount);
view.countButton.doClick();
assertEquals(1, view.testCount);
}
public void testRadioButtons() {
view.demoModel.setDemoEnum(DemoEnum.FOO);
assertEquals(DemoEnum.FOO, view.demoModel.getDemoEnum());
view.barButton.doClick();
assertEquals(DemoEnum.BAR, view.demoModel.getDemoEnum());
view.demoModel.setDemoEnum(DemoEnum.BAZ);
assertEquals(true, view.bazButton.isSelected());
view.setToFooButton.doClick();
assertEquals(true, view.fooButton.isSelected());
assertEquals(DemoEnum.FOO, view.demoModel.getDemoEnum());
}
public void testCallbacks() {
assertEquals(1, view.count1);
assertEquals(1, view.count2);
view.demoModel.update();
assertEquals(2, view.count1);
assertEquals(1, view.count2);
view.demoModel.modelUpdated(DemoModel.UpdateType.LIST);
assertEquals(3, view.count1);
assertEquals(2, view.count2);
view.demoModel.modelUpdated(DemoModel.UpdateType.OTHER);
assertEquals(4, view.count1);
assertEquals(2, view.count2);
view.demoModel.modelUpdated(ModelUpdates.ALL);
assertEquals(5, view.count1);
assertEquals(3, view.count2);
}
public void testList1() {
assertEquals("Quick", view.demoList.getModel().getElementAt(0));
assertEquals(5, view.demoList.getModel().getSize());
view.changeList.doClick();
assertEquals("The", view.demoList.getModel().getElementAt(0));
assertEquals(7, view.demoList.getModel().getSize());
}
public void testList2() {
view.demoList.setSelectedIndex(1);
assertEquals("Quickly", view.demoModel.getSelectedItem());
view.changeSelection.doClick();
assertEquals("Fox", view.demoModel.getSelectedItem());
view.demoModel.setSelectedItem("Quick");
assertEquals("Quick", view.demoList.getSelectedValue());
}
}