Add tests for xhr and friends.

This commit is contained in:
Mike Bostock 2011-08-16 22:28:15 -07:00
Родитель 40b98c4d7b
Коммит 746ec74663
14 изменённых файлов: 378 добавлений и 72 удалений

2
examples/data/sample.csv Normal file
Просмотреть файл

@ -0,0 +1,2 @@
Hello,World
42,"""fish"""
1 Hello World
2 42 "fish"

Просмотреть файл

@ -0,0 +1,5 @@
<!DOCTYPE html>
<html>
<body>
<h1>Hello &amp; world!</h1>
</html>

Просмотреть файл

@ -0,0 +1 @@
[{"Hello":42,"World":"\"fish\""}]

1
examples/data/sample.txt Normal file
Просмотреть файл

@ -0,0 +1 @@
Hello, world!

4
examples/data/sample.xml Normal file
Просмотреть файл

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8" ?>
<hello>
<world name="Earth"/>
</hello>

37
test/core/html-test.js Normal file
Просмотреть файл

@ -0,0 +1,37 @@
require("../env");
require("../../d3");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.html");
suite.addBatch({
"html": {
topic: function() {
var cb = this.callback;
return d3.html("examples/data/sample.html", function(document) {
cb(null, document);
});
},
"invokes the callback with the loaded html": function(document) {
assert.equal(document.getElementsByTagName("H1")[0].textContent, "Hello & world!");
},
"override the mime type to text/html": function(xml) {
assert.equal(XMLHttpRequest._last._info.mimeType, "text/html");
},
"": {
topic: function() {
var cb = this.callback;
return d3.html("//does/not/exist.html", function(document) {
cb(null, document);
});
},
"invokes the callback with null when an error occurs": function(document) {
assert.isNull(document);
}
}
}
});
suite.export(module);

37
test/core/json-test.js Normal file
Просмотреть файл

@ -0,0 +1,37 @@
require("../env");
require("../../d3");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.json");
suite.addBatch({
"json": {
topic: function() {
var cb = this.callback;
return d3.json("examples/data/sample.json", function(json) {
cb(null, json);
});
},
"invokes the callback with the loaded JSON": function(json) {
assert.deepEqual(json, [{"Hello":42,"World":"\"fish\""}]);
},
"overrides the mime type to application/json": function(json) {
assert.equal(XMLHttpRequest._last._info.mimeType, "application/json");
},
"": {
topic: function() {
var cb = this.callback;
return d3.json("//does/not/exist.json", function(json) {
cb(null, json);
});
},
"invokes the callback with null when an error occurs": function(json) {
assert.isNull(json);
}
}
}
});
suite.export(module);

48
test/core/text-test.js Normal file
Просмотреть файл

@ -0,0 +1,48 @@
require("../env");
require("../../d3");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.text");
suite.addBatch({
"text": {
topic: function() {
var cb = this.callback;
return d3.text("examples/data/sample.txt", function(text) {
cb(null, text);
});
},
"invokes the callback with the loaded text": function(text) {
assert.equal(text, "Hello, world!\n");
},
"does not override the mime type by default": function(text) {
assert.isUndefined(XMLHttpRequest._last._info.mimeType);
},
"": {
topic: function() {
var cb = this.callback;
return d3.text("examples/data/sample.txt", "text/plain+sample", function(text) {
cb(null, text);
});
},
"observes the optional mime type": function(text) {
assert.equal(XMLHttpRequest._last._info.mimeType, "text/plain+sample");
}
},
" ": {
topic: function() {
var cb = this.callback;
return d3.text("//does/not/exist.txt", function(text) {
cb(null, text);
});
},
"invokes the callback with null when an error occurs": function(text) {
assert.isNull(text);
}
}
}
});
suite.export(module);

56
test/core/xhr-test.js Normal file
Просмотреть файл

@ -0,0 +1,56 @@
require("../env");
require("../../d3");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.xhr");
suite.addBatch({
"xhr": {
topic: function() {
var cb = this.callback;
return d3.xhr("examples/data/sample.txt", function(req) {
cb(null, req);
});
},
"makes an asynchronous HTTP request": function(req) {
assert.equal(req._info.url, "examples/data/sample.txt");
assert.isTrue(req._info.async);
},
"invokes the callback with the request object": function(req) {
assert.equal(req.responseText, "Hello, world!\n");
},
"does not override the mime type by default": function(req) {
assert.isUndefined(req._info.mimeType);
},
"waits until the request is done": function(req) {
assert.equal(req.readyState, 4);
assert.equal(req.status, 200);
},
"": {
topic: function() {
var cb = this.callback;
return d3.xhr("examples/data/sample.txt", "text/plain", function(req) {
cb(null, req);
});
},
"observes the optional mime type": function(req) {
assert.equal(req._info.mimeType, "text/plain");
}
},
" ": {
topic: function() {
var cb = this.callback;
return d3.xhr("//does/not/exist.txt", function(req) {
cb(null, req);
});
},
"invokes the callback with null when an error occurs": function(req) {
assert.isNull(req);
}
}
}
});
suite.export(module);

