Files
ArtPlayer/test/browser/editor-basic-languages.spec.js
T

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