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)); +}