48
test/core/xml-test.js Normal file
Просмотреть файл

@ -0,0 +1,48 @@
require("../env");
require("../../d3");
var vows = require("vows"),
assert = require("assert");
var suite = vows.describe("d3.xml");
suite.addBatch({
"xml": {
topic: function() {
var cb = this.callback;
return d3.xml("examples/data/sample.xml", function(xml) {
cb(null, xml);
});
},
"invokes the callback with the loaded xml": function(xml) {
assert.deepEqual(xml, {_xml: "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n<hello>\n <world name=\"Earth\"/>\n</hello>\n"});
},
"does not override the mime type by default": function(xml) {
assert.isUndefined(XMLHttpRequest._last._info.mimeType);
},
"": {
topic: function() {
var cb = this.callback;
return d3.xml("examples/data/sample.txt", "application/xml+sample", function(xml) {
cb(null, xml);
});
},
"observes the optional mime type": function(xml) {
assert.equal(XMLHttpRequest._last._info.mimeType, "application/xml+sample");
}
},
" ": {
topic: function() {
var cb = this.callback;
return d3.xml("//does/not/exist.xml", function(xml) {
cb(null, xml);
});
},
"invokes the callback with null when an error occurs": function(xml) {
assert.isNull(xml);
}
}
}
});
suite.export(module);

72
test/env-assert.js Normal file
Просмотреть файл

@ -0,0 +1,72 @@
var assert = require("assert");
assert.inDelta = function (actual, expected, delta, message) {
var lower = expected - delta;
var upper = expected + delta;
if (actual != +actual || actual < lower || actual > upper) {
assert.fail(actual, expected, message || "expected {actual} to be in within *" + delta.toString() + "* of {expected}", null, assert.inDelta);
}
};
assert.domNull = function(actual, message) {
if (actual !== null) {
assert.fail(actual+"", null, message || "expected null, got {actual}", "===", assert.domNull);
}
};
assert.domEqual = function(actual, expected, message) {
if (actual !== expected) {
assert.fail(actual+"", expected+"", message || "expected {expected}, got {actual}", "===", assert.domEqual);
}
};
assert.rgbEqual = function(actual, r, g, b, message) {
if (actual.r !== r || actual.g !== g || actual.b !== b) {
assert.fail("rgb(" + actual.r + "," + actual.g + "," + actual.b + ")", "rgb(" + r + ", " + g + ", " + b + ")", message || "expected {expected}, got {actual}", "===", assert.rgbEqual);
}
};
assert.hslEqual = function(actual, h, s, l, message) {
if (Math.abs(actual.h - h) > 1e-6 || Math.abs(actual.s - s) > 1e-6 || Math.abs(actual.l - l) > 1e-6) {
assert.fail(actual+"", "hsl(" + h + "," + (s * 100) + "%," + (l * 100) + "%)", message || "expected {expected}, got {actual}", null, assert.hslEqual);
}
};
assert.pathEqual = function(actual, expected, message) {
if (!pathEqual(actual, expected)) {
assert.fail(actual, expected, message || "expected {expected}, got {actual}", null, assert.pathEqual);
}
};
function pathEqual(a, b) {
a = parsePath(a);
b = parsePath(b);
var n = a.length, i = -1, x, y;
if (n !== b.length) return false;
while (++i < n) {
x = a[i];
y = b[i];
if (typeof x === "string") {
if (x !== y) return false;
} else if (typeof y !== "number") {
return false;
} else if (Math.abs(x - y) > 1e-6) {
return false;
}
}
return true;
}
function parsePath(path) {
var re = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, parts = [];
for (var i = 0, s0 = 0, s1, m; m = re.exec(path); ++i) {
if (m.index) {
var part = path.substring(s0, s1 = m.index);
if (!/^[, ]$/.test(part)) parts.push(part);
}
parts.push(parseFloat(m[0]));
s0 = re.lastIndex;
}
if (s0 < path.length) parts.push(path.substring(s0));
return parts;
}

