attribute.html revision 77b62780ab47bc020d3cae8b1fb13c808d9bca7c
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews <script type="text/javascript" src="/build/yui/yui.js"></script>
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews #console .yui-console-entry-fail .yui-console-entry-cat {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews background-color:red;
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews #console .yui-console-entry-pass .yui-console-entry-cat {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews background-color:green;
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews position:static;
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews #console .yui-console-content {
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews #console .yui-console-bd {
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews height:50em;
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews YUI({base:"/build/", filter:"raw", useBrowserConsole:false}).use("base", "console", "test", function(Y) {
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews function areObjectsReallyEqual(o1, o2) {
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews function AttrHost(config) {
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews AttrHost.superclass.constructor.apply(this, arguments);
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews value:"AVal",
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews validator: function(value) {
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews return (value === undefined || Y.Lang.isString(value) || Y.Lang.isNumber(value));
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews writeOnce: true
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value:"DVal",
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews readOnly: true
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value:"EVal",
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews writeOnce: true
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews valueFn: function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews function ExtendedAttrHost(config) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews AttrHost.superclass.constructor.apply(this, arguments);
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews ExtendedAttrHost.NAME = "extendedAttrHost";
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value:"ExtAVal"
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value:"ExtBVal",
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews validator: function(value) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews return ((value == undefined) || Y.Lang.isString(value));
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value:"ExtDVal",
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews setter: function(val) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews return (Y.Lang.isString(val)) ? val.toUpperCase() : val;
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value:"ExtEVal",
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews getter: function(val) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews return (Y.Lang.isString(val)) ? val.toLowerCase() : val;
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value:"ExtFVal",
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews setter: function(val) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews return (Y.Lang.isString(val)) ? val : Y.Attribute.INVALID_VALUE;
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews value: 2222,
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews setter: function(val) { // Should be ignored. Can't set setters for complex sub vals
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews return val + 10000;
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews Y.extend(ExtendedAttrHost, AttrHost);
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var sharedEventTests = {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews testEventPrevent : function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var expectedEvents = ["BeforeMyNewAVal", "AfterMyNewAVal", "BeforePREVENT"];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var actualEvents = [];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews if (e.newVal == "PREVENT") {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "MyNewAVal");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "PREVENT");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews testEventBasic : function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var h = this.createHost({A:"MyAVal"});
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var expectedEvents = ["BeforeMyNewAVal", "AfterMyNewAVal"];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var actualEvents = [];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "MyNewAVal");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews testEventStopImmediatePropagation: function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var expectedEvents = ["Before1MyNewAVal", "Before2MyNewAVal", "After1MyNewAVal", "After2MyNewAVal", "Before1STOPAFTER", "Before2STOPAFTER", "After1STOPAFTER", "Before1STOPBEFORE"];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var actualEvents = [];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews if (e.newVal == "STOPBEFORE") {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews if (e.newVal == "STOPAFTER") {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "MyNewAVal");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "STOPAFTER");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "STOPBEFORE");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews testEventValidationReadonlyWriteOnce : function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var h = this.createHost({A:"MyAVal", C:"MyCVal", D:"MyDVal"});
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var expectedEvents = ["BeforeAChange"];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var actualEvents = [];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("AChange", function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("BeforeAChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("AChange", function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("AfterAChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("CChange", function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("BeforeCChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("CChange", function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("BeforeCChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("DChange", function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("BeforeDChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("DChange", function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("BeforeDChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", 200); // Invalid - before fired, after not fired [ value can be changed to be made valid ]
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("C", "MyNewCVal"); // Write Once - neither before nor after are fired
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("D", "MyNewDVal"); // Read Only - neither before not after are fired
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews testEventModify : function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var h = this.createHost({A:"MyAVal"});
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "MyNewAVal");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews testEventSameValue : function() {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var h = this.createHost({A:"MyAVal"});
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var expectedEvents = ["BeforeAChange", "BeforeAChange", "BeforeAChange", "AfterAChange", "BeforeComplexChange", "BeforeComplexChange", "AfterComplexChange", "BeforeComplexChange", "AfterComplexChange", "BeforeComplexChange", "AfterComplexChange"];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews var actualEvents = [];
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("BeforeAChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("AChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("AfterAChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.on("complexChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("BeforeComplexChange");
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.after("complexChange", function(e) {
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews actualEvents.push("AfterComplexChange");
33d96fbbc8aa221508f3c780539bf44810fd2c9cMark Andrews Y.Assert.areNotSame(e.newVal, e.preVal, "Should not fire after event if object values are same");
26440aaebba1acb5c8810f7faa26ad3b7553762eMark Andrews h.set("A", "MyAVal"); // No Change
819fe493f97078521bb6b9a7b97583bef89f5abcMark Andrews h.set("A", "MyNewAVal"); // Change
h.set("complex.Z.A", 3); // Change, even though value of complex is unchanged, we don't deep compare objects.
h.set("complex", {A:1, B:2, C:3}); // Change, obj reference differs
Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
var h = this.createHost();
var h = this.createHost({A:"MyAVal", B:"MyBVal", C:"MyCVal", D:"MyDVal", E:"MyEVal", DE:"MyDEVal"});
h.set("C", "MyNewCVal");
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
var h = this.createHost();
h.set("A", "MyNewAVal");
h.set("B", "MyNewBVal");
h.set("C", "MyNewCVal");
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
h.set("DE", "MyNewDEVal");
var h = this.createHost({A:"MyAVal", B:"MyBVal", C:"MyCVal", D:"MyDVal", E:"MyEVal", DE:"MyDEVal"});
h.set("A", "MyNewAVal");
h.set("B", "MyNewBVal");
h.set("C", "MyNewCVal");
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
h.set("DE", "MyNewDEVal");
h.reset("A");
h.reset("D");
h.reset();
var h = this.createHost();
areObjectsReallyEqual(expectedVals, h.getAttrs());
var h = this.createHost();
areObjectsReallyEqual(expectedVals, h.getAttrs(true));
var h = this.createHost();
h.set("A", "MyAVal");
h.set("A", 100);
h.set("B", "two");
h.set("B", 2);
h.set("B", false);
var h = this.createHost();
h.on("DChange", function(e) {
h.on("EChange", function(e) {
h.after("DChange", function(e) {
h.after("EChange", function(e) {
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
var h = this.createHost();
var val = h.get("complex");
Y.each(val, function(v, k) {
var h = this.createHost({
"complex.X.A": 11,
"complex.Y.A": 12,
"complex.Z.A": 13,
"complex.W.A": 14 // Does not exist, not allowed to set
var h = this.createHost();
var h = this.createHost();
var expectedEvents = ["Beforecomplex.X.A", "Aftercomplex.X.A", "Beforecomplex.Y.A", "Aftercomplex.Y.A", "Beforecomplex.Y", "Aftercomplex.Y"];
h.on("complexChange", function(e) {
h.after("complexChange", function(e) {
basicTemplate = Y.merge(basicTemplate, sharedEventTests);
var h = this.createHost();
var h = this.createHost({A:"MyAVal", B:"MyBVal", C:"MyCVal", D:"MyDVal", E:"MyEVal", F:"MyFVal"});
h.set("C", "MyNewCVal");
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
var h = this.createHost();
h.set("A", "MyNewAVal");
h.set("B", "MyNewBVal");
h.set("C", "MyNewCVal");
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
h.set("F", "MyNewFVal");
h.set("DE", "MyNewDEVal");
var h = this.createHost({A:"MyAVal", B:"MyBVal", C:"MyCVal", D:"MyDVal", E:"MyEVal", F:"MyFVal", DE:"MyDEVal"});
h.set("A", "MyNewAVal");
h.set("B", "MyNewBVal");
h.set("C", "MyNewCVal");
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
h.set("F", "MyNewFVal");
h.set("DE", "MyNewDEVal");
h.reset("A");
h.reset("D");
h.reset();
var h = this.createHost();
areObjectsReallyEqual(expectedVals, h.getAttrs());
var h = this.createHost();
areObjectsReallyEqual(expectedVals, h.getAttrs(true));
var h = this.createHost();
h.set("A", "MyAVal");
h.set("A", 100);
h.set("B", "two");
h.set("B", 2);
h.set("B", true);
h.set("F", "MyNewFVal");
h.set("F", 3);
Y.Assert.areEqual("MyNewFVal", h.get("F")); // Validation should prevent the attribute from being set
var h = this.createHost();
var expectedEvents = ["BeforeTryDAgain", "AfterTRYDAGAIN", "BeforeTryEAgain", "AfterTryEAgain" /* e.newVal is not "get" normalized */ ];
h.on("DChange", function(e) {
h.on("EChange", function(e) {
h.after("DChange", function(e) {
h.after("EChange", function(e) {
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
Y.ArrayAssert.itemsAreEqual(expectedEvents, actualEvents);
var h = this.createHost();
var val = h.get("complex");
Y.each(val, function(v, k) {
var h = this.createHost({
"complex.X.A": 11,
"complex.Y.A": 12,
"complex.Z.A": 13,
"complex.W.A": 14 // Does not exist, not allowed to set
var h = this.createHost();
var h = this.createHost();
var expectedEvents = ["Beforecomplex.X.A", "Aftercomplex.X.A", "Beforecomplex.Y.A", "Aftercomplex.Y.A", "Beforecomplex.Y", "Aftercomplex.Y"];
h.on("complexChange", function(e) {
h.after("complexChange", function(e) {
extendedTemplate = Y.merge(extendedTemplate, sharedEventTests);
new Y.Console({
Y.Test.Runner.add(new Y.Test.Case(basicTemplate)); // Running again, to make sure static attributes aren't modified
Y.Test.Runner.add(new Y.Test.Case(extendedTemplate)); // Running again, to make sure static attributes aren't modified