diff options
-rw-r--r-- | .gitignore | 1 | ||||
-rw-r--r-- | package.json | 5 | ||||
-rw-r--r-- | public/js/mp/dye.js | 10 | ||||
-rw-r--r-- | test/data/bigcake.png | bin | 0 -> 957 bytes | |||
-rw-r--r-- | test/data/whitecake.png | bin | 0 -> 548 bytes | |||
-rw-r--r-- | test/load.js | 65 | ||||
-rw-r--r-- | test/mp/dye.js | 1 | ||||
-rw-r--r-- | test/mp/future.js | 67 | ||||
-rwxr-xr-x | todo.sh | 2 |
9 files changed, 122 insertions, 29 deletions
@@ -1 +1,2 @@ *~ +node_modules diff --git a/package.json b/package.json index 661b533..cca8995 100644 --- a/package.json +++ b/package.json @@ -6,9 +6,10 @@ "smash": "~0.0.8", "uglify-js": "2.2.x", "vows": "0.7.x", - "jsdom": "0.5.x" + "jsdom": "0.5.x", + "canvas": "1.0.x" }, "scripts": { - "test": "node_modules/vows/bin/vows --spec 'test/*/*.js$'" + "test": "ls test/*/*.js | grep -v 'future\\.js$' | xargs node_modules/vows/bin/vows" } } diff --git a/public/js/mp/dye.js b/public/js/mp/dye.js index d4c016b..530b6c4 100644 --- a/public/js/mp/dye.js +++ b/public/js/mp/dye.js @@ -1,7 +1,9 @@ "use strict"; var mp = function(mp) { mp.dye = { - getChannel: getChannel + getChannel: getChannel, + parseDyeString: parseDyeString, + dyeImage: dyeImage }; var channel = [null, "R", "G", "Y", "B", "M", "C", "W"]; function getChannel(color) { @@ -26,5 +28,11 @@ var mp = function(mp) { return { channel: channel[idx], intensity: max }; } + function parseDyeString(dyeString) { + /* TODO */ + } + function dyeImage(imageData, dyeData) { + /* TODO */ + } return mp; }(mp || {}); diff --git a/test/data/bigcake.png b/test/data/bigcake.png Binary files differnew file mode 100644 index 0000000..7cc92b5 --- /dev/null +++ b/test/data/bigcake.png diff --git a/test/data/whitecake.png b/test/data/whitecake.png Binary files differnew file mode 100644 index 0000000..9bc96cb --- /dev/null +++ b/test/data/whitecake.png diff --git a/test/load.js b/test/load.js index d04c647..97bee69 100644 --- a/test/load.js +++ b/test/load.js @@ -1,44 +1,57 @@ +"use strict"; process.env.TZ = "UTC"; var smash = require("smash"), jsdom = require("jsdom"); module.exports = function() { - var files = [].slice.call(arguments).map(function(d) { return "public/js/" + d; }), - expression = "mp", - sandbox = {}; + var files = [].slice.call(arguments).map(function(d) { return "public/js/" + d; }), + expression = "mp", + sandbox = {}, + domString = "<html><head></head><body></body></html>"; + + function topic() { + smash.load(files, expression, sandbox, this.callback); + } + + topic.expression = function(_) { + expression = _; + return topic; + }; - function topic() { - smash.load(files, expression, sandbox, this.callback); - } + topic.dom = function(_) { + if (!arguments.length) return domString; + domString = _; + return topic; + }; - topic.expression = function(_) { - expression = _; - return topic; - }; + topic.body = function(_) { + topic.dom("<html><head></head><body>" + _ + "</body></html>"); + return topic; + }; - topic.document = function(_) { - var document = jsdom.jsdom("<html><head></head><body></body></html>"); + topic.document = function(_) { + var document = arguments.length ? _ : jsdom.jsdom(domString); - document.createRange = function() { - return { - selectNode: function() {}, - createContextualFragment: jsdom.jsdom - }; - }; + document.createRange = function() { + return { + selectNode: function() {}, + createContextualFragment: jsdom.jsdom + }; + }; + + sandbox = { + console: console, + document: document, + window: document.createWindow(), + }; - sandbox = { - console: console, - document: document, - window: document.createWindow(), + return topic; }; return topic; - }; - - return topic; }; process.on("uncaughtException", function(e) { - console.trace(e.stack); + console.trace(e.stack); }); diff --git a/test/mp/dye.js b/test/mp/dye.js index a4819ae..36acfa3 100644 --- a/test/mp/dye.js +++ b/test/mp/dye.js @@ -1,3 +1,4 @@ +"use strict"; var vows = require("vows"), load = require("../load"), assert = require("assert"); diff --git a/test/mp/future.js b/test/mp/future.js new file mode 100644 index 0000000..6f491ae --- /dev/null +++ b/test/mp/future.js @@ -0,0 +1,67 @@ +"use strict"; +var vows = require("vows"), + load = require("../load"), + assert = require("assert"), + jsdom = require("jsdom"), + Canvas = require("canvas"), + Image = Canvas.Image; + +var suite = vows.describe("mp.dye"); + +var canvas = new Canvas(32,32); +var context = canvas.getContext("2d"); + +var dyeString = "R:#ede5b2,fff7bf;G:#cccccc,ffffff"; +var dyeData = { + "R": [ + [0xed, 0xe5, 0xb2], + [0xff, 0xf7, 0xbf] + ], + "G": [ + [0xcc, 0xcc, 0xcc], + [0xff, 0xff, 0xff] + ] +}; + +function loadImage(url, tests) { + tests.topic = function() { + var image = new Image; + var tester = this; + var callback = this.callback; + var args = arguments; + image.onload = function() { + canvas.width = image.width; + canvas.height = image.height; + context.drawImage(image, 0, 0); + callback = callback.bind(tester, false, context.getImageData(0, 0, image.width, image.height)); + callback.apply(tester, args); + } + image.onerror = function(err) { + throw new Error("Error loading '" + url + "': " + err); + } + image.src = url; + }; + return tests; +} + +suite.addBatch({ + "The manaportal dye": { + topic: load("mp/dye").expression("mp.dye").document(), + "parseDyeString": { + "Extracts a the dye channel data from the dyestring": function(dye) { + assert.equal(dye.parseDyeString(dyeString), dyeData); + } + }, + "dyeImage": { + "with the big recolorable cake": loadImage("test/data/bigcake.png", { + "to the big white cake": loadImage("test/data/whitecake.png", { + "dyes correctly when given the correct dye data": function(err1, whiteCake, dyeableCake, dye) { + assert.deepEqual(dye.dyeImage(dyeableCake.data, dyeData), whiteCake.data); + } + }) + }) + } + } +}); + +suite.export(module); @@ -0,0 +1,2 @@ +#!/bin/bash +node_modules/vows/bin/vows --spec 'test/*/*.js$' |