Upgrade to ExtJS 3.2.0 - Released 03/30/2010
[extjs.git] / test / unit / Function.js
diff --git a/test/unit/Function.js b/test/unit/Function.js
new file mode 100644 (file)
index 0000000..3a7f17b
--- /dev/null
@@ -0,0 +1,145 @@
+/*!
+ * Ext JS Library 3.2.0
+ * Copyright(c) 2006-2010 Ext JS, Inc.
+ * licensing@extjs.com
+ * http://www.extjs.com/license
+ */
+Ext.test.session.addTest('Function', {
+
+    name: 'Global Function Decorators',
+    
+    planned: 71,
+    
+    // 3
+    test_createCallback: function(){
+        var fn = function(a, b){
+            Y.Assert.areEqual('a', a, 'Test passed param');
+            Y.Assert.areEqual('b', b, 'Test passed param');
+            return 'x';
+        };
+        
+        var cb = fn.createCallback('a', 'b'),
+            rt = cb(); // does not accept params
+        Y.Assert.areEqual('x', rt, 'Test return value of callback');
+    },
+    
+    // 24
+    test_createDelegate: function(){
+        var scope = {
+            foo: 'bar'
+        };
+        
+        var fn = function(a, b, c){
+            Y.Assert.areEqual(scope, this, 'Test if "this" is correct');
+            Y.Assert.areEqual('bar', this.foo, 'Test if property matches');
+            Y.Assert.areEqual('a', a, 'Test passed param');
+            Y.Assert.areEqual('b', b, 'Test passed param');
+            Y.Assert.areEqual('c', c, 'Test passed param');
+            return 'x';
+        };
+        
+        var cb = fn.createDelegate(scope, ['b', 'c'], true /* appendArgs: true appends these to passed params */),
+            rt = cb('a'); // a b c
+        Y.Assert.areEqual('x', rt, 'Test return value');
+        
+        
+        var cbTwo = fn.createDelegate(scope, ['a', 'b'], 0);
+        rt = cbTwo('c'); // a b c
+        Y.Assert.areEqual('x', rt, 'Test return value');
+        
+        
+        var cbThree = fn.createDelegate(scope, ['b'], 1 /* this replaces at pos 1 */);
+        rt = cbThree('a', 'c'); // a b c
+        Y.Assert.areEqual('x', rt, 'Test return value');
+        
+        var cbFour = fn.createDelegate(scope, ['a', 'b', 'c']);
+        rt = cbFour('x', 'y'); // overridden with a b c
+        Y.Assert.areEqual('x', rt, 'Test return value');
+    },
+    
+    // 19
+    test_createInterceptor: function(){
+        var scope = {
+            foo: 'bar',
+            n: 0
+        };
+        
+        var fn = function(a, b){
+            Y.Assert.areEqual(scope, this, 'Test if "this" is correct');
+            Y.Assert.areEqual('bar', this.foo, 'Test if property matches');
+            Y.Assert.areEqual('a', a, 'Test passed param');
+            Y.Assert.areEqual('b', b, 'Test passed param');
+            this.n++;
+            return 'x';
+        };
+        
+        // normal
+        var rt = fn.call(scope, 'a', 'b'); // n 1
+        Y.Assert.areEqual('x', rt, 'Test the return value');
+        
+        var cb = fn.createDelegate(scope).createInterceptor(function(a, b, z){
+            Y.Assert.areEqual(scope, this, 'Test if "this" is correct');
+            Y.Assert.areEqual('bar', this.foo, 'Test if property matches');
+            Y.Assert.areEqual('a', a, 'Test passed param');
+            Y.Assert.areEqual('b', b, 'Test passed param');
+            return z === undefined;
+        }, scope);
+        // intercepted, but allowed to continue
+        rt = cb('a', 'b'); // n 2
+        Y.Assert.areEqual('x', rt, 'Test the return value');
+        
+        // intercepted, and cancelled
+        cb('a', 'b', 'z');
+        Y.Assert.areEqual(2, scope.n, 'Test the interceptor call count');
+    },
+    
+    // 16
+    test_createSequence: function(){
+        var scope = {
+            foo: 'bar',
+            seq: 0
+        };
+        
+        var fn = function(a, b){
+            Y.Assert.areEqual(scope, this, 'Test if "this" is correct');
+            Y.Assert.areEqual('bar', this.foo, 'Test if property matches');
+            Y.Assert.areEqual('a', a, 'Test passed param');
+            Y.Assert.areEqual('b', b, 'Test passed param');
+            this.seq++;
+            return 'x';
+        };
+        
+        var rt = fn.call(scope, 'a', 'b'); // seq 1
+        Y.Assert.areEqual('x', rt, 'Test the return value');
+        Y.Assert.areEqual(1, scope.seq, 'Test the counter');
+        
+        var cb = fn.createDelegate(scope).createSequence(fn, scope);
+        rt = cb('a', 'b'); // seq 2, 3
+        Y.Assert.areEqual('x', rt, 'Test the return value');
+        Y.Assert.areEqual(3, scope.seq, 'Test the number of times the sequence was called');
+    },
+    
+    // 9
+    test_defer: function(){
+        var scope = {
+            foo: 'bar',
+            n: 0
+        };
+        
+        var fn = function(a, b){
+            Y.Assert.areEqual(scope, this, 'Test if "this" is correct');
+            Y.Assert.areEqual('bar', this.foo, 'Test if property matches');
+            Y.Assert.areEqual('a', a, 'Test passed param');
+            Y.Assert.areEqual('b', b, 'Test passed param');
+            this.n++;
+        };
+        
+        fn.defer(1, scope, ['a', 'b']);
+        fn.defer(2, scope, ['a', 'b']);
+        
+        setTimeout(function(){
+            Y.Assert.areEqual(2, scope.n, 'Test if the counter matches the call timer count');
+        }, 4);
+    }
+    
+});