UNPKG

@qooxdoo/framework

Version:

The JS Framework for Coders

913 lines (703 loc) 27.3 kB
/* ************************************************************************ qooxdoo - the new era of web development http://qooxdoo.org Copyright: 2004-2009 1&1 Internet AG, Germany, http://www.1und1.de License: MIT: https://opensource.org/licenses/MIT See the LICENSE file in the project's top-level directory for details. Authors: * Martin Wittemann (martinwittemann) ************************************************************************ */ qx.Class.define("qx.test.data.controller.Form", { extend : qx.dev.unit.TestCase, members : { __form : null, __tf1 : null, __tf2 : null, __cb : null, __model : null, setUp : function() { // create the objects this.__form = new qx.ui.form.Form(); this.__tf1 = new qx.ui.form.TextField(); this.__tf2 = new qx.ui.form.TextField("init"); this.__cb = new qx.ui.form.CheckBox(); this.__model = qx.data.marshal.Json.createModel({tf1: null, tf2: null, cb: null}); // build the form this.__form.add(this.__tf1, "label1", null, "tf1"); this.__form.add(this.__tf2, "label2", null, "tf2"); this.__form.add(this.__cb, "label3", null, "cb"); }, tearDown : function() { this.__form.dispose(); this.__model.dispose(); this.__tf1.dispose(); this.__tf2.destroy(); this.__cb.destroy(); }, testSetModelNull : function() { var c = new qx.data.controller.Form(this.__model, this.__form); // set some values this.__tf1.setValue("1111"); this.__tf2.setValue("2222"); this.__cb.setValue(true); // set model to null c.setModel(null); // all values should be null as well this.assertNull(this.__tf1.getValue()); this.assertNull(this.__tf2.getValue()); this.assertFalse(this.__cb.getValue()); c.dispose(); }, testInitialResetter : function() { // create the controller which set the initial values and // saves them for resetting var c = new qx.data.controller.Form(this.__model, this.__form); this.__tf2.setValue("affe"); this.__form.reset(); this.assertEquals(null, this.__tf2.getValue()); c.dispose(); }, testUnidirectionalDeep: function() { this.__form.dispose(); this.__form = new qx.ui.form.Form(); this.__form.add(this.__tf1, "label1", null, "a.tf1"); this.__form.add(this.__tf2, "label2", null, "a.tf2"); // just create the controller var c = new qx.data.controller.Form(null, this.__form, true); var model = c.createModel(); // check if the binding from the model to the view works model.getA().setTf1("affe"); this.assertEquals("affe", this.__tf1.getValue()); // check if the other direction does not work this.__tf2.setValue("affee"); this.assertEquals("init", model.getA().getTf2()); // use the commit method c.updateModel(); this.assertEquals("affee", model.getA().getTf2()); // destroy the controller c.dispose(); model.dispose(); }, testUnidirectionalSelectionOptions: function(){ // just create the controller var c = new qx.data.controller.Form(this.__model, this.__form, true); var sb = new qx.ui.form.SelectBox(); var i1 = new qx.ui.form.ListItem("a").set({model: "a"}); var i2 = new qx.ui.form.ListItem("b").set({model: "b"}); sb.add(i1); sb.add(i2); this.__form.add(sb, "Sb"); c.setModel(null); c.addBindingOptions("Sb", {converter : function(data) { return data && data.substr(0, 1);}}, {converter : function(data) { return data + "-item";}} ); var m = c.createModel(); // check that the init value is set this.assertEquals("a-item", m.getSb()); sb.setSelection([i2]); this.assertEquals("a-item", m.getSb()); c.updateModel(); this.assertEquals("b-item", m.getSb()); // destroy sb.dispose(); c.dispose(); m.dispose(); }, testUnidirectionalOptions: function(){ // just create the controller var c = new qx.data.controller.Form(this.__model, this.__form, true); c.addBindingOptions("tf1", {converter : function(data) { return data && data.substr(0, data.length - 1);}}, {converter : function(data) { return data + "a";}} ); // check if the other direction does not work this.__tf1.setValue("affe"); this.assertEquals(null, this.__model.getTf1()); // use the commit method c.updateModel(); this.assertEquals("affea", this.__model.getTf1()); // destroy the controller c.dispose(); }, testUnidirectionalSelection: function(){ // just create the controller var c = new qx.data.controller.Form(this.__model, this.__form, true); var sb = new qx.ui.form.SelectBox(); var i1 = new qx.ui.form.ListItem("a").set({model: "a"}); var i2 = new qx.ui.form.ListItem("b").set({model: "b"}); sb.add(i1); sb.add(i2); this.__form.add(sb, "Sb"); var m = c.createModel(); // check that the init value is set this.assertEquals("a", m.getSb()); sb.setSelection([i2]); this.assertEquals("a", m.getSb()); c.updateModel(); this.assertEquals("b", m.getSb()); // destroy sb.dispose(); c.dispose(); m.dispose(); }, testUnidirectional: function(){ // just create the controller var c = new qx.data.controller.Form(this.__model, this.__form, true); // check if the binding from the model to the view works this.__model.setTf1("affe"); this.assertEquals("affe", this.__tf1.getValue()); // check if the other direction does not work this.__tf2.setValue("affee"); this.assertEquals(null, this.__model.getTf2()); // use the commit method c.updateModel(); this.assertEquals("affee", this.__model.getTf2()); // destroy the controller c.dispose(); }, testCreateEmpty : function() { // just create the controller var c = new qx.data.controller.Form(); // check the defaults for the properties this.assertNull(c.getModel()); this.assertNull(c.getTarget()); // destroy the controller c.dispose(); }, testCreateWithModel : function() { // just create the controller var c = new qx.data.controller.Form(this.__model); // check for the properties this.assertEquals(this.__model, c.getModel()); this.assertNull(c.getTarget()); // destroy the objects c.dispose(); }, testCreateWithForm : function() { // just create the controller var c = new qx.data.controller.Form(null, this.__form); // check for the properties this.assertEquals(this.__form, c.getTarget()); this.assertNull(c.getModel()); // destroy the objects c.dispose(); }, testCreateWithBoth : function() { // just create the controller var c = new qx.data.controller.Form(this.__model, this.__form); // check for the properties this.assertEquals(this.__form, c.getTarget()); this.assertEquals(this.__model, c.getModel()); // destroy the objects c.dispose(); }, testBindingCreate : function() { // create the controller var c = new qx.data.controller.Form(this.__model, this.__form); // set values in the form this.__tf1.setValue("1"); this.__tf2.setValue("2"); this.__cb.setValue(true); // check the binding this.assertEquals(this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); this.assertEquals(this.__cb.getValue(), this.__model.getCb()); // change the values this.__tf1.setValue("11"); this.__tf2.setValue("21"); this.__cb.setValue(false); // check the binding this.assertEquals(this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); this.assertEquals(this.__cb.getValue(), this.__model.getCb()); // change the data in the model this.__model.setTf1("a"); this.__model.setTf2("b"); this.__model.setCb(true); // check the binding this.assertEquals(this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); this.assertEquals(this.__cb.getValue(), this.__model.getCb()); // destroy the objects c.dispose(); }, testBindingChangeModel : function() { // create the controller var c = new qx.data.controller.Form(this.__model, this.__form); // set values in the form this.__tf1.setValue("1"); this.__tf2.setValue("2"); this.__cb.setValue(true); // check the binding this.assertEquals(this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); this.assertEquals(this.__cb.getValue(), this.__model.getCb()); var model2 = qx.data.marshal.Json.createModel({tf1: null, tf2: null, cb: null}); c.setModel(model2); // set values in the form this.__tf1.setValue("11"); this.__tf2.setValue("22"); this.__cb.setValue(false); // check the new model this.assertEquals(this.__tf1.getValue(), model2.getTf1()); this.assertEquals(this.__tf2.getValue(), model2.getTf2()); this.assertEquals(this.__cb.getValue(), model2.getCb()); // check the old model this.assertEquals("1", this.__model.getTf1()); this.assertEquals("2", this.__model.getTf2()); this.assertEquals(true, this.__model.getCb()); model2.dispose(); c.dispose(); }, testBindingChangeForm : function() { // create the controller var c = new qx.data.controller.Form(this.__model, this.__form); // set values in the form this.__tf1.setValue("1"); this.__tf2.setValue("2"); this.__cb.setValue(true); // check the binding this.assertEquals(this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); this.assertEquals(this.__cb.getValue(), this.__model.getCb()); // create a new form var form = new qx.ui.form.Form(); var tf1 = new qx.ui.form.TextField(); var tf2 = new qx.ui.form.TextField("init"); var cb = new qx.ui.form.CheckBox(); form.add(tf1, "tf1"); form.add(tf2, "tf2"); form.add(cb, "cb"); c.setTarget(form); // set the values in the new form tf1.setValue("11"); tf2.setValue("22"); cb.setValue(false); // check the binding this.assertEquals(tf1.getValue(), this.__model.getTf1()); this.assertEquals(tf2.getValue(), this.__model.getTf2()); this.assertEquals(cb.getValue(), this.__model.getCb()); // check the old from this.assertEquals(this.__tf1.getValue(), "1"); this.assertEquals(this.__tf2.getValue(), "2"); this.assertEquals(this.__cb.getValue(), true); form.dispose(); tf1.destroy(); tf2.destroy(); cb.destroy(); c.dispose(); }, testBindingDeep : function() { // a - b - cb // | \ // tf1 c // \ // tf2 var data = {a: {tf1: null}, b:{c: {tf2: null}}, cb: null}; var model = qx.data.marshal.Json.createModel(data); // create the form var form = new qx.ui.form.Form(); var tf1 = new qx.ui.form.TextField(); var tf2 = new qx.ui.form.TextField(); var cb = new qx.ui.form.CheckBox(); // add the form incl. deep binding instructions form.add(tf1, "label1", null, "a.tf1"); form.add(tf2, "label2", null, "b.c.tf2"); form.add(cb, "label3", null, "cb"); // create the controller var c = new qx.data.controller.Form(model, form); // set the values in the model model.getA().setTf1("1"); model.getB().getC().setTf2("2"); model.setCb(true); // check the binding this.assertEquals(tf1.getValue(), model.getA().getTf1()); this.assertEquals(tf2.getValue(), model.getB().getC().getTf2()); this.assertEquals(cb.getValue(), model.getCb()); // set the values in the form items tf1.setValue("11"); tf2.setValue("22"); cb.setValue(false); // check the binding this.assertEquals(tf1.getValue(), model.getA().getTf1()); this.assertEquals(tf2.getValue(), model.getB().getC().getTf2()); this.assertEquals(cb.getValue(), model.getCb()); c.dispose(); model.dispose(); form.dispose(); tf1.destroy(); tf2.destroy(); cb.destroy(); }, testBindingModelSelection : function() { // create a select box var selectBox = new qx.ui.form.SelectBox(); var i1 = new qx.ui.form.ListItem("a"); i1.setModel("1"); var i2 = new qx.ui.form.ListItem("b"); i2.setModel("2"); selectBox.add(i1); selectBox.add(i2); // add the selectBox to the form this.__form.add(selectBox, "sb"); var model = qx.data.marshal.Json.createModel({tf1: null, tf2: null, cb: null, sb: null}); // create the controller var c = new qx.data.controller.Form(model, this.__form); // set the selection selectBox.setSelection([i1]); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); // set the model model.setSb("2"); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); c.dispose(); model.dispose(); i2.destroy(); i1.destroy(); selectBox.destroy(); }, testModelCreation : function() { // set some initial values in the form this.__tf1.setValue("A"); this.__tf2.setValue("B"); this.__cb.setValue(true); // create the controller var c = new qx.data.controller.Form(null, this.__form); c.addBindingOptions("tf1", {converter : function(data) { return data && data.substr(0, 1); }}, {converter : function(data) { return data + "-"; }} ); var model = c.createModel(); // check if the model and the form still have the initial value this.assertEquals("A", this.__tf1.getValue()); this.assertEquals("B", this.__tf2.getValue()); this.assertTrue(this.__cb.getValue()); this.assertEquals("A-", model.getTf1()); this.assertEquals("B", model.getTf2()); this.assertTrue(model.getCb()); // set values in the form this.__tf1.setValue("1"); this.__tf2.setValue("2"); this.__cb.setValue(true); // check the binding this.assertEquals(this.__tf1.getValue() + "-", model.getTf1()); this.assertEquals(this.__tf2.getValue(), model.getTf2()); this.assertEquals(this.__cb.getValue(), model.getCb()); // change the values this.__tf1.setValue("11"); this.__tf2.setValue("21"); this.__cb.setValue(false); // check the binding this.assertEquals(this.__tf1.getValue() + "-", model.getTf1()); this.assertEquals(this.__tf2.getValue(), model.getTf2()); this.assertEquals(this.__cb.getValue(), model.getCb()); // change the data in the model this.__model.setTf1("a"); this.__model.setTf2("b"); this.__model.setCb(true); // check the binding this.assertEquals(this.__tf1.getValue() + "-", model.getTf1()); this.assertEquals(this.__tf2.getValue(), model.getTf2()); this.assertEquals(this.__cb.getValue(), model.getCb()); // destroy the objects c.dispose(); model.dispose(); }, testModelCreationDeep : function() { var form = new qx.ui.form.Form(); var tf1 = new qx.ui.form.TextField("A"); var tf2 = new qx.ui.form.TextField("B"); form.add(tf1, null, null, "a.b1"); form.add(tf2, null, null, "a.b2.c"); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(true); // check if the creation worked this.assertEquals("A", model.getA().getB1()); this.assertEquals("B", model.getA().getB2().getC()); model.dispose(); controller.dispose(); tf1.destroy(); tf2.destroy(); form.dispose(); }, testModelCreationWithList : function() { var form = new qx.ui.form.Form(); var list = new qx.ui.form.List(); var i1 = new qx.ui.form.ListItem("A"); var i2 = new qx.ui.form.ListItem("B"); list.add(i1); list.add(i2); i1.setModel("A"); i2.setModel("B"); list.setSelection([]); form.add(list, "list"); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(); // check if the creation worked this.assertNull(model.getList()); list.setSelection([i1]); this.assertEquals("A", model.getList()); model.dispose(); controller.dispose(); list.destroy(); i1.destroy(); i2.destroy(); form.dispose(); }, testModelCreationSpecialCaracter : function() { var form = new qx.ui.form.Form(); var tf1 = new qx.ui.form.TextField("A"); form.add(tf1, "a&b-c+d*e/f|g!h i.,:?;!~+-*/%{}()[]<>=^&|@/\\"); var controller = new qx.data.controller.Form(null, form); var model = controller.createModel(true); // check if the creation worked this.assertEquals("A", model.getAbcdefghi()); model.dispose(); controller.dispose(); tf1.destroy(); form.dispose(); }, testModelCreationWithListController : function() { // create a select box var selectBox = new qx.ui.form.SelectBox(); var listModel = qx.data.marshal.Json.createModel([{name: "a"}, {name: "b"}]); var listController = new qx.data.controller.List(listModel, selectBox, "name"); // add the selectBox to the form this.__form.add(selectBox, "sb"); // select something which is not the default selection listController.getSelection().setItem(0, listModel.getItem(1)); // create the controller var c = new qx.data.controller.Form(null, this.__form); var model = c.createModel(); // check the init value of the model selection this.assertEquals(listModel.getItem(1), model.getSb()); // set the selection listController.getSelection().setItem(0, listModel.getItem(0)); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); // set the model model.setSb(listModel.getItem(1)); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); c.dispose(); listController.dispose(); listModel.dispose(); model.dispose(); selectBox.destroy(); }, testModelCreationWithModelSelection : function() { // create a select box var selectBox = new qx.ui.form.SelectBox(); var i1 = new qx.ui.form.ListItem("a"); i1.setModel("1"); var i2 = new qx.ui.form.ListItem("b"); i2.setModel("2"); selectBox.add(i1); selectBox.add(i2); selectBox.setSelection([i1]); // add the selectBox to the form this.__form.add(selectBox, "sb"); // select something which is not the default selection selectBox.setSelection([i2]); // create the controller var c = new qx.data.controller.Form(null, this.__form); var model = c.createModel(); // check the init value of the model selection this.assertEquals("2", model.getSb()); // set the selection selectBox.setSelection([i1]); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); // set the model model.setSb("2"); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); c.dispose(); model.dispose(); i2.destroy(); i1.destroy(); selectBox.destroy(); }, testRemoveTarget : function() { // create a select box var selectBox = new qx.ui.form.SelectBox(); var i1 = new qx.ui.form.ListItem("a"); i1.setModel("1"); var i2 = new qx.ui.form.ListItem("b"); i2.setModel("2"); selectBox.add(i1); selectBox.add(i2); // add the selectBox to the form this.__form.add(selectBox, "sb"); this.__form.add(this.__tf1, "tf1"); var model = qx.data.marshal.Json.createModel({tf1: null, tf2: null, cb: null, sb: null}); // create the controller var c = new qx.data.controller.Form(model, this.__form); // set the selection selectBox.setSelection([i1]); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); // set the model model.setSb("2"); // check the selection this.assertEquals(selectBox.getSelection()[0].getModel(), model.getSb()); // check the textfield this.assertEquals(this.__tf1.getValue(), model.getTf1()); // change the values this.__tf1.setValue("11"); // check the binding this.assertEquals(this.__tf1.getValue(), model.getTf1()); // change the data in the model model.setTf1("a"); // check the binding this.assertEquals(this.__tf1.getValue(), model.getTf1()); // remove the target c.setTarget(null); // change the values in the model model.setTf1("affe"); model.setSb("1"); // check the form items this.assertEquals("a", this.__tf1.getValue()); this.assertEquals("2", selectBox.getSelection()[0].getModel()); // change the values in the items this.__tf1.setValue("viele affen"); selectBox.setSelection([i1]); // check the model this.assertEquals("affe", model.getTf1()); this.assertEquals("1", model.getSb()); c.dispose(); model.dispose(); i2.destroy(); i1.destroy(); selectBox.destroy(); }, testOptions : function() { // create the controller var c = new qx.data.controller.Form(this.__model, this.__form); // add the options var tf2model = {converter : function(data) { return "X" + data; }}; var model2tf = {converter : function(data) { return data && data.substring(1); }}; c.addBindingOptions("tf1", model2tf, tf2model); // set values in the form this.__tf1.setValue("1"); this.__tf2.setValue("2"); // check the binding this.assertEquals("X" + this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); // change the values this.__tf1.setValue("11"); this.__tf2.setValue("21"); // check the binding this.assertEquals("X" + this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); // change the data in the model this.__model.setTf1("Xa"); this.__model.setTf2("b"); // check the binding this.assertEquals(this.__tf1.getValue(), this.__model.getTf1().substring(1)); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); // destroy the objects c.dispose(); }, testConnectionWithListControllerSelection : function() { // generate fake data var data = [{name: "a", age: 1}, {name: "b", age: 2}, {name: "c", age: 3}]; var model = qx.data.marshal.Json.createModel(data); // list var list = new qx.ui.form.List(); var listController = new qx.data.controller.List(model, list, "name"); // form var form = new qx.ui.form.Form(); var tf = new qx.ui.form.TextField(); var sp = new qx.ui.form.Spinner(); form.add(tf, "Name", null, "name"); form.add(sp, "Age", null, "age"); var formController = new qx.data.controller.Form(null, form); // connection listController.bind("selection[0]", formController, "model"); // select the first item var listItems = list.getSelectables(); list.setSelection([listItems[0]]); // check if the model is still the same this.assertEquals("a", model.getItem(0).getName()); this.assertEquals("b", model.getItem(1).getName()); this.assertEquals("c", model.getItem(2).getName()); this.assertEquals(1, model.getItem(0).getAge()); this.assertEquals(2, model.getItem(1).getAge()); this.assertEquals(3, model.getItem(2).getAge()); // select the second item var listItems = list.getSelectables(); list.setSelection([listItems[1]]); // check if the model is still the same this.assertEquals("a", model.getItem(0).getName()); this.assertEquals("b", model.getItem(1).getName()); this.assertEquals("c", model.getItem(2).getName()); this.assertEquals(1, model.getItem(0).getAge()); this.assertEquals(2, model.getItem(1).getAge()); this.assertEquals(3, model.getItem(2).getAge()); // select the first item again var listItems = list.getSelectables(); list.setSelection([listItems[0]]); // check if the model is still the same this.assertEquals("a", model.getItem(0).getName()); this.assertEquals("b", model.getItem(1).getName()); this.assertEquals("c", model.getItem(2).getName()); this.assertEquals(1, model.getItem(0).getAge()); this.assertEquals(2, model.getItem(1).getAge()); this.assertEquals(3, model.getItem(2).getAge()); for (var i=0; i<model.length; i++) { model.getItem(i).dispose(); } model.dispose(); list.dispose(); listController.dispose(); form.dispose(); formController.dispose(); tf.dispose(); sp.dispose(); }, testDispose : function() { // just create the controller var c = new qx.data.controller.Form(this.__model, this.__form); // destroy the objects c.dispose(); // check if the bindings has been removed this.__model.setTf1("AFFE"); this.assertNotEquals("AFFE", this.__tf1.getValue()); }, testBindingCreateMissingOne : function() { // add an unknown item var tf = new qx.ui.form.TextField(); this.__form.add(tf, "Unknown"); // create the controller var c = new qx.data.controller.Form(this.__model, this.__form); // set values in the form this.__tf1.setValue("1"); this.__tf2.setValue("2"); this.__cb.setValue(true); // check the binding this.assertEquals(this.__tf1.getValue(), this.__model.getTf1()); this.assertEquals(this.__tf2.getValue(), this.__model.getTf2()); this.assertEquals(this.__cb.getValue(), this.__model.getCb()); // destroy the objects tf.destroy(); c.dispose(); } } });