154 строки
4.6 KiB
JavaScript
154 строки
4.6 KiB
JavaScript
var assert = require("assert"),
|
|
_ = require("../");
|
|
|
|
assert = module.exports = Object.create(assert);
|
|
|
|
assert.isArray = function(actual, message) {
|
|
if (!Array.isArray(actual)) {
|
|
assert.fail(actual, null, message || "expected {actual} to be an Array", null, assert.isArray);
|
|
}
|
|
};
|
|
|
|
assert.inDelta = function(actual, expected, delta, message) {
|
|
if (!inDelta(actual, expected, delta)) {
|
|
assert.fail(actual, expected, message || "expected {actual} to be in within *" + delta + "* 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) {
|
|
var ar = Math.round(actual.r),
|
|
ag = Math.round(actual.g),
|
|
ab = Math.round(actual.b),
|
|
er = Math.round(r),
|
|
eg = Math.round(g),
|
|
eb = Math.round(b);
|
|
if (ar !== er || ag !== eg || ab !== eb) {
|
|
assert.fail(
|
|
"rgb(" + ar + "," + ag + "," + ab + ")",
|
|
"rgb(" + er + ", " + eg + ", " + eb + ")",
|
|
message || "expected {expected}, got {actual}", "===", assert.rgbEqual);
|
|
}
|
|
};
|
|
|
|
assert.hslEqual = function(actual, h, s, l, message) {
|
|
var ah = _.round(actual.h, 2),
|
|
as = _.round(actual.s, 2),
|
|
al = _.round(actual.l, 2),
|
|
eh = _.round(h, 2),
|
|
es = _.round(s, 2),
|
|
el = _.round(l, 2);
|
|
if ((!(isNaN(ah) && isNaN(eh)) && ah !== eh) || (!(isNaN(as) && isNaN(es)) && as !== es) || al !== el) {
|
|
assert.fail(
|
|
"hsl(" + ah + "," + as + "," + al + ")",
|
|
"hsl(" + eh + "," + es + "," + el + ")",
|
|
message || "expected {expected}, got {actual}", null, assert.hslEqual);
|
|
}
|
|
};
|
|
|
|
assert.hclEqual = function(actual, h, c, l, message) {
|
|
var ah = _.round(actual.h, 2),
|
|
ac = _.round(actual.c, 2),
|
|
al = _.round(actual.l, 2),
|
|
eh = _.round(h, 2),
|
|
ec = _.round(c, 2),
|
|
el = _.round(l, 2);
|
|
if ((!(isNaN(ah) && isNaN(eh)) && ah !== eh) || ac !== ec || al !== el) {
|
|
assert.fail(
|
|
"hcl(" + ah + "," + ac + "," + al + ")",
|
|
"hcl(" + eh + "," + ec + "," + el + ")",
|
|
message || "expected {expected}, got {actual}", null, assert.hclEqual);
|
|
}
|
|
};
|
|
|
|
assert.labEqual = function(actual, l, a, b, message) {
|
|
var al = _.round(actual.l, 2),
|
|
aa = _.round(actual.a, 2),
|
|
ab = _.round(actual.b, 2),
|
|
el = _.round(l, 2),
|
|
ea = _.round(a, 2),
|
|
eb = _.round(b, 2);
|
|
if (al !== el || aa !== ea || ab !== eb) {
|
|
assert.fail(
|
|
"lab(" + al + ", " + aa + ", " + ab + ")",
|
|
"lab(" + el + ", " + ea + ", " + eb + ")",
|
|
message || "expected {expected}, got {actual}", null, assert.labEqual);
|
|
}
|
|
};
|
|
|
|
assert.pathEqual = function(actual, expected, message) {
|
|
if (!pathEqual(actual, expected)) {
|
|
assert.fail(formatPath(actual), formatPath(expected), message || "expected {expected}, got {actual}", null, assert.pathEqual);
|
|
}
|
|
};
|
|
|
|
function inDelta(actual, expected, delta) {
|
|
return (Array.isArray(expected) ? inDeltaArray : inDeltaNumber)(actual, expected, delta);
|
|
}
|
|
|
|
function inDeltaArray(actual, expected, delta) {
|
|
var n = expected.length, i = -1;
|
|
if (actual.length !== n) return false;
|
|
while (++i < n) if (!inDelta(actual[i], expected[i], delta)) return false;
|
|
return true;
|
|
}
|
|
|
|
function inDeltaNumber(actual, expected, delta) {
|
|
return actual >= expected - delta && actual <= expected + delta;
|
|
}
|
|
|
|
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;
|
|
}
|
|
|
|
var reNumber = /[-+]?(?:\d+\.\d+|\d+\.|\.\d+|\d+)(?:[eE][-]?\d+)?/g;
|
|
|
|
function parsePath(path) {
|
|
var parts = [];
|
|
reNumber.lastIndex = 0;
|
|
for (var i = 0, s0 = 0, s1, m; m = reNumber.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 = reNumber.lastIndex;
|
|
}
|
|
if (s0 < path.length) parts.push(path.substring(s0));
|
|
return parts;
|
|
}
|
|
|
|
function formatPath(path) {
|
|
return path.replace(reNumber, formatNumber);
|
|
}
|
|
|
|
function formatNumber(s) {
|
|
return Math.abs((s = +s) - Math.floor(s)) < 1e-6 ? Math.floor(s) : s.toFixed(6);
|
|
}
|