mirror of
https://github.com/zhw2590582/ArtPlayer.git
synced 2026-10-08 19:06:15 -08:00
54 lines
3.2 KiB
JavaScript
54 lines
3.2 KiB
JavaScript
import fs from 'node:fs'
|
|
import { expect, test } from './fixtures.js'
|
|
|
|
const upstream = JSON.parse(fs.readFileSync(new URL('../../refactor/baselines/monaco-basic-fixtures.json', import.meta.url))).fixtures
|
|
// Upstream has no INI test, empty CSP/ECL suites, and SQL-targeted pgsql/redshift suites.
|
|
const supplemental = [
|
|
{ language: 'ini', samples: [['[player]', 'metatag.ini'], ['# comment', 'comment.ini'], ['42', 'number.ini']] },
|
|
{ language: 'csp', samples: [['default-src', 'string.quote.csp'], ['\'self\'', 'string.quote.csp']] },
|
|
{ language: 'ecl', samples: [['// comment', 'comment.ecl'], ['OUTPUT', 'keyword.function.ecl'], ['42', 'number.ecl']] },
|
|
{ language: 'pgsql', samples: [['-- comment', 'comment.sql'], ['SELECT', 'keyword.sql']] },
|
|
{ language: 'redshift', samples: [['-- comment', 'comment.sql'], ['SELECT', 'keyword.sql']] },
|
|
].map(({ language, samples }) => ({ source: 'ArtPlayer supplemental cases', language, languages: [language], cases: samples.map(([line, type]) => [{ line, tokens: [{ startIndex: 0, type }] }]) }))
|
|
|
|
test('docs Monaco preserves all upstream basic-language tokenization cases', async ({ page }, testInfo) => {
|
|
const loaded = new Map()
|
|
page.on('response', (response) => {
|
|
const match = /\/basic-languages\/([^/]+)\/\1\.js$/.exec(response.url())
|
|
if (match)
|
|
loaded.set(match[1], response.status())
|
|
})
|
|
await page.goto('/test/player.html?core=candidate&chapter=published')
|
|
await page.addScriptTag({ url: '/assets/js/vs/loader.js' })
|
|
const result = await page.evaluate(async (fixtures) => {
|
|
window.require.config({ paths: { vs: '/assets/js/vs' } })
|
|
const load = ids => new Promise((resolve, reject) => window.require(ids, (...modules) => resolve(modules), reject))
|
|
await load(['vs/editor/editor.main'])
|
|
const [helper] = await load(['vs/basic-languages/_.contribution'])
|
|
const languages = [...new Set(fixtures.flatMap(fixture => fixture.languages))]
|
|
await Promise.all(languages.map(language => helper.loadLanguage(language)))
|
|
// Match the upstream runner's turn for asynchronous token-provider registration.
|
|
await new Promise(resolve => setTimeout(resolve, 0))
|
|
const failures = []
|
|
let cases = 0
|
|
for (const fixture of fixtures) {
|
|
for (const [index, expected] of fixture.cases.entries()) {
|
|
const text = expected.map(line => line.line).join('\n')
|
|
const actual = window.monaco.editor.tokenize(text, fixture.languages[0]).map((tokens, line) => ({
|
|
line: expected[line].line,
|
|
tokens: tokens.map(token => ({ startIndex: token.offset, type: token.type })),
|
|
}))
|
|
cases++
|
|
if (JSON.stringify(actual) !== JSON.stringify(expected))
|
|
failures.push({ source: fixture.source, index, expected, actual })
|
|
}
|
|
}
|
|
return { cases, suites: fixtures.length, languages, failures }
|
|
}, [...upstream, ...supplemental])
|
|
await testInfo.attach('monaco-basic-results', { contentType: 'application/json', body: JSON.stringify(result, null, 2) })
|
|
expect(result.cases).toBe(2523)
|
|
expect(result.failures).toEqual([])
|
|
expect([...loaded.keys()].sort()).toEqual(fs.readdirSync(new URL('../../docs/assets/js/vs/basic-languages', import.meta.url)).sort())
|
|
expect([...loaded.values()].every(status => status === 200)).toBe(true)
|
|
})
|