Skip to content

Commit c3de841

Browse files
authored
(chore) refactor svelte2tsx test setup (#737)
1 parent de62512 commit c3de841

File tree

7 files changed

+121
-2353
lines changed

7 files changed

+121
-2353
lines changed

.prettierignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
packages/svelte2tsx/*.d.ts
2-
packages/svelte2tsx/test/**
2+
packages/svelte2tsx/test/*/samples/*/*sx
33
packages/language-server/test/**/*.svelte
44
packages/svelte-vscode/syntaxes/*.yaml
55
.github/**
Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
const fs = require('fs');
2+
const assert = require('assert');
3+
4+
function benchmark(fn) {
5+
return -Date.now() + (fn(), Date.now());
6+
}
7+
8+
function readFileSync(path) {
9+
return fs.existsSync(path)
10+
? fs.readFileSync(path, 'utf-8').replace(/\r\n/g, '\n').replace(/\s+$/, '')
11+
: null;
12+
}
13+
14+
function check_dir(path, { allowed = [], required = allowed }) {
15+
const unchecked = new Set(required);
16+
const unknown = [];
17+
loop: for (const fileName of fs.readdirSync(path)) {
18+
for (const name of unchecked) {
19+
if ('*' === name[0] ? fileName.endsWith(name.slice(1)) : name === fileName) {
20+
unchecked.delete(name);
21+
continue loop;
22+
}
23+
}
24+
for (const name of allowed) {
25+
if ('*' === name[0] ? fileName.endsWith(name.slice(1)) : name === fileName) {
26+
continue loop;
27+
}
28+
}
29+
unknown.push(fileName);
30+
}
31+
if (unknown.length !== 0) {
32+
after(() => {
33+
for (const name of unknown) {
34+
const msg = `Unexpected file ${path.split('/').slice(-1)}/${name}`;
35+
if (process.env.CI) {
36+
throw new Error(msg);
37+
} else {
38+
console.info(msg);
39+
}
40+
}
41+
});
42+
}
43+
if (unchecked.size !== 0) {
44+
throw new Error(
45+
`Expected file(s) ${[...unchecked].map((str) => `"${str}"`).join(', ')} in ${path}`
46+
);
47+
}
48+
}
49+
50+
function test_samples(dir, transform, tsx) {
51+
for (const testName of fs.readdirSync(`${dir}/samples`)) {
52+
const path = `${dir}/samples/${testName}`;
53+
const expected_path = `${path}/expected.${tsx}`;
54+
const has_expected = fs.existsSync(expected_path);
55+
const solo = testName.endsWith('.solo');
56+
const skip = testName.startsWith('.');
57+
check_dir(path, {
58+
required: ['*.svelte'],
59+
allowed: ['expected.js', `expected.${tsx}`]
60+
});
61+
(skip ? it.skip : solo ? it.only : it)(testName, function () {
62+
const fileName = fs.readdirSync(path).find((f) => f.endsWith('.svelte'));
63+
const output = transform(readFileSync(`${path}/${fileName}`), testName, fileName);
64+
if (!has_expected) {
65+
after(() => {
66+
fs.writeFileSync(expected_path, output.code);
67+
console.info(`Generated ${testName}/expected.${tsx}`);
68+
});
69+
this.skip();
70+
} else {
71+
assert.strictEqual(output.code, readFileSync(expected_path));
72+
}
73+
if (fs.existsSync(`${path}/expected.js`)) {
74+
const run = require(`${path}/expected.js`);
75+
run(output);
76+
}
77+
});
78+
}
79+
}
80+
81+
module.exports = { benchmark, test_samples };
Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,6 @@
1-
let converter = require('../build/htmlxtojsx')
2-
let fs = require('fs')
3-
let assert = require('assert')
1+
const { htmlx2jsx } = require('../build/htmlxtojsx');
2+
const { test_samples } = require('../helpers');
43

54
describe('htmlx2jsx', () => {
6-
fs.readdirSync(`${__dirname}/samples`).forEach(dir => {
7-
if (dir[0] === '.') return;
8-
9-
// add .solo to a sample directory name to only run that test
10-
const solo = /\.solo$/.test(dir);
11-
12-
if (solo && process.env.CI) {
13-
throw new Error(
14-
`Forgot to remove '.solo' from test parser/samples/${dir}`
15-
);
16-
}
17-
18-
(solo ? it.only : it)(dir, () => {
19-
const input = fs.readFileSync(`${__dirname}/samples/${dir}/input.svelte`, 'utf-8').replace(/\s+$/, '').replace(/\r\n/g, "\n");
20-
const expectedOutput = fs.readFileSync(`${__dirname}/samples/${dir}/expected.jsx`, 'utf-8').replace(/\s+$/, '').replace(/\r\n/g, "\n");
21-
22-
const { map, code} = converter.htmlx2jsx(input);
23-
assert.equal(code, expectedOutput);
24-
});
25-
});
26-
});
5+
test_samples(__dirname, htmlx2jsx, 'jsx');
6+
});
Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
1-
let converter = require('../build/htmlxtojsx')
2-
let fs = require('fs')
3-
let assert = require('assert')
1+
const { htmlx2jsx } = require('../build/htmlxtojsx');
2+
const assert = require('assert');
3+
const { benchmark } = require('../helpers');
44

55
describe('htmlxparser', () => {
6-
let content = fs.readFileSync(`${__dirname}/large.svelte`, {encoding: 'utf8'});
7-
86
it('parses in a reasonable time', () => {
9-
const start = new Date();
10-
converter.htmlx2jsx(content);
11-
const elapsed = new Date() - start;
12-
assert(elapsed <= 1000, `Parsing took ${elapsed} ms, which was longer than 1000ms`);
13-
})
14-
15-
});
7+
let random = '';
8+
let str = '';
9+
for (let i = 0; i !== 17; i++) random += Math.random().toString(26).slice(2);
10+
for (let i = 0; i !== 1137; i++) str += `${random} - line\t${i}\n`;
11+
const duration = benchmark(
12+
htmlx2jsx.bind(null, `<script> ${str} </script>` + `<style> ${str} </style>`)
13+
);
14+
assert(duration <= 1000, `Parsing took ${duration} ms, which was longer than 1000ms`);
15+
});
16+
});

0 commit comments

Comments
 (0)