From 62271fe5c690e7229c4aac4fc082041ec0a61288 Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Tue, 4 Dec 2012 18:09:52 +0200 Subject: [PATCH 01/15] Added namespaced RequireJS. --- common/static/js/vendor/RequireJS.js | 57 ++++++++++++++++++++++++++++ lms/envs/common.py | 1 + 2 files changed, 58 insertions(+) create mode 100644 common/static/js/vendor/RequireJS.js diff --git a/common/static/js/vendor/RequireJS.js b/common/static/js/vendor/RequireJS.js new file mode 100644 index 0000000000..a0526930ef --- /dev/null +++ b/common/static/js/vendor/RequireJS.js @@ -0,0 +1,57 @@ +/* + * This file is a wrapper for the Require JS file and module loader. Please see + * the discussion at: + * + * https://edx-wiki.atlassian.net/wiki/display/LMS/Integration+of+Require+JS+into+the+system + */ + +var RequireJS = function() { + +// Below is the unmodified minified version of Require JS. The latest can be +// found at: +// +// http://requirejs.org/docs/download.html + +/* + RequireJS 2.1.2 Copyright (c) 2010-2012, The Dojo Foundation All Rights Reserved. + Available via the MIT or new BSD license. + see: http://github.com/jrburke/requirejs for details +*/ +var requirejs,require,define; +(function(Y){function H(b){return"[object Function]"===L.call(b)}function I(b){return"[object Array]"===L.call(b)}function x(b,c){if(b){var d;for(d=0;dthis.depCount&&!this.defined){if(H(n)){if(this.events.error)try{e=j.execCb(c,n,b,e)}catch(d){a=d}else e=j.execCb(c,n,b,e);this.map.isDefine&&((b=this.module)&&void 0!==b.exports&&b.exports!==this.exports?e=b.exports:void 0===e&&this.usingExports&&(e=this.exports));if(a)return a.requireMap=this.map,a.requireModules=[this.map.id],a.requireType="define",C(this.error=a)}else e=n;this.exports=e;if(this.map.isDefine&& +!this.ignore&&(p[c]=e,l.onResourceLoad))l.onResourceLoad(j,this.map,this.depMaps);delete k[c];this.defined=!0}this.defining=!1;this.defined&&!this.defineEmitted&&(this.defineEmitted=!0,this.emit("defined",this.exports),this.defineEmitComplete=!0)}}else this.fetch()}},callPlugin:function(){var a=this.map,b=a.id,d=h(a.prefix);this.depMaps.push(d);s(d,"defined",t(this,function(e){var n,d;d=this.map.name;var v=this.map.parentMap?this.map.parentMap.name:null,f=j.makeRequire(a.parentMap,{enableBuildCallback:!0, +skipMap:!0});if(this.map.unnormalized){if(e.normalize&&(d=e.normalize(d,function(a){return c(a,v,!0)})||""),e=h(a.prefix+"!"+d,this.map.parentMap),s(e,"defined",t(this,function(a){this.init([],function(){return a},null,{enabled:!0,ignore:!0})})),d=i(k,e.id)){this.depMaps.push(e);if(this.events.error)d.on("error",t(this,function(a){this.emit("error",a)}));d.enable()}}else n=t(this,function(a){this.init([],function(){return a},null,{enabled:!0})}),n.error=t(this,function(a){this.inited=!0;this.error= +a;a.requireModules=[b];E(k,function(a){0===a.map.id.indexOf(b+"_unnormalized")&&delete k[a.map.id]});C(a)}),n.fromText=t(this,function(e,c){var d=a.name,u=h(d),v=O;c&&(e=c);v&&(O=!1);q(u);r(m.config,b)&&(m.config[d]=m.config[b]);try{l.exec(e)}catch(k){throw Error("fromText eval for "+d+" failed: "+k);}v&&(O=!0);this.depMaps.push(u);j.completeLoad(d);f([d],n)}),e.load(a.name,f,n,m)}));j.enable(d,this);this.pluginMaps[d.id]=d},enable:function(){this.enabling=this.enabled=!0;x(this.depMaps,t(this,function(a, +b){var c,e;if("string"===typeof a){a=h(a,this.map.isDefine?this.map:this.map.parentMap,!1,!this.skipMap);this.depMaps[b]=a;if(c=i(N,a.id)){this.depExports[b]=c(this);return}this.depCount+=1;s(a,"defined",t(this,function(a){this.defineDep(b,a);this.check()}));this.errback&&s(a,"error",this.errback)}c=a.id;e=k[c];!r(N,c)&&(e&&!e.enabled)&&j.enable(a,this)}));E(this.pluginMaps,t(this,function(a){var b=i(k,a.id);b&&!b.enabled&&j.enable(a,this)}));this.enabling=!1;this.check()},on:function(a,b){var c= +this.events[a];c||(c=this.events[a]=[]);c.push(b)},emit:function(a,b){x(this.events[a],function(a){a(b)});"error"===a&&delete this.events[a]}};j={config:m,contextName:b,registry:k,defined:p,urlFetched:S,defQueue:F,Module:W,makeModuleMap:h,nextTick:l.nextTick,configure:function(a){a.baseUrl&&"/"!==a.baseUrl.charAt(a.baseUrl.length-1)&&(a.baseUrl+="/");var b=m.pkgs,c=m.shim,e={paths:!0,config:!0,map:!0};E(a,function(a,b){e[b]?"map"===b?Q(m[b],a,!0,!0):Q(m[b],a,!0):m[b]=a});a.shim&&(E(a.shim,function(a, +b){I(a)&&(a={deps:a});if((a.exports||a.init)&&!a.exportsFn)a.exportsFn=j.makeShimExports(a);c[b]=a}),m.shim=c);a.packages&&(x(a.packages,function(a){a="string"===typeof a?{name:a}:a;b[a.name]={name:a.name,location:a.location||a.name,main:(a.main||"main").replace(ga,"").replace(aa,"")}}),m.pkgs=b);E(k,function(a,b){!a.inited&&!a.map.unnormalized&&(a.map=h(b))});if(a.deps||a.callback)j.require(a.deps||[],a.callback)},makeShimExports:function(a){return function(){var b;a.init&&(b=a.init.apply(Y,arguments)); +return b||a.exports&&Z(a.exports)}},makeRequire:function(a,d){function f(e,c,u){var i,m;d.enableBuildCallback&&(c&&H(c))&&(c.__requireJsBuild=!0);if("string"===typeof e){if(H(c))return C(J("requireargs","Invalid require call"),u);if(a&&r(N,e))return N[e](k[a.id]);if(l.get)return l.get(j,e,a);i=h(e,a,!1,!0);i=i.id;return!r(p,i)?C(J("notloaded",'Module name "'+i+'" has not been loaded yet for context: '+b+(a?"":". Use require([])"))):p[i]}K();j.nextTick(function(){K();m=q(h(null,a));m.skipMap=d.skipMap; +m.init(e,c,u,{enabled:!0});B()});return f}d=d||{};Q(f,{isBrowser:z,toUrl:function(b){var d=b.lastIndexOf("."),g=null;-1!==d&&(g=b.substring(d,b.length),b=b.substring(0,d));return j.nameToUrl(c(b,a&&a.id,!0),g)},defined:function(b){return r(p,h(b,a,!1,!0).id)},specified:function(b){b=h(b,a,!1,!0).id;return r(p,b)||r(k,b)}});a||(f.undef=function(b){w();var c=h(b,a,!0),d=i(k,b);delete p[b];delete S[c.url];delete X[b];d&&(d.events.defined&&(X[b]=d.events),delete k[b])});return f},enable:function(a){i(k, +a.id)&&q(a).enable()},completeLoad:function(a){var b,c,d=i(m.shim,a)||{},h=d.exports;for(w();F.length;){c=F.shift();if(null===c[0]){c[0]=a;if(b)break;b=!0}else c[0]===a&&(b=!0);D(c)}c=i(k,a);if(!b&&!r(p,a)&&c&&!c.inited){if(m.enforceDefine&&(!h||!Z(h)))return y(a)?void 0:C(J("nodefine","No define call for "+a,null,[a]));D([a,d.deps||[],d.exportsFn])}B()},nameToUrl:function(a,b){var c,d,h,f,j,k;if(l.jsExtRegExp.test(a))f=a+(b||"");else{c=m.paths;d=m.pkgs;f=a.split("/");for(j=f.length;0f.attachEvent.toString().indexOf("[native code"))&&!V?(O=!0,f.attachEvent("onreadystatechange", +b.onScriptLoad)):(f.addEventListener("load",b.onScriptLoad,!1),f.addEventListener("error",b.onScriptError,!1)),f.src=d,K=f,D?A.insertBefore(f,D):A.appendChild(f),K=null,f;$&&(importScripts(d),b.completeLoad(c))};z&&M(document.getElementsByTagName("script"),function(b){A||(A=b.parentNode);if(s=b.getAttribute("data-main"))return q.baseUrl||(G=s.split("/"),ba=G.pop(),ca=G.length?G.join("/")+"/":"./",q.baseUrl=ca,s=ba),s=s.replace(aa,""),q.deps=q.deps?q.deps.concat(s):[s],!0});define=function(b,c,d){var i, +f;"string"!==typeof b&&(d=c,c=b,b=null);I(c)||(d=c,c=[]);!c.length&&H(d)&&d.length&&(d.toString().replace(ia,"").replace(ja,function(b,d){c.push(d)}),c=(1===d.length?["require"]:["require","exports","module"]).concat(c));if(O){if(!(i=K))P&&"interactive"===P.readyState||M(document.getElementsByTagName("script"),function(b){if("interactive"===b.readyState)return P=b}),i=P;i&&(b||(b=i.getAttribute("data-requiremodule")),f=B[i.getAttribute("data-requirecontext")])}(f?f.defQueue:R).push([b,c,d])};define.amd= +{jQuery:!0};l.exec=function(b){return eval(b)};l(q)}})(this); + +// The object which will be globally available via RequireJS variable. +return { + 'requirejs': requirejs, + 'require': require, + 'define': define +}; +}(); // End-of: var RequireJS = function() diff --git a/lms/envs/common.py b/lms/envs/common.py index 26941f7e01..549dc4b29f 100644 --- a/lms/envs/common.py +++ b/lms/envs/common.py @@ -407,6 +407,7 @@ courseware_only_js += [ ] main_vendor_js = [ + 'js/vendor/RequireJS.js', 'js/vendor/json2.js', 'js/vendor/jquery.min.js', 'js/vendor/jquery-ui.min.js', From c94530cb01e1930e1bdded240371b6d0ca64017e Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 09:16:37 +0200 Subject: [PATCH 02/15] Added initial RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 lms/static/coffee/spec/requirejs_spec.coffee diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee new file mode 100644 index 0000000000..77872fb3e5 --- /dev/null +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -0,0 +1,3 @@ +describe "RequireJS", -> + it "check that the RequireJS object is present in the global namespace", -> + expect(true).toBe true From 8f120f1d27cb065c2443e5d937df1bc9d963cbce Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 09:26:46 +0200 Subject: [PATCH 03/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index 77872fb3e5..ca52bb94cc 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,3 +1,12 @@ describe "RequireJS", -> - it "check that the RequireJS object is present in the global namespace", -> - expect(true).toBe true + it "check that the RequireJS object is present in the global namespace", -> + expect RequireJS.toEqual(jasmine.any(Object)) + expect window.RequireJS.toEqual(jasmine.any(Object)) + + it "check that requirejs(), require(), and define() are not in the global namespace", -> + expect(requirejs).not.toBeDefined() + expect(require).not.toBeDefined() + expect(define).not.toBeDefined() + expect(window.requirejs).not.toBeDefined() + expect(window.require).not.toBeDefined() + expect(window.define).not.toBeDefined() From c4f336d8fdcfe93af30feaf81d04c426b05c699e Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 09:31:43 +0200 Subject: [PATCH 04/15] Added RequireJS.js to the files.json config so that is it also loaded when testing with Jasmine. --- lms/static/coffee/files.json | 1 + 1 file changed, 1 insertion(+) diff --git a/lms/static/coffee/files.json b/lms/static/coffee/files.json index 4721ef58bb..5dc03613b9 100644 --- a/lms/static/coffee/files.json +++ b/lms/static/coffee/files.json @@ -1,5 +1,6 @@ { "js_files": [ + "/static/js/vendor/RequireJS.js", "/static/js/vendor/jquery.min.js", "/static/js/vendor/jquery-ui.min.js", "/static/js/vendor/jquery.leanModal.min.js", From 7cf848db9edb4fb84ebff5761e7dd0bb27d1319d Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 09:34:24 +0200 Subject: [PATCH 05/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index ca52bb94cc..e988e3ae6e 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,7 +1,7 @@ describe "RequireJS", -> it "check that the RequireJS object is present in the global namespace", -> - expect RequireJS.toEqual(jasmine.any(Object)) - expect window.RequireJS.toEqual(jasmine.any(Object)) + expect(RequireJS).toEqual jasmine.any(Object) + expect(window.RequireJS).toEqual jasmine.any(Object) it "check that requirejs(), require(), and define() are not in the global namespace", -> expect(requirejs).not.toBeDefined() From 8af93229d32525d880e4f1bf1685b97ccc7e2d1d Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 09:44:08 +0200 Subject: [PATCH 06/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 26 ++++++++++++-------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index e988e3ae6e..8f271c80ce 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,12 +1,18 @@ describe "RequireJS", -> - it "check that the RequireJS object is present in the global namespace", -> - expect(RequireJS).toEqual jasmine.any(Object) - expect(window.RequireJS).toEqual jasmine.any(Object) + beforeEach -> + @addMatchers requirejsTobeUndefined: -> + typeof requirejs is "undefined" - it "check that requirejs(), require(), and define() are not in the global namespace", -> - expect(requirejs).not.toBeDefined() - expect(require).not.toBeDefined() - expect(define).not.toBeDefined() - expect(window.requirejs).not.toBeDefined() - expect(window.require).not.toBeDefined() - expect(window.define).not.toBeDefined() + + it "check that the RequireJS object is present in the global namespace", -> + expect(RequireJS).toEqual jasmine.any(Object) + expect(window.RequireJS).toEqual jasmine.any(Object) + + it "check that requirejs(), require(), and define() are not in the global namespace", -> + expect({}).requirejsTobeUndefined() + + # expect(require).not.toBeDefined(); + # expect(define).not.toBeDefined(); + expect(window.requirejs).not.toBeDefined() + expect(window.require).not.toBeDefined() + expect(window.define).not.toBeDefined() From d0c72ebe160a958b24117c29fa144ae88f9ddd8b Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 09:46:39 +0200 Subject: [PATCH 07/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index 8f271c80ce..9e20f0c303 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,7 +1,14 @@ describe "RequireJS", -> beforeEach -> - @addMatchers requirejsTobeUndefined: -> - typeof requirejs is "undefined" + @addMatchers + requirejsTobeUndefined: -> + typeof requirejs is "undefined" + + requireTobeUndefined: -> + typeof require is "undefined" + + defineTobeUndefined: -> + typeof define is "undefined" it "check that the RequireJS object is present in the global namespace", -> @@ -10,9 +17,8 @@ describe "RequireJS", -> it "check that requirejs(), require(), and define() are not in the global namespace", -> expect({}).requirejsTobeUndefined() - - # expect(require).not.toBeDefined(); - # expect(define).not.toBeDefined(); + expect({}).requireTobeUndefined() + expect({}).defineTobeUndefined() expect(window.requirejs).not.toBeDefined() expect(window.require).not.toBeDefined() expect(window.define).not.toBeDefined() From de635410498f0fb3bd293a8636c20bf759b54c68 Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 09:49:31 +0200 Subject: [PATCH 08/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index 9e20f0c303..13dff4b633 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -22,3 +22,8 @@ describe "RequireJS", -> expect(window.requirejs).not.toBeDefined() expect(window.require).not.toBeDefined() expect(window.define).not.toBeDefined() + + it "check that the RequireJS has requirejs(), require(), and define() functions as its properties", -> + expect(RequireJS.requirejs).toEqual jasmine.any(Function) + expect(RequireJS.require).toEqual jasmine.any(Function) + expect(RequireJS.define).toEqual jasmine.any(Function) From fd0ec0ed8a45d02f80c68e15fed3dd34291cec7a Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 10:42:40 +0200 Subject: [PATCH 09/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 29 ++++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index 13dff4b633..c6f8c1e5d5 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,4 +1,4 @@ -describe "RequireJS", -> +describe "RequireJS namespacing", -> beforeEach -> @addMatchers requirejsTobeUndefined: -> @@ -23,7 +23,26 @@ describe "RequireJS", -> expect(window.require).not.toBeDefined() expect(window.define).not.toBeDefined() - it "check that the RequireJS has requirejs(), require(), and define() functions as its properties", -> - expect(RequireJS.requirejs).toEqual jasmine.any(Function) - expect(RequireJS.require).toEqual jasmine.any(Function) - expect(RequireJS.define).toEqual jasmine.any(Function) + +describe "RequireJS module creation", -> + inCallback = undefined + it "check that we can use RequireJS.define() to create a module", -> + runs -> + inCallback = false + RequireJS.define [], -> + inCallback = true + module_status: "OK" + + + waitsFor (-> + inCallback + ), "We should eventually end up in the defined callback", 1000 + runs -> + expects(inCallback).toBeTruthy() + + + + +# it('check that we can use RequireJS.require() to get our defined module', function () { + +# }); \ No newline at end of file From 213ca3fa325f3299386cb32b9bf3d8015e78913e Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 10:50:02 +0200 Subject: [PATCH 10/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 27 +++++++++++--------- 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index c6f8c1e5d5..45bcd8d6c5 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -25,24 +25,27 @@ describe "RequireJS namespacing", -> describe "RequireJS module creation", -> - inCallback = undefined - it "check that we can use RequireJS.define() to create a module", -> + inDefineCallback = undefined + inRequireCallback = undefined + it "check that we can use RequireJS define() and require() a module", -> runs -> - inCallback = false - RequireJS.define [], -> - inCallback = true + inDefineCallback = false + inRequireCallback = false + RequireJS.define "test_module", [], -> + inDefineCallback = true module_status: "OK" + RequireJS.require "test_module", (test_module) -> + inRequireCallback = true + expects(test_module.module_status).toBe "OK" + waitsFor (-> - inCallback + return false if (inDefineCallback isnt true) or (inRequireCallback isnt true) + true ), "We should eventually end up in the defined callback", 1000 runs -> - expects(inCallback).toBeTruthy() + expects(inDefineCallback).toBeTruthy() + expects(inRequireCallback).toBeTruthy() - - -# it('check that we can use RequireJS.require() to get our defined module', function () { - -# }); \ No newline at end of file From 37c7967e8ca69d44e5c912eebb39ba9e16f912a7 Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 10:51:34 +0200 Subject: [PATCH 11/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index 45bcd8d6c5..bad2f823db 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -35,7 +35,7 @@ describe "RequireJS module creation", -> inDefineCallback = true module_status: "OK" - RequireJS.require "test_module", (test_module) -> + RequireJS.require ["test_module"], (test_module) -> inRequireCallback = true expects(test_module.module_status).toBe "OK" From f2cce07bd7d88692e7ca49a51941331d5a420f95 Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 10:52:48 +0200 Subject: [PATCH 12/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 95 ++++++++++++-------- 1 file changed, 56 insertions(+), 39 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index bad2f823db..fd3bc4ec42 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,51 +1,68 @@ -describe "RequireJS namespacing", -> - beforeEach -> - @addMatchers - requirejsTobeUndefined: -> - typeof requirejs is "undefined" +describe('RequireJS namespacing', function() { + beforeEach(function() { + this.addMatchers({ + requirejsTobeUndefined: function() { + return (typeof requirejs === 'undefined'); + }, + requireTobeUndefined: function() { + return (typeof require === 'undefined'); + }, + defineTobeUndefined: function() { + return (typeof define === 'undefined'); + }, + }); + }); - requireTobeUndefined: -> - typeof require is "undefined" + it('check that the RequireJS object is present in the global namespace', function() { + expect(RequireJS).toEqual(jasmine.any(Object)); + expect(window.RequireJS).toEqual(jasmine.any(Object)); + }); - defineTobeUndefined: -> - typeof define is "undefined" + it('check that requirejs(), require(), and define() are not in the global namespace', function () { + expect({}).requirejsTobeUndefined(); + expect({}).requireTobeUndefined(); + expect({}).defineTobeUndefined(); + expect(window.requirejs).not.toBeDefined(); + expect(window.require).not.toBeDefined(); + expect(window.define).not.toBeDefined(); + }); +}); - it "check that the RequireJS object is present in the global namespace", -> - expect(RequireJS).toEqual jasmine.any(Object) - expect(window.RequireJS).toEqual jasmine.any(Object) +describe('RequireJS module creation', function() { + var inDefineCallback, inRequireCallback; - it "check that requirejs(), require(), and define() are not in the global namespace", -> - expect({}).requirejsTobeUndefined() - expect({}).requireTobeUndefined() - expect({}).defineTobeUndefined() - expect(window.requirejs).not.toBeDefined() - expect(window.require).not.toBeDefined() - expect(window.define).not.toBeDefined() + it('check that we can use RequireJS define() and require() a module', function() { + runs(function () { + inDefineCallback = false; + inRequireCallback = false; + RequireJS.define('test_module', [], function () { + inDefineCallback = true; -describe "RequireJS module creation", -> - inDefineCallback = undefined - inRequireCallback = undefined - it "check that we can use RequireJS define() and require() a module", -> - runs -> - inDefineCallback = false - inRequireCallback = false - RequireJS.define "test_module", [], -> - inDefineCallback = true - module_status: "OK" + return { + 'module_status': 'OK' + }; + }); - RequireJS.require ["test_module"], (test_module) -> - inRequireCallback = true - expects(test_module.module_status).toBe "OK" + RequireJS.require(['test_module'], function (test_module) { + inRequireCallback = true; + expect(test_module.module_status).toBe('OK'); + }); + }); - waitsFor (-> - return false if (inDefineCallback isnt true) or (inRequireCallback isnt true) - true - ), "We should eventually end up in the defined callback", 1000 - runs -> - expects(inDefineCallback).toBeTruthy() - expects(inRequireCallback).toBeTruthy() + waitsFor(function () { + if ((inDefineCallback !== true) || (inRequireCallback !== true)) { + return false; + } + return true + }, 'We should eventually end up in the defined callback', 1000); + runs(function () { + expect(inDefineCallback).toBeTruthy(); + expect(inRequireCallback).toBeTruthy(); + }); + }); +}); From c5cd67a6a5cb87cf0be894e692f4c122946ca1de Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 10:55:10 +0200 Subject: [PATCH 13/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 95 ++++++++------------ 1 file changed, 39 insertions(+), 56 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index fd3bc4ec42..1636dd9d21 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,68 +1,51 @@ -describe('RequireJS namespacing', function() { - beforeEach(function() { - this.addMatchers({ - requirejsTobeUndefined: function() { - return (typeof requirejs === 'undefined'); - }, - requireTobeUndefined: function() { - return (typeof require === 'undefined'); - }, - defineTobeUndefined: function() { - return (typeof define === 'undefined'); - }, - }); - }); +describe "RequireJS namespacing", -> + beforeEach -> + @addMatchers + requirejsTobeUndefined: -> + typeof requirejs is "undefined" - it('check that the RequireJS object is present in the global namespace', function() { - expect(RequireJS).toEqual(jasmine.any(Object)); - expect(window.RequireJS).toEqual(jasmine.any(Object)); - }); + requireTobeUndefined: -> + typeof require is "undefined" - it('check that requirejs(), require(), and define() are not in the global namespace', function () { - expect({}).requirejsTobeUndefined(); - expect({}).requireTobeUndefined(); - expect({}).defineTobeUndefined(); + defineTobeUndefined: -> + typeof define is "undefined" - expect(window.requirejs).not.toBeDefined(); - expect(window.require).not.toBeDefined(); - expect(window.define).not.toBeDefined(); - }); -}); -describe('RequireJS module creation', function() { - var inDefineCallback, inRequireCallback; + it "check that the RequireJS object is present in the global namespace", -> + expect(RequireJS).toEqual jasmine.any(Object) + expect(window.RequireJS).toEqual jasmine.any(Object) - it('check that we can use RequireJS define() and require() a module', function() { - runs(function () { - inDefineCallback = false; - inRequireCallback = false; + it "check that requirejs(), require(), and define() are not in the global namespace", -> + expect({}).requirejsTobeUndefined() + expect({}).requireTobeUndefined() + expect({}).defineTobeUndefined() + expect(window.requirejs).not.toBeDefined() + expect(window.require).not.toBeDefined() + expect(window.define).not.toBeDefined() - RequireJS.define('test_module', [], function () { - inDefineCallback = true; - return { - 'module_status': 'OK' - }; - }); +describe "RequireJS module creation", -> + inDefineCallback = undefined + inRequireCallback = undefined + it "check that we can use RequireJS define() and require() a module", -> + runs -> + inDefineCallback = false + inRequireCallback = false + RequireJS.define "test_module", [], -> + inDefineCallback = true + module_status: "OK" - RequireJS.require(['test_module'], function (test_module) { - inRequireCallback = true; + RequireJS.require ["test_module"], (test_module) -> + inRequireCallback = true + expect(test_module.module_status).toBe "OK" - expect(test_module.module_status).toBe('OK'); - }); - }); - waitsFor(function () { - if ((inDefineCallback !== true) || (inRequireCallback !== true)) { - return false; - } + waitsFor (-> + return false if (inDefineCallback isnt true) or (inRequireCallback isnt true) + true + ), "We should eventually end up in the defined callback", 1000 + runs -> + expect(inDefineCallback).toBeTruthy() + expect(inRequireCallback).toBeTruthy() - return true - }, 'We should eventually end up in the defined callback', 1000); - runs(function () { - expect(inDefineCallback).toBeTruthy(); - expect(inRequireCallback).toBeTruthy(); - }); - }); -}); From 7a8d83a17fc9d934b95ccc4bcd2a2ecdf342cc85 Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 11:21:18 +0200 Subject: [PATCH 14/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 42 +++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index 1636dd9d21..3e54560d2b 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,5 +1,10 @@ describe "RequireJS namespacing", -> beforeEach -> + + # + # * Jasmine does not provide a way to use the typeof operator. We need + # * to create our own custom matchers so that a TypeError is not thrown. + # @addMatchers requirejsTobeUndefined: -> typeof requirejs is "undefined" @@ -16,6 +21,10 @@ describe "RequireJS namespacing", -> expect(window.RequireJS).toEqual jasmine.any(Object) it "check that requirejs(), require(), and define() are not in the global namespace", -> + + # The custom matchers that we defined in the beforeEach() function do + # not operate on an object. We pass a dummy empty object {} not to + # confuse Jasmine. expect({}).requirejsTobeUndefined() expect({}).requireTobeUndefined() expect({}).defineTobeUndefined() @@ -27,23 +36,54 @@ describe "RequireJS namespacing", -> describe "RequireJS module creation", -> inDefineCallback = undefined inRequireCallback = undefined - it "check that we can use RequireJS define() and require() a module", -> + it "check that we can use RequireJS to define() and require() a module", -> + + # Because Require JS works asynchronously when defining and requiring + # modules, we need to use the special Jasmine functions runs(), and + # waitsFor() to set up this test. runs -> + + # Initialize the variable that we will test for. They will be set + # to true in the appropriate callback functions called by Require + # JS. If their values do not change, this will mean that something + # is not working as is intended. inDefineCallback = false inRequireCallback = false + + # Define our test module. RequireJS.define "test_module", [], -> inDefineCallback = true + + # This module returns an object. It can be accessed via the + # Require JS require() function. module_status: "OK" + + # Require our defined test module. RequireJS.require ["test_module"], (test_module) -> inRequireCallback = true + + # If our test module was defined properly, then we should + # be able to get the object it returned, and query some + # property. expect(test_module.module_status).toBe "OK" + + # We will wait for a specified amount of time (1 second), before + # checking if our module was defined and that we were able to + # require() the module. waitsFor (-> + + # If at least one of the callback functions was not reached, we + # fail this test. return false if (inDefineCallback isnt true) or (inRequireCallback isnt true) + + # Both of the callbacks were reached. true ), "We should eventually end up in the defined callback", 1000 + + # The final test behavior, after waitsFor() finishes waiting. runs -> expect(inDefineCallback).toBeTruthy() expect(inRequireCallback).toBeTruthy() From 233a35e01e1a289b0fd66d121cdf86d610774971 Mon Sep 17 00:00:00 2001 From: valera-rozuvan Date: Wed, 5 Dec 2012 11:32:10 +0200 Subject: [PATCH 15/15] Work on RequireJS Jasmine test. --- lms/static/coffee/spec/requirejs_spec.coffee | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lms/static/coffee/spec/requirejs_spec.coffee b/lms/static/coffee/spec/requirejs_spec.coffee index 3e54560d2b..10d34a2f75 100644 --- a/lms/static/coffee/spec/requirejs_spec.coffee +++ b/lms/static/coffee/spec/requirejs_spec.coffee @@ -1,10 +1,8 @@ describe "RequireJS namespacing", -> beforeEach -> - # - # * Jasmine does not provide a way to use the typeof operator. We need - # * to create our own custom matchers so that a TypeError is not thrown. - # + # Jasmine does not provide a way to use the typeof operator. We need + # to create our own custom matchers so that a TypeError is not thrown. @addMatchers requirejsTobeUndefined: -> typeof requirejs is "undefined"