diff --git a/.prettierignore b/.prettierignore
index 16aedf503..2c91757a6 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -1,5 +1,5 @@
packages/svelte2tsx/*.d.ts
-packages/svelte2tsx/test/**
+packages/svelte2tsx/test/*/samples/*/*sx
packages/language-server/test/**/*.svelte
packages/svelte-vscode/syntaxes/*.yaml
.github/**
\ No newline at end of file
diff --git a/packages/svelte2tsx/test/helpers.js b/packages/svelte2tsx/test/helpers.js
index e69de29bb..a905bedc6 100644
--- a/packages/svelte2tsx/test/helpers.js
+++ b/packages/svelte2tsx/test/helpers.js
@@ -0,0 +1,81 @@
+const fs = require('fs');
+const assert = require('assert');
+
+function benchmark(fn) {
+ return -Date.now() + (fn(), Date.now());
+}
+
+function readFileSync(path) {
+ return fs.existsSync(path)
+ ? fs.readFileSync(path, 'utf-8').replace(/\r\n/g, '\n').replace(/\s+$/, '')
+ : null;
+}
+
+function check_dir(path, { allowed = [], required = allowed }) {
+ const unchecked = new Set(required);
+ const unknown = [];
+ loop: for (const fileName of fs.readdirSync(path)) {
+ for (const name of unchecked) {
+ if ('*' === name[0] ? fileName.endsWith(name.slice(1)) : name === fileName) {
+ unchecked.delete(name);
+ continue loop;
+ }
+ }
+ for (const name of allowed) {
+ if ('*' === name[0] ? fileName.endsWith(name.slice(1)) : name === fileName) {
+ continue loop;
+ }
+ }
+ unknown.push(fileName);
+ }
+ if (unknown.length !== 0) {
+ after(() => {
+ for (const name of unknown) {
+ const msg = `Unexpected file ${path.split('/').slice(-1)}/${name}`;
+ if (process.env.CI) {
+ throw new Error(msg);
+ } else {
+ console.info(msg);
+ }
+ }
+ });
+ }
+ if (unchecked.size !== 0) {
+ throw new Error(
+ `Expected file(s) ${[...unchecked].map((str) => `"${str}"`).join(', ')} in ${path}`
+ );
+ }
+}
+
+function test_samples(dir, transform, tsx) {
+ for (const testName of fs.readdirSync(`${dir}/samples`)) {
+ const path = `${dir}/samples/${testName}`;
+ const expected_path = `${path}/expected.${tsx}`;
+ const has_expected = fs.existsSync(expected_path);
+ const solo = testName.endsWith('.solo');
+ const skip = testName.startsWith('.');
+ check_dir(path, {
+ required: ['*.svelte'],
+ allowed: ['expected.js', `expected.${tsx}`]
+ });
+ (skip ? it.skip : solo ? it.only : it)(testName, function () {
+ const fileName = fs.readdirSync(path).find((f) => f.endsWith('.svelte'));
+ const output = transform(readFileSync(`${path}/${fileName}`), testName, fileName);
+ if (!has_expected) {
+ after(() => {
+ fs.writeFileSync(expected_path, output.code);
+ console.info(`Generated ${testName}/expected.${tsx}`);
+ });
+ this.skip();
+ } else {
+ assert.strictEqual(output.code, readFileSync(expected_path));
+ }
+ if (fs.existsSync(`${path}/expected.js`)) {
+ const run = require(`${path}/expected.js`);
+ run(output);
+ }
+ });
+ }
+}
+
+module.exports = { benchmark, test_samples };
diff --git a/packages/svelte2tsx/test/htmlx2jsx/index.js b/packages/svelte2tsx/test/htmlx2jsx/index.js
index 982bf4ef3..2c7037c0f 100644
--- a/packages/svelte2tsx/test/htmlx2jsx/index.js
+++ b/packages/svelte2tsx/test/htmlx2jsx/index.js
@@ -1,26 +1,6 @@
-let converter = require('../build/htmlxtojsx')
-let fs = require('fs')
-let assert = require('assert')
+const { htmlx2jsx } = require('../build/htmlxtojsx');
+const { test_samples } = require('../helpers');
describe('htmlx2jsx', () => {
- fs.readdirSync(`${__dirname}/samples`).forEach(dir => {
- if (dir[0] === '.') return;
-
- // add .solo to a sample directory name to only run that test
- const solo = /\.solo$/.test(dir);
-
- if (solo && process.env.CI) {
- throw new Error(
- `Forgot to remove '.solo' from test parser/samples/${dir}`
- );
- }
-
- (solo ? it.only : it)(dir, () => {
- const input = fs.readFileSync(`${__dirname}/samples/${dir}/input.svelte`, 'utf-8').replace(/\s+$/, '').replace(/\r\n/g, "\n");
- const expectedOutput = fs.readFileSync(`${__dirname}/samples/${dir}/expected.jsx`, 'utf-8').replace(/\s+$/, '').replace(/\r\n/g, "\n");
-
- const { map, code} = converter.htmlx2jsx(input);
- assert.equal(code, expectedOutput);
- });
- });
-});
\ No newline at end of file
+ test_samples(__dirname, htmlx2jsx, 'jsx');
+});
diff --git a/packages/svelte2tsx/test/htmlxparser/index.js b/packages/svelte2tsx/test/htmlxparser/index.js
index a0d296ec3..e9efcb316 100644
--- a/packages/svelte2tsx/test/htmlxparser/index.js
+++ b/packages/svelte2tsx/test/htmlxparser/index.js
@@ -1,15 +1,16 @@
-let converter = require('../build/htmlxtojsx')
-let fs = require('fs')
-let assert = require('assert')
+const { htmlx2jsx } = require('../build/htmlxtojsx');
+const assert = require('assert');
+const { benchmark } = require('../helpers');
describe('htmlxparser', () => {
- let content = fs.readFileSync(`${__dirname}/large.svelte`, {encoding: 'utf8'});
-
it('parses in a reasonable time', () => {
- const start = new Date();
- converter.htmlx2jsx(content);
- const elapsed = new Date() - start;
- assert(elapsed <= 1000, `Parsing took ${elapsed} ms, which was longer than 1000ms`);
- })
-
-});
\ No newline at end of file
+ let random = '';
+ let str = '';
+ for (let i = 0; i !== 17; i++) random += Math.random().toString(26).slice(2);
+ for (let i = 0; i !== 1137; i++) str += `${random} - line\t${i}\n`;
+ const duration = benchmark(
+ htmlx2jsx.bind(null, `` + ``)
+ );
+ assert(duration <= 1000, `Parsing took ${duration} ms, which was longer than 1000ms`);
+ });
+});
diff --git a/packages/svelte2tsx/test/htmlxparser/large.svelte b/packages/svelte2tsx/test/htmlxparser/large.svelte
deleted file mode 100644
index b00d72b7c..000000000
--- a/packages/svelte2tsx/test/htmlxparser/large.svelte
+++ /dev/null
@@ -1,2273 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/packages/svelte2tsx/test/svelte2tsx/index.js b/packages/svelte2tsx/test/svelte2tsx/index.js
index 999f269af..7f98d51e0 100644
--- a/packages/svelte2tsx/test/svelte2tsx/index.js
+++ b/packages/svelte2tsx/test/svelte2tsx/index.js
@@ -1,36 +1,16 @@
-let svelte2tsx = require('../build/index')
-let fs = require('fs')
-let assert = require('assert')
+const svelte2tsx = require('../build/index');
+const { test_samples } = require('../helpers');
describe('svelte2tsx', () => {
- fs.readdirSync(`${__dirname}/samples`).forEach(dir => {
- if (dir[0] === '.') return;
-
- // add .solo to a sample directory name to only run that test
- const solo = /\.solo$/.test(dir);
-
- if (solo && process.env.CI) {
- throw new Error(
- `Forgot to remove '.solo' from test parser/samples/${dir}`
- );
- }
-
- (solo ? it.only : it)(dir, () => {
- const path = `${__dirname}/samples/${dir}`;
- const svelteFileName = `${path}/${fs.readdirSync(path).find(p => p.endsWith('.svelte'))}`;
- const input = fs.readFileSync(svelteFileName, 'utf-8').replace(/\s+$/, '').replace(/\r\n/g, "\n");
- const expectedOutput = fs.readFileSync(`${path}/expected.tsx`, 'utf-8').replace(/\s+$/, '').replace(/\r\n/g, "\n");
- const expecterOtherOutput = fs.existsSync(`${path}/expected.js`) && require(`${path}/expected`);
-
- const output = svelte2tsx(input, {
- strictMode: dir.includes('strictMode'),
- isTsFile: dir.startsWith('ts-'),
- filename: svelteFileName
- });
- assert.equal(output.code, expectedOutput);
- if (expecterOtherOutput) {
- expecterOtherOutput(output);
- }
- });
- });
+ test_samples(
+ __dirname,
+ (input, testName, filename) => {
+ return svelte2tsx(input, {
+ strictMode: testName.includes('strictMode'),
+ isTsFile: testName.startsWith('ts-'),
+ filename
+ });
+ },
+ 'tsx'
+ );
});
diff --git a/packages/svelte2tsx/test/test.js b/packages/svelte2tsx/test/test.js
index 8d5ca9e46..092c6b432 100644
--- a/packages/svelte2tsx/test/test.js
+++ b/packages/svelte2tsx/test/test.js
@@ -2,19 +2,18 @@ const glob = require('tiny-glob/sync.js');
require('source-map-support').install();
-
-require('./helpers');
-
//console.clear();
+if (process.env.CI) {
+ const arr = glob('**/*.solo', { cwd: 'test' });
+ if (arr.length) throw new Error(`Forgot to remove ".solo" from test(s) ${arr}`);
+}
+
const test_folders = glob('*/index.js', { cwd: 'test' });
-const solo_folders = test_folders.filter(folder => /\.solo/.test(folder));
+const solo_folders = test_folders.filter((folder) => /\.solo$/.test(folder));
if (solo_folders.length) {
- if (process.env.CI) {
- throw new Error('Forgot to remove `.solo` from test');
- }
- solo_folders.forEach(name => require('./' + name));
+ solo_folders.forEach((name) => require('./' + name));
} else {
- test_folders.forEach(name => require('./' + name));
-}
\ No newline at end of file
+ test_folders.forEach((name) => require('./' + name));
+}