--- /dev/null
+/*!
+ * 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);
+ }
+
+});