Mercurial > js4py-pl
diff core-javascript/core-javascript-work/tutorial.js @ 135:f9f6684f9b32 core-javascript
$ hg mv tutorial.js core-javascript-work/ # and amend the rst files also
| author | jf3243 |
|---|---|
| date | Mon, 31 Oct 2011 11:07:46 +0000 |
| parents | core-javascript/tutorial.js@31a94b4c8687 |
| children | 20d76c716c9d |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/core-javascript/core-javascript-work/tutorial.js Mon Oct 31 11:07:46 2011 +0000 @@ -0,0 +1,201 @@ +var telltail = 'global'; + +var TEST = function(title, code){ + print( 'Testing: ' + title ); + code(); +}; + +var assert = function(arg){ + if(!arg){ + ddt(); + } +}; + +'0' == 0 || ddt; +0 == '' || ddt; +'0' != '' || ddt; +NaN != NaN || ddt; + + +// start closures +TEST('closures', function() +{ + // A factory for creating get-set pairs. + var get_set_factory = function(){ + + var value; + var get = function(){ + return value; + }; + var set = function(new_value){ + value = new_value; + }; + + return { + get: get, + set: set + }; + }; + + // Create and unpack two get-set pairs. + var tmp; + tmp= get_set_factory(); + var get_a = tmp.get; + var set_a = tmp.set; + + tmp= get_set_factory(); + var get_b = tmp.get; + var set_b = tmp.set; + + // Test that both pairs work. + set_a(12); + assert( get_a() === 12 ); + + set_b(13); + assert( get_b() === 13 ); + + // Test that each pair has its own value. + assert( get_a() === 12 ); + +}); +// end closures + + +// start return_this +TEST('return_this', function() +{ + var return_this = function(){ + return this; + }; + + var default_this = return_this(); + assert( default_this.telltail === 'global' ); + + var obj = {}; + obj.return_this = return_this; + assert( obj.return_this === return_this ); + + assert( obj.return_this() === obj ); + assert( obj['return_this']() === obj ); + + assert( return_this.call(obj) === obj ); + assert( return_this.apply(obj) === obj ); + + assert( return_this.call(undefined).telltail === 'global' ); + assert( return_this.apply(undefined).telltail === 'global' ); + +}); +// end return_this + + +// start transient-bind +TEST('transient-bind', function() +{ + // Set up the test object. + var return_this = function(){ + return this; + }; + var obj = { + return_this : return_this + }; + + // Deferring method call changes the outcome. + var method_deferred = obj.return_this; + assert( method_deferred === obj.return_this ); + assert( method_deferred() !== obj.return_this() ); + + // The two outcomes, precisely stated. + assert( obj.return_this() === obj ); + assert( method_deferred().telltail === 'global' ); + +}); +// end transient-bind + + +// start millers-device +TEST('millers-device', function() +{ + var array = []; + var obj = {}; + var fn = function(){}; + + assert( typeof array === 'object' ); + assert( '' + obj === '[object Object]' ); + + assert( obj.toString() === '[object Object]' ); + + var object_toString = obj.toString; + + assert( object_toString.call(array) === '[object Array]' ); + assert( object_toString.call(fn) === '[object Function]' ); + +}); +// end millers-device + + +// start return_arguments +TEST('return_arguments', function() +{ + var return_arguments = function(){ + return arguments; + }; + + var my_arguments = return_arguments(0, 1); + + assert( my_arguments.length === 2 ); + + assert( my_arguments[0] === 0 ); + assert( my_arguments[1] === 1 ); + + assert( '' + my_arguments === '[object Object]' ); + assert( '' + [0, 1] === '0,1' ); + + var array_slice = [].slice; + var my_arguments_fixed = array_slice.call( my_arguments ); + + assert( '' + my_arguments_fixed === '0,1'); + + var obj = {}; + assert( obj.toString.call( my_arguments_fixed ) === '[object Array]' ); + +}); +// end return_arguments + + +// start new-operator +TEST('new-operator', function() +{ + var this_in_Fn; + + var Fn = function(){ + this_in_Fn = this; + }; + + this_in_Fn = null; + var non_instance = Fn(); + assert( non_instance === undefined ); + assert( this_in_Fn.telltail === 'global'); + + this_in_Fn = null; + var instance = new Fn(); + assert( instance === this_in_Fn ); + assert( instance.telltail === undefined ); + + Fn.prototype.telltail = 'instance-of-Fn'; + assert( instance.telltail === 'instance-of-Fn' ); + + Fn.prototype = { + telltail : 'prototype-is-changed' + }; + var second_instance = new Fn(); + assert( second_instance.telltail === 'prototype-is-changed' ); + + Fn.prototype = second_instance; + second_instance.i = 42; + + var third_instance = new Fn(); + assert( third_instance.telltail === 'prototype-is-changed' ); + assert( third_instance.i === 42 ); + +}); +// end new-operator
