@qooxdoo/framework
Version:
The JS Framework for Coders
682 lines (586 loc) • 16 kB
JavaScript
/* ************************************************************************
qooxdoo - the new era of web development
http://qooxdoo.org
Copyright:
2007-2008 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)
************************************************************************ */
/**
* @ignore(qx.test.data.singlevalue.Array_MultiBinding)
*/
/**
* Test-Class for testing the single value binding
*/
qx.Class.define("qx.test.data.singlevalue.Array", {
extend: qx.dev.unit.TestCase,
construct() {
super();
// define a test class
qx.Class.define("qx.test.data.singlevalue.Array_MultiBinding", {
extend: qx.core.Object,
construct() {
this.setArray(new qx.data.Array(["one", "two", "three"]));
},
destruct() {
this.getArray().dispose();
var children = this.getChildren();
if (children != null) {
children.dispose();
}
},
properties: {
child: {
check: "qx.test.data.singlevalue.Array_MultiBinding",
event: "changeChild",
nullable: true
},
children: {
check: "qx.data.Array",
event: "changeChildren",
nullable: true,
init: null
},
name: {
check: "String",
event: "changeName",
nullable: true
},
array: {
init: null,
event: "changeArray"
}
}
});
},
members: {
__a: null,
__b1: null,
__b2: null,
__label: null,
setUp() {
this.__a = new qx.test.data.singlevalue.Array_MultiBinding().set({
name: "a",
children: new qx.data.Array()
});
this.__b1 = new qx.test.data.singlevalue.Array_MultiBinding().set({
name: "b1",
children: new qx.data.Array()
});
this.__b2 = new qx.test.data.singlevalue.Array_MultiBinding().set({
name: "b2",
children: new qx.data.Array()
});
this.__label = new qx.test.data.singlevalue.TextFieldDummy();
},
tearDown() {
this.__b1.dispose();
this.__b2.dispose();
this.__a.dispose();
this.__label.dispose();
},
testChangeItem() {
// bind the first element of the array
qx.data.SingleValueBinding.bind(
this.__a,
"array[0]",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"one",
this.__label.getValue(),
"Array[0] binding does not work!"
);
// change the value
this.__a.getArray().setItem(0, "ONE");
this.assertEquals(
"ONE",
this.__label.getValue(),
"Array[0] binding does not work!"
);
},
testChangeArray() {
// bind the first element of the array
qx.data.SingleValueBinding.bind(
this.__a,
"array[0]",
this.__label,
"value"
);
// change the array itself
this.__a.getArray().dispose();
this.__a.setArray(new qx.data.Array(1, 2, 3));
qx.log.Logger.debug(this.__a.getArray().getItem(0));
// check the binding
this.assertEquals(
"1",
this.__label.getValue(),
"Changing the array does not work!"
);
},
testLast() {
// bind the last element
qx.data.SingleValueBinding.bind(
this.__a,
"array[last]",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"three",
this.__label.getValue(),
"Array[last] binding does not work!"
);
// change the value
this.__a.getArray().setItem(2, "THREE");
this.assertEquals(
"THREE",
this.__label.getValue(),
"Array[last] binding does not work!"
);
},
testPushPop() {
// bind the last element
qx.data.SingleValueBinding.bind(
this.__a,
"array[last]",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"three",
this.__label.getValue(),
"Array[last] binding does not work!"
);
// pop the last element
this.__a.getArray().pop();
// check the binding
this.assertEquals(
"two",
this.__label.getValue(),
"Array[last] binding does not work!"
);
// push a new element to the end
this.__a.getArray().push("new");
// check the binding
this.assertEquals(
"new",
this.__label.getValue(),
"Array[last] binding does not work!"
);
},
testShiftUnshift() {
// bind the last element
qx.data.SingleValueBinding.bind(
this.__a,
"array[0]",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"one",
this.__label.getValue(),
"Array[last] binding does not work!"
);
// pop the last element
this.__a.getArray().shift();
// check the binding
this.assertEquals(
"two",
this.__label.getValue(),
"Array[last] binding does not work!"
);
// push a new element to the end
this.__a.getArray().unshift("new");
// check the binding
this.assertEquals(
"new",
this.__label.getValue(),
"Array[last] binding does not work!"
);
},
testChildArray() {
// create the objects
this.__a.setChild(this.__b1);
this.__b1.getArray().dispose();
this.__b1.setArray(new qx.data.Array("eins", "zwei", "drei"));
this.__b2.getArray().dispose();
this.__b2.setArray(new qx.data.Array("1", "2", "3"));
// bind the last element
qx.data.SingleValueBinding.bind(
this.__a,
"child.array[0]",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"eins",
this.__label.getValue(),
"child.array[0] binding does not work!"
);
// change the child
this.__a.setChild(this.__b2);
// check the binding
this.assertEquals(
"1",
this.__label.getValue(),
"child.array[0] binding does not work!"
);
this.__b1.getArray().dispose();
this.__b2.getArray().dispose();
},
testChildren() {
// create the objects
this.__a.getChildren().push(this.__b1);
this.__a.getChildren().push(this.__b2);
// bind the element
qx.data.SingleValueBinding.bind(
this.__a,
"children[0].name",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"b1",
this.__label.getValue(),
"children[0].name binding does not work!"
);
// remove the first element
this.__a.getChildren().shift();
// check the binding
this.assertEquals(
"b2",
this.__label.getValue(),
"children[0].name binding does not work!"
);
// change the name of b2
this.__b2.setName("AFFE");
// check the binding
this.assertEquals(
"AFFE",
this.__label.getValue(),
"children[0].name binding does not work!"
);
},
test2Arrays() {
// create the objects
this.__a.getChildren().push(this.__b1);
this.__b1.getChildren().push(this.__b2);
// bind the element
qx.data.SingleValueBinding.bind(
this.__a,
"children[0].children[0].name",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"b2",
this.__label.getValue(),
"children[0].children[0].name binding does not work!"
);
// rename the last element
this.__b2.setName("OHJE");
// check the binding
this.assertEquals(
"OHJE",
this.__label.getValue(),
"children[0].name binding does not work!"
);
},
testSplice() {
// bind the first element
qx.data.SingleValueBinding.bind(
this.__a,
"array[0]",
this.__label,
"value"
);
// remove the first and add "eins" at position 0
var array = this.__a.getArray().splice(0, 1, "eins");
// check the binding
this.assertEquals(
"eins",
this.__label.getValue(),
"Array[last] binding does not work!"
);
array.dispose();
},
testWrongInput() {
var a = this.__a;
var label = this.__label;
// bind a senseless value
this.assertException(
function () {
qx.data.SingleValueBinding.bind(a, "array[affe]", label, "value");
},
Error,
null,
"Affe not an array value."
);
// bind empty array
this.assertException(
function () {
qx.data.SingleValueBinding.bind(a, "array[]", label, "value");
},
Error,
null,
"'' not an array value."
);
// bind 2 arrays
this.assertException(
function () {
qx.data.SingleValueBinding.bind(a, "array[0][0]", label, "value");
},
Error,
null,
"array[][] not an array value."
);
// bind an float
this.assertException(
function () {
qx.data.SingleValueBinding.bind(a, "array[1.5]", label, "value");
},
Error,
null,
"1.5 not an array value."
);
// bind strange value
this.assertException(
function () {
qx.data.SingleValueBinding.bind(a, "array[[affe]]", label, "value");
},
Error,
null,
"'[[affe]]' not an array value."
);
// test map in array
this.assertException(
function () {
qx.data.SingleValueBinding.bind(
a,
"array[{name: 'a'}]",
label,
"value"
);
},
Error,
null,
"'[affe]' not an array value."
);
// test null in the array
this.assertException(
function () {
qx.data.SingleValueBinding.bind(a, "array[null]", label, "value");
},
Error,
null,
"'null' not an array value."
);
},
testLateBinding() {
// create the precondition
this.__a.getArray().dispose();
this.__a.setArray(new qx.data.Array());
// bind the last element
qx.data.SingleValueBinding.bind(
this.__a,
"array[last]",
this.__label,
"value"
);
// check the binding
this.assertNull(this.__label.getValue(), "Late binding does not work!");
// set a value and check it
this.__a.getArray().push("1");
this.assertEquals(
"1",
this.__label.getValue(),
"Late binding does not work!"
);
// set another value and check it
this.__a.getArray().push("2");
this.assertEquals(
"2",
this.__label.getValue(),
"Late binding does not work!"
);
},
testRemoveArrayItem() {
// bind the last element
qx.data.SingleValueBinding.bind(
this.__a,
"array[last]",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"three",
this.__label.getValue(),
"Array[last] binding does not work!"
);
// pop all 3 elements
this.__a.getArray().pop();
this.__a.getArray().pop();
this.__a.getArray().pop();
// check the binding
this.assertNull(
this.__label.getValue(),
"Array[last] binding does not work!"
);
},
testBidirectional() {
// two way binding
// model.name <-- bind --> model.child.array[0]
// create model: model.child.array
var model = new qx.test.data.singlevalue.Array_MultiBinding();
model.setChild(new qx.test.data.singlevalue.Array_MultiBinding());
// set up the two way binding
model.bind("name", model, "child.array[0]");
model.bind("child.array[0]", model, "name");
// set the value of the textfield
model.setName("affe");
this.assertEquals(
"affe",
model.getChild().getArray().getItem(0),
"affe not set in the model array."
);
// set the value in the model
model.getChild().getArray().setItem(0, "stadtaffe");
this.assertEquals(
"stadtaffe",
model.getName(),
"stadtaffe not set in the model."
);
// set the models name to null
model.setName(null);
this.assertEquals(
null,
model.getChild().getArray().getItem(0),
"model array not reseted to initial."
);
// set the model array item to null
model.getChild().getArray().setItem(0, null);
this.assertEquals(null, model.getName(), "model not reseted.");
model.getChild().dispose();
model.dispose();
},
testDirect() {
// bind the first element of the array
qx.data.SingleValueBinding.bind(
this.__a.getArray(),
"[0]",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"one",
this.__label.getValue(),
"[0] binding does not work!"
);
// change the value
this.__a.getArray().setItem(0, "ONE");
this.assertEquals(
"ONE",
this.__label.getValue(),
"[0] binding does not work!"
);
},
testDirectTarget() {
this.__label.setValue("affe");
// bind the first element of the array
qx.data.SingleValueBinding.bind(
this.__label,
"value",
this.__a.getArray(),
"[0]"
);
// check the binding
this.assertEquals(
"affe",
this.__a.getArray().getItem(0),
"[0] binding does not work!"
);
// change the value
this.__label.setValue("AFFE");
this.assertEquals(
"AFFE",
this.__a.getArray().getItem(0),
"[0] binding does not work!"
);
},
testChildrenDirect() {
// create the objects
this.__a.getChildren().push(this.__b1);
this.__a.getChildren().push(this.__b2);
// bind the element
qx.data.SingleValueBinding.bind(
this.__a.getChildren(),
"[0].name",
this.__label,
"value"
);
// check the binding
this.assertEquals(
"b1",
this.__label.getValue(),
"[0].name binding does not work!"
);
// remove the first element
this.__a.getChildren().shift();
// check the binding
this.assertEquals(
"b2",
this.__label.getValue(),
"[0].name binding does not work!"
);
// change the name of b2
this.__b2.setName("AFFE");
// check the binding
this.assertEquals(
"AFFE",
this.__label.getValue(),
"[0].name binding does not work!"
);
},
testTargetChildren() {
// create the objects
this.__a.getChildren().push(this.__b1);
this.__a.getChildren().push(this.__b2);
// bind the element
this.__label.setValue("l");
qx.data.SingleValueBinding.bind(
this.__label,
"value",
this.__a.getChildren(),
"[0].name"
);
// check the binding
this.assertEquals(
"l",
this.__a.getChildren().getItem(0).getName(),
"[0].name binding does not work!"
);
// remove the first element
this.__a.getChildren().shift();
// check the binding
this.assertEquals(
"l",
this.__a.getChildren().getItem(0).getName(),
"[0].name binding does not work!"
);
}
}
});