diff --git a/limiter.js b/api/limiter.js similarity index 100% rename from limiter.js rename to api/limiter.js diff --git a/mount.js b/api/mount.js similarity index 87% rename from mount.js rename to api/mount.js index cf633938..53010bd0 100644 --- a/mount.js +++ b/api/mount.js @@ -1,4 +1,4 @@ -var createRenderer = require("./render/render") +var createRenderer = require("../render/render") var limiter = require("./limiter"); module.exports = function($window, redraw) { diff --git a/router.js b/api/router.js similarity index 85% rename from router.js rename to api/router.js index 5a3f5f62..eabd0e4c 100644 --- a/router.js +++ b/api/router.js @@ -1,5 +1,5 @@ -var createRenderer = require("./render/render") -var createRouter = require("./router/router") +var createRenderer = require("../render/render") +var createRouter = require("../router/router") var limiter = require("./limiter") module.exports = function($window, redraw) { diff --git a/api/tests/async.js b/api/tests/async.js new file mode 100644 index 00000000..e599b0bc --- /dev/null +++ b/api/tests/async.js @@ -0,0 +1,12 @@ +module.exports = { + setTimeout : function($window) { + $window.setTimeout = window.setTimeout; + $window.clearTimeout = window.clearTimeout; + }, + + requestAnimationFrame : function($window) { + $window.requestAnimationFrame = window.requestAnimationFrame; + $window.cancelAnimationFrame = window.cancelAnimationFrame; + } +} + diff --git a/api/tests/index.html b/api/tests/index.html new file mode 100644 index 00000000..6235b121 --- /dev/null +++ b/api/tests/index.html @@ -0,0 +1,31 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/api/tests/test-limiter.js b/api/tests/test-limiter.js new file mode 100644 index 00000000..e5cfb679 --- /dev/null +++ b/api/tests/test-limiter.js @@ -0,0 +1,29 @@ +"use strict" + +var o = require("../../ospec/ospec") +var domMock = require("../../test-utils/domMock") +var async = require("./async") + +var limiter = require("../limiter") + +o.spec("fps limiter", function() { + var $window, root + + [ "setTimeout", "requestAnimationFrame" ].forEach(function(type) { + o.spec(type, function() { + o.beforeEach(function() { + $window = domMock() + + async[type]($window) + }) + + o("is a function", function() { + o(typeof limiter).equals("function") + }) + + o("it returns a function", function() { + o(typeof limiter(false)).equals("function") + }) + }) + }) +}) diff --git a/api/tests/test-mount.js b/api/tests/test-mount.js new file mode 100644 index 00000000..4a5665f2 --- /dev/null +++ b/api/tests/test-mount.js @@ -0,0 +1,114 @@ +"use strict" + +var o = require("../../ospec/ospec") +var domMock = require("../../test-utils/domMock") +var async = require("./async") + +var m = require("../../render/hyperscript") +var createMounter = require("../mount") + +o.spec("m.mount", function() { + var $window, root + + o.beforeEach(function() { + $window = domMock() + async.setTimeout($window) + root = $window.document.body + }) + + o("is a function", function() { + o(typeof createMounter).equals("function") + }) + + o("returns a function after invocation", function() { + o(typeof createMounter()).equals("function") + }) + + o("updates passed in redraw object", function() { + var redraw = {} + var mount = createMounter($window, redraw) + + mount(root, { + view : function() { + return m("div") + } + }) + + o(typeof redraw.run).equals("function") + }) + + o("renders into `root`", function() { + var mount = createMounter($window, {}) + + mount(root, { + view : function() { + return m("div") + } + }) + + o(root.firstChild.nodeName).equals("DIV") + }) + + o("redraws on redraw.run()", function(done) { + var onupdate = o.spy() + var oninit = o.spy() + var redraw = {} + var mount = createMounter($window, redraw) + + mount(root, { + view : function() { + return m("div", { + oninit : oninit, + onupdate : onupdate + }) + } + }) + + o(oninit.callCount).equals(1) + + redraw.run() + + // Wrapped to give time for the rate-limited redraw to fire + setTimeout(function() { + o(onupdate.callCount).equals(1) + + done() + }, 20) + }) + + o("redraws on events", function(done, timeout) { + var onupdate = o.spy() + var oninit = o.spy() + var onclick = o.spy() + var mount = createMounter($window, {}) + var e = $window.document.createEvent("MouseEvents") + + e.initEvent("click", true, true) + + mount(root, { + view : function() { + return m("div", { + oninit : oninit, + onupdate : onupdate, + onclick : onclick, + }) + } + }) + + root.firstChild.dispatchEvent(e) + + o(oninit.callCount).equals(1) + + o(onclick.callCount).equals(1) + o(onclick.this).equals(root.firstChild) + o(onclick.args[0].type).equals("click") + o(onclick.args[0].target).equals(root.firstChild) + + // Wrapped to give time for the rate-limited redraw to fire + setTimeout(function() { + o(onupdate.callCount).equals(1) + + done() + }, 20) + }) +}) diff --git a/index.js b/index.js index c2bf5b9e..deaf3d1f 100644 --- a/index.js +++ b/index.js @@ -2,8 +2,8 @@ var m = require("./render/hyperscript") var trust = require("./render/trust") -var createMounter = require("./mount") -var createRouterInstance = require("./router") +var createMounter = require("./api/mount") +var createRouterInstance = require("./api/router") var createRequester = require("./request/request") var redraw = {run: function() {}} diff --git a/test-utils/domMock.js b/test-utils/domMock.js index 753a803f..9406d175 100644 --- a/test-utils/domMock.js +++ b/test-utils/domMock.js @@ -333,4 +333,4 @@ module.exports = function() { activeElement = $window.document.body return $window -} \ No newline at end of file +}