1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
4
<title>Base Tests</title>
6
<script src="../../../build/yui/yui.js"></script>
8
<style type="text/css">
9
#console .yui3-console-entry {
15
#console .yui3-console-entry-fail .yui3-console-entry-cat {
19
#console .yui3-console-entry-pass .yui3-console-entry-cat {
20
background-color:green;
23
#console .yui3-console-entry-perf .yui3-console-entry-cat {
24
background-color:blue;
36
<body class="yui3-skin-sam">
37
<div id="testbed" class="yui3-skin-foo"></div>
40
useBrowserConsole:false,
41
filter: (window.location.search.match(/[?&]filter=([^&]+)/) || [])[1] || 'min'
42
}).use('test', 'base', 'console', function (Y) {
44
// NOTE: Attribute's unit tests cover a large section of Base's functionality when it comes to dealing with attributes.
46
var suite = new Y.Test.Suite("Base Tests");
48
suite.add(new Y.Test.Case({
52
"test:create-basic": function () {
54
var expectedMethodCalls = [
56
"myClass::initializer",
58
"myClass::initializer",
64
actualMethodCalls = [];
67
actualMethodCalls.push("ext1::constructor");
70
Ext1.prototype.extOne = function() {
71
actualMethodCalls.push("ext1::extOne");
74
var MyClass = Y.Base.create("myClass", Y.Base, [Ext1], {
76
initializer: function() {
77
actualMethodCalls.push("myClass::initializer");
80
methodOne: function() {
81
actualMethodCalls.push("myClass::methodOne");
85
STATIC_ONE: "static_one"
88
// using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
89
var o1 = new MyClass({foo:true});
90
var o2 = new MyClass({foo:true});
92
Y.Assert.isFunction(o1.extOne, "Extension method extOne not found on o1");
93
Y.Assert.isFunction(o2.extOne, "Extension method extOne not found on o2");
95
Y.Assert.isFunction(o1.methodOne, "Prototype method methodOne not found on o1");
96
Y.Assert.isFunction(o2.methodOne, "Prototype method methodOne not found on o2");
98
Y.Assert.areEqual(o1.constructor.STATIC_ONE, "static_one", "STATIC_ONE not found on o1's constructor");
99
Y.Assert.areEqual(o2.constructor.STATIC_ONE, "static_one", "STATIC_ONE not found on o2's constructor");
101
Y.Assert.areEqual(o1.constructor.NAME, "myClass", "NAME not found on o1's constructor");
102
Y.Assert.areEqual(o2.constructor.NAME, "myClass", "NAME not found on o2's constructor");
110
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
113
"test:mix-basic": function() {
115
var expectedMethodCalls = [
116
"myClass::constructor",
118
"myClass::initializer",
119
"myClass::constructor",
121
"myClass::initializer",
122
"myClass::methodOne",
123
"myClass::methodOne",
127
actualMethodCalls = [];
130
actualMethodCalls.push("ext1::constructor");
133
Ext1.prototype.extOne = function() {
134
actualMethodCalls.push("ext1::extOne");
137
function MyClass(config) {
138
actualMethodCalls.push("myClass::constructor");
139
MyClass.superclass.constructor.apply(this, arguments);
142
Y.extend(MyClass, Y.Base, {
144
initializer: function() {
145
actualMethodCalls.push("myClass::initializer");
148
methodOne: function() {
149
actualMethodCalls.push("myClass::methodOne");
153
STATIC_ONE: "static_one",
157
Y.Base.mix(MyClass, [Ext1]);
159
// using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
160
var o1 = new MyClass();
161
var o2 = new MyClass();
163
Y.Assert.isFunction(o1.extOne, "Extension method extOne not found on o1");
164
Y.Assert.isFunction(o2.extOne, "Extension method extOne not found on o2");
166
Y.Assert.isFunction(o1.methodOne, "Prototype method methodOne not found on o1");
167
Y.Assert.isFunction(o2.methodOne, "Prototype method methodOne not found on o2");
169
Y.Assert.areEqual(o1.constructor.STATIC_ONE, "static_one", "STATIC_ONE not found on o1's constructor");
170
Y.Assert.areEqual(o2.constructor.STATIC_ONE, "static_one", "STATIC_ONE not found on o2's constructor");
178
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
181
"test:initializer": function() {
182
var expectedMethodCalls = [
184
"myClass::initializer",
187
"myClass::initializer",
188
"ext1::initializer"],
190
actualMethodCalls = [];
193
actualMethodCalls.push("ext1::constructor");
194
Y.Assert.isNotUndefined(cfg);
197
Ext1.prototype.initializer = function(cfg) {
198
actualMethodCalls.push("ext1::initializer");
199
Y.Assert.isNotUndefined(cfg);
202
var MyClass = Y.Base.create("myClass", Y.Base, [Ext1], {
203
initializer: function(cfg) {
204
actualMethodCalls.push("myClass::initializer");
205
Y.Assert.isNotUndefined(cfg);
209
// using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
210
var o1 = new MyClass({foo:true});
211
var o2 = new MyClass({foo:true});
213
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
216
"test:destructor": function() {
217
var expectedMethodCalls = [
219
"myClass::destructor",
221
"myClass::destructor"],
223
actualMethodCalls = [];
225
function Ext1(cfg) {}
227
Ext1.prototype.destructor = function(cfg) {
228
actualMethodCalls.push("ext1::destructor");
231
var MyClass = Y.Base.create("myClass", Y.Base, [Ext1], {
232
destructor: function(cfg) {
233
actualMethodCalls.push("myClass::destructor");
237
// using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
238
var o1 = new MyClass({foo:true});
239
var o2 = new MyClass({foo:true});
244
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
247
"test:attrs" : function() {
249
var actualMethodCalls = [],
250
expectedMethodCalls = [
251
"ext1::attr2::setter", // once for lazy o1 - This was news to me: we should optimize it as part off Attr performance
252
"ext1::attr2::setter", // once for set o1
253
"ext1::attr2::setter", // once for lazy o2
254
"ext1::attr2::setter" // once for set o2
265
setter: function(val) {
266
actualMethodCalls.push("ext1::attr2::setter");
275
var MyClass = Y.Base.create("myClass", Y.Base, [Ext1]);
277
// using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
278
var o1 = new MyClass();
279
var o2 = new MyClass();
281
o1.set("attr2", "foo");
282
o2.set("attr2", "foo");
284
Y.Assert.areEqual("attr1-ext1", o1.get("attr1"), "o1 attr1 incorrect");
285
Y.Assert.areEqual("attr1-ext1", o2.get("attr1"), "o2 attr1 incorrect");
287
Y.Assert.areEqual("foo", o1.get("attr2"), "o1 attr2 incorrect");
288
Y.Assert.areEqual("foo", o2.get("attr2"), "o2 attr2 incorrect");
290
Y.Assert.areEqual("attr3-ext1", o1.get("attr3"), "o1 attr3 incorrect");
291
Y.Assert.areEqual("attr3-ext1", o2.get("attr3"), "o2 attr3 incorrect");
293
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
296
"test:aggregates" : function() {
305
function MyWidget(config) {
306
MyWidget.superclass.constructor.apply(this, arguments);
309
Y.extend(MyWidget, Y.Base, {}, {
316
aggregates : ["HTML_PARSER"]
320
var MyClass = Y.Base.create("myClass", MyWidget, [Ext1]);
322
// using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
323
var o1 = new MyClass();
324
var o2 = new MyClass();
326
Y.ObjectAssert.areEqual({a:"aa", b:"bb"}, o1.constructor.HTML_PARSER, "o1 HTML_PARSER not aggregated correctly");
327
Y.ObjectAssert.areEqual({a:"aa", b:"bb"}, o2.constructor.HTML_PARSER, "o2 HTML_PARSER not aggregated correctly");
331
"test:overrides-ext-wins" : function() {
333
var actualMethodCalls = [],
334
expectedMethodCalls = [
335
"ext1::attr2::setter", // once for lazy o1
336
"ext1::attr2::setter", // once for set o1
337
"ext1::attr2::setter", // once for lazy o2
344
Ext1.prototype.methodOne = function() {
345
actualMethodCalls.push("ext1::methodOne");
354
setter: function(val) {
355
actualMethodCalls.push("ext1::attr2::setter");
365
MyClass.superclass.constructor.apply(this, arguments);
368
MyClass.NAME = "myClass";
372
value:"attr1-myClass"
375
value:"attr2-myClass",
376
setter: function(val) {
377
actualMethodCalls.push("myClass::attr2::setter");
382
value:"attr4-myClass"
386
Y.extend(MyClass, Y.Base, {
387
methodOne : function() {
388
actualMethodCalls.push("myClass::methodOne");
391
Y.Base.mix(MyClass, [Ext1]);
393
// using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
394
var o1 = new MyClass();
395
var o2 = new MyClass();
398
o1.set("attr2", "foo");
400
Y.Assert.areEqual("attr1-ext1", o1.get("attr1"), "o1 attr1 incorrect");
401
Y.Assert.areEqual("attr1-ext1", o2.get("attr1"), "o2 attr1 incorrect");
403
Y.Assert.areEqual("foo", o1.get("attr2"), "o1 attr2 incorrect");
404
Y.Assert.areEqual("attr2-ext1", o2.get("attr2"), "o2 attr2 incorrect");
406
Y.Assert.areEqual("attr3-ext1", o1.get("attr3"), "o1 attr3 incorrect");
407
Y.Assert.areEqual("attr3-ext1", o2.get("attr3"), "o2 attr3 incorrect");
409
Y.Assert.areEqual("attr4-myClass", o1.get("attr4"), "o1 attr4 incorrect");
410
Y.Assert.areEqual("attr4-myClass", o2.get("attr4"), "o2 attr4 incorrect");
415
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
418
"test:overrides-host-wins" : function() {
420
var actualMethodCalls = [],
421
expectedMethodCalls = [
422
"myClass::attr2::setter", // once for lazy o1
423
"myClass::attr2::setter", // once for set o1
424
"myClass::attr2::setter", // once for lazy o2
425
"myClass::methodOne",
431
Ext1.prototype.methodOne = function() {
432
actualMethodCalls.push("ext1::methodOne");
441
setter: function(val) {
442
actualMethodCalls.push("ext1::attr2::setter");
451
var MyClass = Y.Base.create("myClass", Y.Base, [Ext1], {
452
methodOne : function() {
453
actualMethodCalls.push("myClass::methodOne");
458
value:"attr1-myClass"
461
value:"attr2-myClass",
462
setter: function(val) {
463
actualMethodCalls.push("myClass::attr2::setter");
468
value:"attr4-myClass"
473
// Using 2 instances, just to make sure nothing static/prototype related gets broken by the 1st instance
474
var o1 = new MyClass();
475
var o2 = new MyClass();
478
o1.set("attr2", "foo");
480
Y.Assert.areEqual("attr1-myClass", o1.get("attr1"), "o1 attr1 incorrect");
481
Y.Assert.areEqual("attr1-myClass", o2.get("attr1"), "o2 attr1 incorrect");
483
Y.Assert.areEqual("foo", o1.get("attr2"), "o1 attr2 incorrect");
484
Y.Assert.areEqual("attr2-myClass", o2.get("attr2"), "o2 attr2 incorrect");
486
Y.Assert.areEqual("attr3-ext1", o1.get("attr3"), "o1 attr3 incorrect");
487
Y.Assert.areEqual("attr3-ext1", o2.get("attr3"), "o2 attr3 incorrect");
489
Y.Assert.areEqual("attr4-myClass", o1.get("attr4"), "o1 attr4 incorrect");
490
Y.Assert.areEqual("attr4-myClass", o2.get("attr4"), "o2 attr4 incorrect");
495
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
498
"test:multiext-complex" : function() {
500
var actualMethodCalls = [],
501
expectedMethodCalls = [
504
"myClass::initializer",
509
"myClass::initializer",
512
"ext2::attr3::setter",
513
"ext2::attr3::setter",
514
"myClass::methodOne",
515
"myClass::methodOne",
516
"myClass::methodTwo",
517
"myClass::methodTwo",
522
"myClass::methodFive",
523
"myClass::methodFive"
527
actualMethodCalls.push("ext1::constructor");
530
Ext1.prototype.initializer = function() {
531
actualMethodCalls.push("ext1::initializer");
534
Ext1.prototype.methodTwo = function() {
535
actualMethodCalls.push("ext1::methodTwo");
538
Ext1.prototype.methodThree = function() {
539
actualMethodCalls.push("ext1::methodThree");
548
setter: function(val) {
549
actualMethodCalls.push("ext1::attr3::setter");
559
actualMethodCalls.push("ext2::constructor");
562
Ext2.prototype.initializer = function() {
563
actualMethodCalls.push("ext2::initializer");
566
Ext2.prototype.methodThree = function() {
567
actualMethodCalls.push("ext2::methodThree");
570
Ext2.prototype.methodFour = function() {
571
actualMethodCalls.push("ext2::methodFour");
577
setter: function(val) {
578
actualMethodCalls.push("ext2::attr3::setter");
587
var MyClass = Y.Base.create("myClass", Y.Base, [Ext1, Ext2], {
589
initializer: function() {
590
actualMethodCalls.push("myClass::initializer");
593
methodOne : function() {
594
actualMethodCalls.push("myClass::methodOne");
597
methodTwo : function() {
598
actualMethodCalls.push("myClass::methodTwo");
601
methodFive : function() {
602
actualMethodCalls.push("myClass::methodFive");
607
value:"myClass-attr1"
610
value:"myClass-attr5"
615
var o1 = new MyClass();
616
var o2 = new MyClass();
618
Y.Assert.areEqual("myClass-attr1", o1.get("attr1"), "o1 attr1 incorrect");
619
Y.Assert.areEqual("myClass-attr1", o2.get("attr1"), "o2 attr1 incorrect");
621
Y.Assert.areEqual("ext1-attr2", o1.get("attr2"), "o1 attr2 incorrect");
622
Y.Assert.areEqual("ext1-attr2", o2.get("attr2"), "o2 attr2 incorrect");
624
Y.Assert.areEqual("ext2-attr3", o1.get("attr3"), "o1 attr3 incorrect");
625
Y.Assert.areEqual("ext2-attr3", o2.get("attr3"), "o2 attr3 incorrect");
627
Y.Assert.areEqual("ext2-attr4", o1.get("attr4"), "o1 attr4 incorrect");
628
Y.Assert.areEqual("ext2-attr4", o2.get("attr4"), "o2 attr4 incorrect");
630
Y.Assert.areEqual("myClass-attr5", o1.get("attr5"), "o1 attr5 incorrect");
631
Y.Assert.areEqual("myClass-attr5", o2.get("attr5"), "o2 attr5 incorrect");
644
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
647
"test:classstructure" : function() {
649
Ext1.prototype.extOne = function() {};
652
Ext2.prototype.extTwo = function() {};
654
var MyClassTwo = Y.Base.create("myClassTwo", Y.Base, [Ext1, Ext2], {
655
initializer: function() {},
656
methodOne: function() {}
659
var MyClassOne = Y.Base.create("myClassOne", Y.Base, [Ext1], {
660
initializer: function() {},
661
methodOne: function() {}
664
var o1 = new MyClassOne();
665
var o2 = new MyClassTwo();
667
Y.Assert.isTrue(o1.hasImpl(Ext1), "o1 should pass hasImpl(Ext1)");
668
Y.Assert.isFalse(o1.hasImpl(Ext2), "o1 should fail hasImpl(Ext2)");
670
Y.Assert.isTrue(o2.hasImpl(Ext1), "o2 should pass hasImpl(Ext1)");
671
Y.Assert.isTrue(o2.hasImpl(Ext2), "o2 should pass hasImpl(Ext1)");
673
Y.Assert.isTrue(o1 instanceof MyClassOne, "o1 should be an instanceof MyClassOne");
674
Y.Assert.isTrue(o1 instanceof Y.Base, "o1 should be an instanceof Base");
676
Y.Assert.isTrue(o2 instanceof MyClassTwo, "o2 should be an instanceof MyClassTwo");
677
Y.Assert.isTrue(o2 instanceof Y.Base, "o2 should be an instanceof Base");
679
Y.Assert.isFalse(o1 instanceof MyClassTwo, "o1 should NOT be an instanceof MyClassTwo");
680
Y.Assert.isFalse(o2 instanceof MyClassOne, "o2 should NOT be an instanceof MyClassOne");
682
Y.Assert.isFunction(o1.methodOne, "o1 should have a methodOne method");
683
Y.Assert.isFunction(o1.extOne, "o1 should have an extOne method");
684
Y.Assert.isUndefined(o1.extTwo, "o1 should not have an extTwo method");
686
Y.Assert.isFunction(o2.methodOne, "o2 should have a methodOne method");
687
Y.Assert.isFunction(o2.extOne, "o2 should have an extOne method");
688
Y.Assert.isFunction(o2.extTwo, "o2 should have an extTwo method");
690
Y.Assert.isTrue(MyClassOne.superclass.constructor === Y.Base, "MyClassOne should have superclass set to Base");
691
Y.Assert.isTrue(MyClassTwo.superclass.constructor === Y.Base, "MyClassTwo should have superclass set to Base");
693
// Make sure Y.Base was untouched.
694
var b = new Y.Base();
696
Y.Assert.isUndefined(b.methodOne, "Base should not have extension methods");
697
Y.Assert.isUndefined(b.extOne, "Base should not have extension methods");
698
Y.Assert.isUndefined(b.extTwo, "Base should not have extension methods");
699
Y.Assert.isFalse(MyClassOne === Y.Base);
700
Y.Assert.isFalse(MyClassTwo === Y.Base);
703
"test:extend" : function() {
705
var actualMethodCalls = [],
706
expectedMethodCalls = [
708
"myClassOne::initializer",
711
"myClassTwo::initializer",
713
"myClassOne::methodOne",
714
"myClassTwo::methodTwo",
720
actualMethodCalls.push("ext1::constructor");
722
Ext1.prototype.extOne = function() {
723
actualMethodCalls.push("ext1::extOne");
725
Ext1.prototype.initializer = function() {
726
actualMethodCalls.push("ext1::initializer");
730
actualMethodCalls.push("ext2::constructor");
732
Ext2.prototype.extTwo = function() {
733
actualMethodCalls.push("ext2::extTwo");
735
Ext2.prototype.initializer = function() {
736
actualMethodCalls.push("ext2::initializer");
739
var MyClassOne = Y.Base.create("myClassOne", Y.Base, [Ext1], {
740
initializer: function() {
741
actualMethodCalls.push("myClassOne::initializer");
743
methodOne: function() {
744
actualMethodCalls.push("myClassOne::methodOne");
748
var MyClassTwo = Y.Base.create("myClassTwo", MyClassOne, [Ext2], {
749
initializer: function() {
750
actualMethodCalls.push("myClassTwo::initializer");
752
methodTwo: function() {
753
actualMethodCalls.push("myClassTwo::methodTwo");
757
var o = new MyClassTwo();
763
Y.ArrayAssert.itemsAreEqual(expectedMethodCalls, actualMethodCalls, "Unexpected method calls");
768
Y.Test.Runner.setName("Base Tests");
769
Y.Test.Runner.add(suite);
770
Y.Test.Runner.disableLogging();
775
Y.one("#btnRun").set("disabled", false).on("click", function() {
777
console = new Y.Console({
784
entryTemplate: '<pre class="{entry_class} {cat_class} {src_class}">'+
785
'<span class="{entry_cat_class}">{label}</span>'+
786
'<span class="{entry_content_class}">{message}</span>'+
791
Y.Test.Runner.enableLogging();
796
<p><input type="button" value="Run Tests" id="btnRun" disabled=true></p>