summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore1
-rw-r--r--package.json5
-rw-r--r--public/js/mp/dye.js10
-rw-r--r--test/data/bigcake.pngbin0 -> 957 bytes
-rw-r--r--test/data/whitecake.pngbin0 -> 548 bytes
-rw-r--r--test/load.js65
-rw-r--r--test/mp/dye.js1
-rw-r--r--test/mp/future.js67
-rwxr-xr-xtodo.sh2
9 files changed, 122 insertions, 29 deletions
diff --git a/.gitignore b/.gitignore
index b25c15b..5396b94 100644
--- a/.gitignore
+++ b/.gitignore
@@ -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
new file mode 100644
index 0000000..7cc92b5
--- /dev/null
+++ b/test/data/bigcake.png
Binary files differ
diff --git a/test/data/whitecake.png b/test/data/whitecake.png
new file mode 100644
index 0000000..9bc96cb
--- /dev/null
+++ b/test/data/whitecake.png
Binary files differ
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);
diff --git a/todo.sh b/todo.sh
new file mode 100755
index 0000000..ce775d2
--- /dev/null
+++ b/todo.sh
@@ -0,0 +1,2 @@
+#!/bin/bash
+node_modules/vows/bin/vows --spec 'test/*/*.js$'