8
test/env-fragment.js Normal file
Просмотреть файл

@ -0,0 +1,8 @@
var jsdom = require("jsdom");
document.createRange = function() {
return {
selectNode: function() {},
createContextualFragment: function(html) { return jsdom.jsdom(html); }
};
};

56
test/env-xhr.js Normal file
Просмотреть файл

@ -0,0 +1,56 @@
var fs = require("fs");
XMLHttpRequest = function() {
var self = this,
info = self._info = {},
headers = {},
url;
// TODO handle file system errors?
self.open = function(m, u, a) {
info.url = u;
info.async = a;
Object.freeze(info);
self.send = a ? read : readSync;
};
self.overrideMimeType = function(x) {
info.mimeType = x;
};
function read() {
fs.readFile(info.url, "binary", function(e, d) {
if (e) {
self.status = 404; // assumed
} else {
self.status = 200;
self.responseText = d;
self.responseXML = {_xml: d};
headers["Content-Length"] = d.length;
}
self.readyState = 4;
XMLHttpRequest._last = self;
if (self.onreadystatechange) self.onreadystatechange();
});
}
function readSync() {
try {
var d = fs.readFileSync(info.url, "binary");
self.status = 200;
self.responseText = d;
self.responseXML = {_xml: d};
headers["Content-Length"] = d.length;
} catch (e) {
self.status = 404; // assumed
}
self.readyState = 4;
XMLHttpRequest._last = self;
if (self.onreadystatechange) self.onreadystatechange();
}
self.getResponseHeader = function(n) {
return headers[n];
};
};

Просмотреть файл

@ -7,75 +7,6 @@ Sizzle = window.Sizzle;
process.env.TZ = "America/Los_Angeles";
var assert = require("assert");
assert.inDelta = function (actual, expected, delta, message) {
var lower = expected - delta;
var upper = expected + delta;
if (actual != +actual || actual < lower || actual > upper) {
assert.fail(actual, expected, message || "expected {actual} to be in within *" + delta.toString() + "* of {expected}", null, assert.inDelta);
}
};
assert.domNull = function(actual, message) {
if (actual !== null) {
assert.fail(actual+"", null, message || "expected null, got {actual}", "===", assert.domNull);
}
};
assert.domEqual = function(actual, expected, message) {
if (actual !== expected) {
assert.fail(actual+"", expected+"", message || "expected {expected}, got {actual}", "===", assert.domEqual);
}
};
assert.rgbEqual = function(actual, r, g, b, message) {
if (actual.r !== r || actual.g !== g || actual.b !== b) {
assert.fail("rgb(" + actual.r + "," + actual.g + "," + actual.b + ")", "rgb(" + r + ", " + g + ", " + b + ")", message || "expected {expected}, got {actual}", "===", assert.rgbEqual);
}
};
assert.hslEqual = function(actual, h, s, l, message) {
if (Math.abs(actual.h - h) > 1e-6 || Math.abs(actual.s - s) > 1e-6 || Math.abs(actual.l - l) > 1e-6) {
assert.fail(actual+"", "hsl(" + h + "," + (s * 100) + "%," + (l * 100) + "%)", message || "expected {expected}, got {actual}", null, assert.hslEqual);
}
};
assert.pathEqual = function(actual, expected, message) {
if (!pathEqual(actual, expected)) {
assert.fail(actual, expected, message || "expected {expected}, got {actual}", null, assert.pathEqual);
}
};
function pathEqual(a, b) {
a = parsePath(a);
b = parsePath(b);
var n = a.length, i = -1, x, y;
if (n !== b.length) return false;
while (++i < n) {
x = a[i];
y = b[i];
if (typeof x === "string") {
if (x !== y) return false;
} else if (typeof y !== "number") {
return false;
} else if (Math.abs(x - y) > 1e-6) {
return false;
}
}
return true;
}
function parsePath(path) {
var re = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g, parts = [];
for (var i = 0, s0 = 0, s1, m; m = re.exec(path); ++i) {
if (m.index) {
var part = path.substring(s0, s1 = m.index);
if (!/^[, ]$/.test(part)) parts.push(part);
}
parts.push(parseFloat(m[0]));
s0 = re.lastIndex;
}
if (s0 < path.length) parts.push(path.substring(s0));
return parts;
}
require("./env-assert");
require("./env-xhr");
require("./env-fragment");