0
0
mirror of https://github.com/sveltejs/svelte.git synced 2024-11-30 00:46:29 +01:00
svelte/test/helpers.js

161 lines
3.4 KiB
JavaScript
Raw Normal View History

2017-06-03 04:04:36 +02:00
import jsdom from "jsdom";
import assert from "assert";
import * as fs from "fs";
2017-06-03 04:04:36 +02:00
import * as consoleGroup from "console-group";
consoleGroup.install();
2017-06-03 04:04:36 +02:00
import * as sourceMapSupport from "source-map-support";
sourceMapSupport.install();
// for coverage purposes, we need to test source files,
// but for sanity purposes, we need to test dist files
2017-06-03 04:04:36 +02:00
export function loadSvelte(test) {
if (test) global.__svelte_test = true;
2017-06-03 04:04:36 +02:00
const resolved = process.env.COVERAGE
? require.resolve("../src/index.js")
: require.resolve("../compiler/svelte.js");
2017-06-03 04:04:36 +02:00
delete require.cache[resolved];
return require(resolved);
}
export const svelte = loadSvelte();
2017-06-03 04:04:36 +02:00
export function exists(path) {
try {
2017-06-03 04:04:36 +02:00
fs.statSync(path);
return true;
2017-06-03 04:04:36 +02:00
} catch (err) {
return false;
}
}
2017-06-03 04:04:36 +02:00
export function tryToLoadJson(file) {
try {
2017-06-03 04:04:36 +02:00
return JSON.parse(fs.readFileSync(file));
} catch (err) {
if (err.code !== "ENOENT") throw err;
return null;
}
}
2017-06-03 04:04:36 +02:00
export function tryToReadFile(file) {
try {
2017-06-03 04:04:36 +02:00
return fs.readFileSync(file, "utf-8");
} catch (err) {
if (err.code !== "ENOENT") throw err;
return null;
}
}
2017-06-03 04:04:36 +02:00
export function env() {
return new Promise((fulfil, reject) => {
jsdom.env("<main></main>", (err, window) => {
if (err) {
reject(err);
} else {
global.document = window.document;
2017-06-03 04:04:36 +02:00
fulfil(window);
}
});
});
}
2017-06-03 04:04:36 +02:00
function cleanChildren(node) {
let previous = null;
2017-06-03 04:04:36 +02:00
[...node.childNodes].forEach(child => {
if (child.nodeType === 8) {
// comment
2017-06-03 04:04:36 +02:00
node.removeChild(child);
return;
}
2017-06-03 04:04:36 +02:00
if (child.nodeType === 3) {
if (
node.namespaceURI === "http://www.w3.org/2000/svg" &&
node.tagName !== "text" &&
node.tagName !== "tspan"
) {
node.removeChild(child);
2017-01-24 23:03:14 +01:00
}
2017-06-03 04:04:36 +02:00
child.data = child.data.replace(/\s{2,}/, "\n");
// text
2017-06-03 04:04:36 +02:00
if (previous && previous.nodeType === 3) {
previous.data += child.data;
2017-06-03 04:04:36 +02:00
previous.data = previous.data.replace(/\s{2,}/, "\n");
2017-06-03 04:04:36 +02:00
node.removeChild(child);
2017-05-05 18:10:37 +02:00
child = previous;
}
2017-06-03 04:04:36 +02:00
} else {
cleanChildren(child);
}
previous = child;
});
// collapse whitespace
2017-06-03 04:04:36 +02:00
if (node.firstChild && node.firstChild.nodeType === 3) {
node.firstChild.data = node.firstChild.data.replace(/^\s+/, "");
if (!node.firstChild.data) node.removeChild(node.firstChild);
}
2017-06-03 04:04:36 +02:00
if (node.lastChild && node.lastChild.nodeType === 3) {
node.lastChild.data = node.lastChild.data.replace(/\s+$/, "");
if (!node.lastChild.data) node.removeChild(node.lastChild);
}
}
2017-06-03 04:04:36 +02:00
export function setupHtmlEqual() {
return env().then(window => {
assert.htmlEqual = (actual, expected, message) => {
window.document.body.innerHTML = actual
.replace(/>[\s\r\n]+</g, "><")
.trim();
cleanChildren(window.document.body, "");
actual = window.document.body.innerHTML;
2017-06-03 04:04:36 +02:00
window.document.body.innerHTML = expected
.replace(/>[\s\r\n]+</g, "><")
.trim();
cleanChildren(window.document.body, "");
expected = window.document.body.innerHTML;
2017-06-03 04:04:36 +02:00
assert.deepEqual(actual, expected, message);
};
});
}
2017-06-03 04:04:36 +02:00
export function loadConfig(file) {
try {
2017-06-03 04:04:36 +02:00
const resolved = require.resolve(file);
delete require.cache[resolved];
return require(resolved).default;
} catch (err) {
if (err.code === "E_NOT_FOUND") {
return {};
}
throw err;
}
}
2017-06-03 04:04:36 +02:00
export function addLineNumbers(code) {
return code
.split("\n")
.map((line, i) => {
i = String(i + 1);
while (i.length < 3) i = ` ${i}`;
return `${i}: ${line.replace(/^\t+/, match =>
match.split("\t").join(" ")
)}`;
})
.join("\n");
}