base-core.html revision 9bdfc363ef897a298b7596475f598c1c4fd427b6
<html>
<head>
<title>Base Core Tests</title>
#console .yui3-console-entry {
padding:2px;
margin:0px;
min-height:0;
}
#console .yui3-console-entry-fail .yui3-console-entry-cat {
background-color:red;
}
#console .yui3-console-entry-pass .yui3-console-entry-cat {
background-color:green;
}
#console .yui3-console-entry-perf .yui3-console-entry-cat {
background-color:blue;
}
#console {
position:static;
}
html, body {
height:100%;
}
</style>
<script type="text/javascript">
YUI({
useBrowserConsole:false,
filter: (window.location.search.match(/[?&]filter=([^&]+)/) || [])[1] || 'min'
}).use("dump", "base-core", "console", "test", function(Y) {
function areObjectsReallyEqual(o1, o2) {
Y.ObjectAssert.areEqual(o1, o2);
Y.ObjectAssert.areEqual(o2, o1);
}
function Test(cfg, lazy, silentInit) {
this._lazyAddAttrs = lazy;
this._silentInit = silentInit;
Test.superclass.constructor.apply(this, arguments);
};
Test.NAME = 'test';
Test.ATTRS = {
attr1: {
value: "Foo",
setter: function(n) {
return n;
}
},
attr2: {
value: "Bar",
setter: function(n) {
return n;
}
},
attr3: {
value: true
},
attr4: {
value: 3
},
attr5: {
value: 3
},
attr6: {
value: false,
setter: function(lock) {
return lock;
}
},
attr7: {
value: false
},
attr8: {
value: true
},
attr9: {
value: true
},
attr10: {
value: false
},
attr11: {
value: true
},
attr12: {
value: false
},
attr13: {
value: false
},
attr14: {
value: false,
setter: function(val) {
return val;
}
},
attr15: {
value: null,
setter: function(val) {
return false;
}
},
attr16: {
value: ['default'],
getter: function() {
return false;
},
setter: function(g) {
return g;
}
},
attr17: {
value: null,
setter: function(g) {
return g;
}
},
attr18: {
writeOnce: true,
value: null
},
attr19: {
writeOnce: true,
value: null
},
attr20: {
writeOnce: true,
value: null
}
};
Y.extend(Test, Y.BaseCore, {
foo: function() {}
});
function AttrHost(config) {
AttrHost.superclass.constructor.apply(this, arguments);
}
AttrHost.NAME = "attrHost";
AttrHost.ATTRS = {
A: {
value:"AVal",
validator: Y.Lang.isString,
broadcast:1
},
B: {
validator: function(value) {
return (value === undefined || Y.Lang.isString(value) || Y.Lang.isNumber(value));
},
broadcast:2
},
C: {
writeOnce: true
},
D: {
value:"DVal",
readOnly: true
},
E: {
value:"EVal",
writeOnce: true
},
DE: {
valueFn: function() {
}
},
complex: {
value: {
X : {
A: 1
},
Y : {
A: 2
},
Z : {
A: 3
}
}
},
initOnly : {
writeOnce:"initOnly"
}
};
Y.extend(AttrHost, Y.BaseCore);
// -----
function ExtendedAttrHost(config) {
AttrHost.superclass.constructor.apply(this, arguments);
}
ExtendedAttrHost.NAME = "extendedAttrHost";
A: {
value:"ExtAVal"
},
B: {
value:"ExtBVal",
validator: function(value) {
return ((value == undefined) || Y.Lang.isString(value));
}
},
D: {
value:"ExtDVal",
setter: function(val) {
return (Y.Lang.isString(val)) ? val.toUpperCase() : val;
}
},
E: {
value:"ExtEVal",
getter: function(val) {
return (Y.Lang.isString(val)) ? val.toLowerCase() : val;
}
},
F: {
value:"ExtFVal",
setter: function(val) {
return (Y.Lang.isString(val)) ? val : Y.AttributeCore.INVALID_VALUE;
}
},
"complex.X.A" : {
value: 1111
},
"complex.Y.A" : {
value: 2222,
setter: function(val) { // Should be ignored. Can't set setters for complex sub vals
return val + 10000;
}
},
G : {
valueFn:function(val) {
// Referring to H before it's set up
return this.get("H") + 10;
}
},
H: {
value:5,
getter: function(val) {
return val*5;
}
},
I : {
value:{
a: 5
},
getter: "_getI",
setter: "_setI",
validator: "_validateI"
},
PassThrough : {
value: "passthrough",
getter: function(val) {
return this._passthrough;
},
setter: function(val) {
this._passthrough = val;
}
},
Z : {
value: "z",
getter: function(val) {
return val.toUpperCase();
}
}
};
Y.extend(ExtendedAttrHost, AttrHost, {
_validateI : function(val, name) {
if (name.indexOf(".") == -1) {
Y.Assert.areEqual("I", name);
} else {
Y.Assert.areEqual("I.a", name);
}
return true;
},
_getI : function(val, name) {
if (name.indexOf(".") == -1) {
Y.Assert.areEqual("I", name);
} else {
Y.Assert.areEqual("I.a", name);
}
return val;
},
_setI : function(val, name) {
if (name.indexOf(".") == -1) {
Y.Assert.areEqual("I", name);
} else {
Y.Assert.areEqual("I.a", name);
}
}
});
function CoreTestsHost(config) {
CoreTestsHost.superclass.constructor.apply(this, arguments);
}
CoreTestsHost.NAME = "coreTestsHost";
cloneDefaultObject : {
value : {
a:1,
b:2,
c:3
}
},
cloneDefaultArray : {
value : ["foo", "bar", "foobar"]
},
cloneDefaultString : {
value : "foo"
},
cloneDefaultOverride : {
value : {
a:1, b:2, c:3
},
cloneDefaultValue : false
},
cloneDefaultShallow : {
value : {
a: {foo: "bar"}
},
cloneDefaultValue : "shallow"
},
cloneDefaultDeep : {
value : {
a: {foo: "bar"}
},
cloneDefaultValue : "deep"
},
cloneDefaultComplex : {
value : new Y.BaseCore()
}
};
Y.extend(CoreTestsHost, Y.BaseCore);
var coreTemplate = {
name: "Core Tests",
testInit : function() {
var h = new CoreTestsHost();
Y.Assert.isTrue(h.get("initialized"));
},
testDestroy : function() {
var h = new CoreTestsHost();
Y.Assert.isFalse(h.get("destroyed"));
h.destroy();
Y.Assert.isTrue(h.get("destroyed"));
},
testToString : function() {
var h = new CoreTestsHost(),
re = /^coreTestsHost\[.*?\]$/,
str = h.toString();
Y.Assert.isTrue(re.test(str));
},
testCloneDefaultValueObject : function() {
var h = new CoreTestsHost(),
val = h.get("cloneDefaultObject");
a:1,
b:2,
c:3
}, val);
},
testCloneDefaultValueArray : function() {
var h = new CoreTestsHost(),
val = h.get("cloneDefaultArray");
Y.ArrayAssert.itemsAreEqual(["foo", "bar", "foobar"], val);
},
testCloneDefaultValueString : function() {
var h = new CoreTestsHost(),
val = h.get("cloneDefaultString");
},
testCloneDefaultComplex : function() {
var h = new CoreTestsHost(),
val = h.get("cloneDefaultComplex");
// Don't try to clone by default. We may hurt our backs
},
testCloneDefaultShallow : function() {
var h = new CoreTestsHost(),
val = h.get("cloneDefaultShallow");
foo:"bar"
}, val.a);
},
testCloneDefaultDeep : function() {
var h = new CoreTestsHost(),
val = h.get("cloneDefaultDeep");
foo:"bar"
}, val.a);
},
testCloneDefaultOverride : function() {
var h = new CoreTestsHost(),
val = h.get("cloneDefaultOverride");
a:1,
b:2,
c:3
}, val);
},
testInitializerDestructorInvocation : function() {
var expected = ["beforeConstructorTwo", "beforeConstructorOne", "initializerOne", "initializerTwo", "afterConstructorOne", "afterConstructorTwo", "destructorTwo", "destructorOne"],
actual = [],
initCfg = {
foo: 1
};
function One(cfg) {
actual.push("beforeConstructorOne");
One.superclass.constructor.apply(this, arguments);
actual.push("afterConstructorOne");
}
Y.extend(One, Y.BaseCore, {
initializer : function(cfg) {
Y.Assert.areSame(initCfg, cfg);
actual.push("initializerOne");
},
destructor : function() {
actual.push("destructorOne");
}
}, {
NAME : "one",
ATTRS : {
"a" : {
value: 1
}
}
});
function Two(cfg) {
actual.push("beforeConstructorTwo");
Two.superclass.constructor.apply(this, arguments);
actual.push("afterConstructorTwo");
}
Y.extend(Two, One, {
initializer : function(cfg) {
Y.Assert.areSame(initCfg, cfg);
actual.push("initializerTwo");
},
destructor : function() {
actual.push("destructorTwo");
}
}, {
NAME : "two",
ATTRS : {
"b" : {
value: 2
}
}
});
var o = new Two(initCfg);
o.destroy();
Y.ArrayAssert.itemsAreEqual(expected, actual);
}
};
var basicTemplate = {
name: "Base Class Tests",
createHost : function(cfg) {
return new AttrHost(cfg);
},
setUp : function() {},
tearDown : function() {},
testDefault : function() {
var h = this.createHost();
Y.Assert.areEqual("AVal", h.get("A"));
Y.Assert.areEqual(undefined, h.get("B"));
Y.Assert.areEqual(undefined, h.get("C"));
Y.Assert.areEqual("DVal", h.get("D")); // Readonly
Y.Assert.areEqual("EVal", h.get("E")); // Write once, but not twice
Y.Assert.areEqual("DValEVal", h.get("DE"));
},
testConstructor : function() {
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");
Y.Assert.areEqual("MyAVal", h.get("A"));
Y.Assert.areEqual("MyBVal", h.get("B"));
Y.Assert.areEqual("MyCVal", h.get("C")); // Write Once, set in constructor
Y.Assert.areEqual("DVal", h.get("D")); // Read Only
Y.Assert.areEqual("MyEVal", h.get("E")); // Write Once, set in constructor
Y.Assert.areEqual("MyDEVal", h.get("DE"));
},
testSet : function() {
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");
Y.Assert.areEqual("MyNewAVal", h.get("A"));
Y.Assert.areEqual("MyNewBVal", h.get("B"));
Y.Assert.areEqual("MyNewCVal", h.get("C")); // Write once, set on first set.
Y.Assert.areEqual("DVal", h.get("D")); // Read Only
Y.Assert.areEqual("EVal", h.get("E")); // Write Once
Y.Assert.areEqual("MyNewDEVal", h.get("DE"));
},
testWriteOncePostInit : function() {
var h = this.createHost();
h.set("E", "MyNewEVal");
h.set("C", "MyNewCVal");
Y.Assert.areEqual("MyNewCVal", h.get("C")); // Write Once, default value
Y.Assert.areEqual("EVal", h.get("E")); // Write Once, default value
},
testWriteOnce : function() {
var h = this.createHost({E:"MyEVal"});
h.set("E", "MyNewEVal");
Y.Assert.areEqual("MyEVal", h.get("E")); // Write Once, on init
},
testWriteOnceInitOnly : function() {
var h = this.createHost({ initOnly: "initOnlyVal"});
h.set("initOnly", "NewInitOnlyVal");
Y.Assert.areEqual("initOnlyVal", h.get("initOnly"));
},
testWriteOnceInitOnlyNotProvided : function() {
var h1 = this.createHost();
h1.set("initOnly", "InitOnlyVal");
Y.Assert.areEqual(undefined, h1.get("initOnly"));
},
testAdHocGetSet : function() {
var h = this.createHost();
Y.Assert.areEqual(undefined, h.get("AdHoc"));
h.set("AdHoc", "TestAdHoc");
Y.Assert.areEqual("TestAdHoc", h.get("AdHoc"));
h.addAttr("AdHoc", {
setter: function(val) {
return val.toUpperCase();
}
});
h.set("AdHoc", "TestAdHocConfigured");
Y.Assert.areEqual("TESTADHOCCONFIGURED", h.get("AdHoc"));
},
testAdHocConstructorEnabled : function() {
var h = this.createHost({
A: "MyAVal",
foo: "foo",
bar: "bar",
plugins : ["not"]
});
AttrHost.prototype._allowAdHocAttrs = false;
// Only add AdHoc Attrs
Y.Assert.areEqual("foo", h.get("foo"));
Y.Assert.areEqual("bar", h.get("bar"));
// Configured Attrs
Y.Assert.areEqual("DVal", h.get("D"));
Y.Assert.areEqual("MyAVal", h.get("A"));
// Not _NON_ATTRS_CFG
Y.Assert.isUndefined(h.get("plugins"));
},
testAdHocConstructorDisabled : function() {
var h = this.createHost({
A: "MyAVal",
foo: "foo",
bar: "bar",
plugins : ["not"]
});
// Only add AdHoc Attrs
Y.Assert.areEqual(undefined, h.get("foo"));
Y.Assert.areEqual(undefined, h.get("bar"));
// Configured attributes
Y.Assert.areEqual("DVal", h.get("D"));
Y.Assert.areEqual("MyAVal", h.get("A"));
// Not _NON_ATTRS_CFG
Y.Assert.isUndefined(h.get("plugins"));
},
testMassSetGet : function() {
var h = this.createHost();
"A" : "MyNewAVal",
"B": "MyNewBVal",
"C": "MyNewCVal",
"D": "MyNewDVal",
"E": "MyNewEVal",
"DE": "MyNewDEVal",
complex: "MyNewComplexVal"
});
var expectedVals = {
A: "MyNewAVal",
B: "MyNewBVal",
C: "MyNewCVal",
D: "DVal",
E: "EVal",
DE: "MyNewDEVal",
complex: "MyNewComplexVal",
initialized: true,
destroyed: false,
initOnly: undefined
};
areObjectsReallyEqual(expectedVals, h.getAttrs());
},
testModifiedAttrs : function() {
var h = this.createHost();
A: "MyNewAVal",
C: "MyNewCVal",
D: "MyNewDVal"
});
var expectedVals = {
A: "MyNewAVal",
initialized:true
};
areObjectsReallyEqual(expectedVals, h.getAttrs(true));
},
testValidation : function() {
var h = this.createHost();
h.set("A", "MyAVal");
Y.Assert.areEqual("MyAVal", h.get("A"));
h.set("A", 100);
Y.Assert.areEqual("MyAVal", h.get("A")); // Validation should prevent the attribute from being set
h.set("B", "two");
Y.Assert.areEqual("two", h.get("B"));
h.set("B", 2);
Y.Assert.areEqual(2, h.get("B"));
h.set("B", false);
Y.Assert.areEqual(2, h.get("B")); // Validation should prevent the attribute from being set
},
testPrivateSet : function() {
var h = this.createHost();
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
Y.Assert.areEqual("DVal", h.get("D"));
Y.Assert.areEqual("EVal", h.get("E"));
h._set("D", "TryDAgain");
h._set("E", "TryEAgain");
Y.Assert.areEqual("TryDAgain", h.get("D"));
Y.Assert.areEqual("TryEAgain", h.get("E"));
},
testComplexDefault : function() {
var h = this.createHost();
var o = {
X : {
A: 1
},
Y : {
A: 2
},
Z : {
A: 3
}
};
var val = h.get("complex");
Y.each(val, function(v, k) {
areObjectsReallyEqual(v, o[k]);
});
},
testComplexSet : function() {
var h = this.createHost();
h.set("complex.X.A", 111);
h.set("complex.X.B", 112);
h.set("complex.W.B", 113);
},
testInitialValidation: function() {
var h = this.createHost({A:5});
Y.Assert.areEqual("AVal", h.get("A")); // Numerical value validation failure should revert to default value
},
testProtect : function() {
var h = this.createHost();
var q = h._protectAttrs(AttrHost.ATTRS);
q.A.newprop = "new prop value";
q.A.value = "modified value";
}
};
var extendedTemplate = {
name: "Extended Class Tests",
createHost : function(cfg) {
return new ExtendedAttrHost(cfg);
},
setUp : function() {},
tearDown : function() {},
testDefault : function() {
var h = this.createHost();
Y.Assert.areEqual("ExtAVal", h.get("A"));
Y.Assert.areEqual("ExtBVal", h.get("B"));
Y.Assert.areEqual(undefined, h.get("C"));
Y.Assert.areEqual("EXTDVAL", h.get("D"));
Y.Assert.areEqual("exteval", h.get("E"));
Y.Assert.areEqual("ExtFVal", h.get("F"));
Y.Assert.areEqual("EXTDVALexteval", h.get("DE"));
},
testConstructor : function() {
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");
Y.Assert.areEqual("MyAVal", h.get("A"));
Y.Assert.areEqual("MyBVal", h.get("B"));
Y.Assert.areEqual("MyCVal", h.get("C"));
Y.Assert.areEqual("EXTDVAL", h.get("D"));
Y.Assert.areEqual("myeval", h.get("E"));
Y.Assert.areEqual("MyFVal", h.get("F"));
Y.Assert.areEqual("EXTDVALmyeval", h.get("DE"));
},
testSet : function() {
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");
Y.Assert.areEqual("MyNewAVal", h.get("A"));
Y.Assert.areEqual("MyNewBVal", h.get("B"));
Y.Assert.areEqual("MyNewCVal", h.get("C"));
Y.Assert.areEqual("EXTDVAL", h.get("D"));
Y.Assert.areEqual("exteval", h.get("E"));
Y.Assert.areEqual("MyNewFVal", h.get("F"));
Y.Assert.areEqual("MyNewDEVal", h.get("DE"));
},
testAdHocGetSet : function() {
var h = this.createHost();
Y.Assert.areEqual(undefined, h.get("AdHoc"));
h.set("AdHoc", "TestAdHoc");
Y.Assert.areEqual("TestAdHoc", h.get("AdHoc"));
},
testMassSetGet : function() {
var h = this.createHost();
"A" : "MyNewAVal",
"B": "MyNewBVal",
"C": "MyNewCVal",
"D": "MyNewDVal",
"E": "MyNewEVal",
"F": "MyNewFVal",
"DE": "MyNewDEVal",
complex: "MyNewComplexVal",
"I" : "MyNewIVal",
"PassThrough" : "MyPassThrough",
"Z" : "MyZ"
});
var expectedVals = {
A: "MyNewAVal",
B: "MyNewBVal",
C: "MyNewCVal",
D: "EXTDVAL",
E: "exteval",
F: "MyNewFVal",
DE: "MyNewDEVal",
complex: "MyNewComplexVal",
G: 35,
H: 25,
I: "MyNewIVal",
PassThrough: "MyPassThrough",
Z: "MYZ",
initialized:true,
destroyed:false,
initOnly: undefined
};
areObjectsReallyEqual(expectedVals, h.getAttrs());
},
testModifiedAttrs : function() {
var h = this.createHost();
A: "MyNewAVal",
C: "MyNewCVal",
D: "MyNewDVal",
F: "MyNewFVal"
});
var expectedVals = {
A: "MyNewAVal",
F: "MyNewFVal",
initialized:true
};
areObjectsReallyEqual(expectedVals, h.getAttrs(true));
},
testValidation : function() {
var h = this.createHost();
h.set("A", "MyAVal");
Y.Assert.areEqual("MyAVal", h.get("A"));
h.set("A", 100);
Y.Assert.areEqual("MyAVal", h.get("A")); // Validation should prevent the attribute from being set
h.set("B", "two");
Y.Assert.areEqual("two", h.get("B"));
h.set("B", 2);
Y.Assert.areEqual("two", h.get("B")); // Validation should prevent the attribute from being set
h.set("B", true);
Y.Assert.areEqual("two", h.get("B")); // Validation should prevent the attribute from being set
h.set("F", "MyNewFVal");
Y.Assert.areEqual("MyNewFVal", h.get("F"));
h.set("F", 3);
Y.Assert.areEqual("MyNewFVal", h.get("F")); // Validation should prevent the attribute from being set
},
testPrivateSet : function() {
var h = this.createHost();
h.set("D", "MyNewDVal");
h.set("E", "MyNewEVal");
Y.Assert.areEqual("EXTDVAL", h.get("D"));
Y.Assert.areEqual("exteval", h.get("E"));
h._set("D", "TryDAgain");
h._set("E", "TryEAgain");
Y.Assert.areEqual("TRYDAGAIN", h.get("D"));
Y.Assert.areEqual("tryeagain", h.get("E"));
},
testComplexDefault : function() {
var h = this.createHost();
var o = {
X : {
A: 1111
},
Y : {
A: 2222
},
Z : {
A: 3
}
};
var val = h.get("complex");
Y.each(val, function(v, k) {
areObjectsReallyEqual(v, o[k]);
});
},
testComplexSet : function() {
var h = this.createHost();
h.set("complex.X.A", 111);
h.set("complex.X.B", 112);
h.set("complex.W.B", 113);
},
testOnDemandInit : function() {
var h = this.createHost();
Y.Assert.areEqual(35, h.get("G"));
Y.Assert.areEqual(25, h.get("H"));
},
testGetterSetterValidatorNameArg : function() {
var h = this.createHost();
h.set("I", {a:7, b:8});
}
};
var perfTemplate = {
name: "Performance Tests",
testTimeConstruction: function() {
var start, end, n = 20, t, i;
start = new Date().getTime();
for (i = 0; i < n; i++) {
t = new Test(null, false);
t.getAttrs();
t = null;
}
end = new Date().getTime();
start = new Date().getTime();
for (i = 0; i < n; i++) {
t = new Test();
t.getAttrs();
t = null;
}
end = new Date().getTime();
Y.log("Construction Time Populated (lazy): " + ((end-start)/n), "perf");
start = new Date().getTime();
for (i = 0; i < n; i++) {
t = new Test(null, false);
t = null;
}
end = new Date().getTime();
start = new Date().getTime();
for (i = 0; i < n; i++) {
t = new Test();
t = null;
}
end = new Date().getTime();
var time = (end-start)/n;
start = new Date().getTime();
for (i = 0; i < n; i++) {
t = new Test(null, true, true);
t = null;
}
end = new Date().getTime();
Y.log("Construction Time (lazy and silent init): " + ((end-start)/n), "perf");
Y.Assert.isTrue((time < expectedTime));
},
testStateForPerfSwitches : function() {
// Lazy
t = new Test();
var x = t.getAttrs();
// Non Lazy (Upfront)
t = new Test(null, false);
var y = t.getAttrs();
// Lazy and Silent
t = new Test(null, true, true);
var z = t.getAttrs();
}
}
Y.Test.Runner.add(suite);
Y.Test.Runner.setName("Base Core Tests");
var console;
if (!console) {
//create the console
console = new Y.Console({
width:"100%",
height:"95%",
id:"console",
verbose : false,
printTimeout: 0,
newestOnTop : false,
entryTemplate: '<pre class="{entry_class} {cat_class} {src_class}">'+
'<span class="{entry_cat_class}">{label}</span>'+
'<span class="{entry_content_class}">{message}</span>'+
'</pre>',
render:true
});
Y.Test.Runner.add(perfSuite);
}
});
});
</script>
</head>
<body class="yui3-skin-sam">
<p><input type="button" value="Run Tests" id="btnRun" disabled=true></p>
</body>
</html>