From b1004aa540467cfb0dd8e5eab850a2017af58da7 Mon Sep 17 00:00:00 2001 From: Colin Grant Date: Mon, 24 Jan 2022 13:44:38 -0700 Subject: [PATCH] tests --- examples/api-tests/.eslintrc.js | 10 ++ .../api-tests/src/launch-preferences.spec.js | 4 - examples/api-tests/src/preferences.spec.js | 160 ++++++++++++++++++ examples/api-tests/tsconfig.json | 12 ++ scripts/compile-references.js | 2 +- 5 files changed, 183 insertions(+), 5 deletions(-) create mode 100644 examples/api-tests/.eslintrc.js create mode 100644 examples/api-tests/src/preferences.spec.js create mode 100644 examples/api-tests/tsconfig.json diff --git a/examples/api-tests/.eslintrc.js b/examples/api-tests/.eslintrc.js new file mode 100644 index 0000000000000..13089943582b6 --- /dev/null +++ b/examples/api-tests/.eslintrc.js @@ -0,0 +1,10 @@ +/** @type {import('eslint').Linter.Config} */ +module.exports = { + extends: [ + '../../configs/build.eslintrc.json' + ], + parserOptions: { + tsconfigRootDir: __dirname, + project: 'tsconfig.json' + } +}; diff --git a/examples/api-tests/src/launch-preferences.spec.js b/examples/api-tests/src/launch-preferences.spec.js index c573db4c98e2b..516ff56b2d6c5 100644 --- a/examples/api-tests/src/launch-preferences.spec.js +++ b/examples/api-tests/src/launch-preferences.spec.js @@ -35,8 +35,6 @@ describe('Launch Preferences', function () { const { WorkspaceService } = require('@theia/workspace/lib/browser/workspace-service'); const { FileService } = require('@theia/filesystem/lib/browser/file-service'); const { FileResourceResolver } = require('@theia/filesystem/lib/browser/file-resource'); - const { MonacoTextModelService } = require('@theia/monaco/lib/browser/monaco-text-model-service'); - const { MonacoWorkspace } = require('@theia/monaco/lib/browser/monaco-workspace'); const { AbstractResourcePreferenceProvider } = require('@theia/preferences/lib/browser/abstract-resource-preference-provider'); const { waitForEvent } = require('@theia/core/lib/common/promise-util'); @@ -51,8 +49,6 @@ describe('Launch Preferences', function () { const folderPreferences = container.getNamed(PreferenceProvider, PreferenceScope.Folder); const workspaceService = container.get(WorkspaceService); const fileService = container.get(FileService); - const textModelService = container.get(MonacoTextModelService); - const workspace = container.get(MonacoWorkspace); const fileResourceResolver = container.get(FileResourceResolver); const defaultLaunch = { diff --git a/examples/api-tests/src/preferences.spec.js b/examples/api-tests/src/preferences.spec.js new file mode 100644 index 0000000000000..e0955161907e4 --- /dev/null +++ b/examples/api-tests/src/preferences.spec.js @@ -0,0 +1,160 @@ +/******************************************************************************** + * Copyright (C) 2022 Ericsson and others. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0 which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the Eclipse + * Public License v. 2.0 are satisfied: GNU General Public License, version 2 + * with the GNU Classpath Exception which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + ********************************************************************************/ + +// @ts-check + +describe.only('Preferences', function () { + this.timeout(5_000); + const { assert } = chai; + const { PreferenceProvider } = require('@theia/core/lib/browser/preferences/preference-provider'); + const { PreferenceService, PreferenceScope } = require('@theia/core/lib/browser/preferences/preference-service'); + const { FileService } = require('@theia/filesystem/lib/browser/file-service'); + const { PreferenceLanguageOverrideService } = require('@theia/core/lib/browser/preferences/preference-language-override-service'); + const { MonacoTextModelService } = require('@theia/monaco/lib/browser/monaco-text-model-service'); + const { container } = window.theia; + /** @type {import ('@theia/core/lib/browser/preferences/preference-service').PreferenceService} */ + const preferenceService = container.get(PreferenceService); + const overrideService = container.get(PreferenceLanguageOverrideService); + const fileService = container.get(FileService); + /** @type {import ('@theia/core/lib/common/uri').default} */ + const uri = preferenceService.getConfigUri(PreferenceScope.Workspace); + /** @type {import('@theia/preferences/lib/browser/folders-preferences-provider').FoldersPreferencesProvider} */ + const folderPreferences = container.getNamed(PreferenceProvider, PreferenceScope.Folder); + const modelService = container.get(MonacoTextModelService); + + const swift = 'swift'; // Probably not in our preference files... + const tabSize = 'editor.tabSize'; + const fontSize = 'editor.fontSize'; + const override = overrideService.markLanguageOverride(swift); + const overriddenTabSize = overrideService.overridePreferenceName({ overrideIdentifier: swift, preferenceName: tabSize }); + const overriddenFontSize = overrideService.overridePreferenceName({ overrideIdentifier: swift, preferenceName: fontSize }); + /** + * @returns {Promise>} + */ + async function getPreferences() { + try { + const content = (await fileService.read(uri)).value; + return JSON.parse(content); + } catch (e) { + return {}; + } + } + + /** + * @param {string} key + * @param {unknown} value + */ + async function setPreference(key, value) { + return preferenceService.set(key, value, PreferenceScope.Workspace); + } + + async function deleteAllValues() { + const reference = await modelService.createModelReference(uri); + if (reference.object.dirty) { + await reference.object.revert(); + } + /** @type {import ('@theia/preferences/lib/browser/folder-preference-provider').FolderPreferenceProvider} */ + const provider = Array.from(folderPreferences['providers'].values()).find(candidate => candidate.getConfigUri().isEqual(uri)); + assert.isDefined(provider); + await provider['doSetPreference']('', [], undefined); + reference.dispose(); + } + + let fileExistsBeforehand = false; + let contentBeforehand = ''; + + before(async function () { + assert.isDefined(uri, 'The workspace config URI should be defined!'); + fileExistsBeforehand = await fileService.exists(uri); + contentBeforehand = await fileService.read(uri).then(({ value }) => value).catch(() => ''); + await deleteAllValues(); + }); + + after(async function () { + if (!fileExistsBeforehand) { + await fileService.delete(uri, { fromUserGesture: false }).catch(() => { }); + } else { + await fileService.write(uri, contentBeforehand); + } + }); + + beforeEach(async function () { + const prefs = await getPreferences(); + for (const key of [tabSize, fontSize, override, overriddenTabSize, overriddenFontSize]) { + shouldBeUndefined(prefs[key], key); + } + }); + + afterEach(async function () { + await deleteAllValues(); + }); + + /** + * @param {unknown} value + * @param {string} key + */ + function shouldBeUndefined(value, key) { + assert.isUndefined(value, `There should be no ${key} object or value in the preferences.`); + } + + /** + * @returns {Promise<{newTabSize: number, newFontSize: number, startingTabSize: number, startingFontSize: number}>} + */ + async function setUpOverride() { + const startingTabSize = preferenceService.get(tabSize); + const startingFontSize = preferenceService.get(fontSize); + assert.equal(preferenceService.get(overriddenTabSize), startingTabSize, 'The overridden value should equal the default.'); + assert.equal(preferenceService.get(overriddenFontSize), startingFontSize, 'The overridden value should equal the default.'); + const newTabSize = startingTabSize + 2; + const newFontSize = startingFontSize + 2; + await Promise.all([ + setPreference(overriddenTabSize, newTabSize), + setPreference(overriddenFontSize, newFontSize), + ]); + assert.equal(preferenceService.get(overriddenTabSize), newTabSize, 'After setting, the new value should be active for the override.'); + assert.equal(preferenceService.get(overriddenFontSize), newFontSize, 'After setting, the new value should be active for the override.'); + return { newTabSize, newFontSize, startingTabSize, startingFontSize }; + } + + it('Sets language overrides as objects', async function () { + const { newTabSize, newFontSize } = await setUpOverride(); + const prefs = await getPreferences(); + assert.isObject(prefs[override], 'The override should be a key in the preference object.'); + assert.equal(prefs[override][tabSize], newTabSize, 'editor.tabSize should be a key in the override object and have the correct value.'); + assert.equal(prefs[override][fontSize], newFontSize, 'editor.fontSize should be a key in the override object and should have the correct value.'); + shouldBeUndefined(prefs[overriddenTabSize], overriddenTabSize); + shouldBeUndefined(prefs[overriddenFontSize], overriddenFontSize); + }); + + it('Allows deletion of individual keys in the override object.', async function () { + const { startingTabSize } = await setUpOverride(); + await setPreference(overriddenTabSize, undefined); + assert.equal(preferenceService.get(overriddenTabSize), startingTabSize); + const prefs = await getPreferences(); + shouldBeUndefined(prefs[override][tabSize], tabSize); + shouldBeUndefined(prefs[overriddenFontSize], overriddenFontSize); + shouldBeUndefined(prefs[overriddenTabSize], overriddenTabSize); + }); + + it('Allows deletion of the whole override object', async function () { + const { startingFontSize, startingTabSize } = await setUpOverride(); + await setPreference(override, undefined); + assert.equal(preferenceService.get(overriddenTabSize), startingTabSize, 'The overridden value should revert to the default.'); + assert.equal(preferenceService.get(overriddenFontSize), startingFontSize, 'The overridden value should revert to the default.'); + const prefs = await getPreferences(); + shouldBeUndefined(prefs[override], override); + }); +}); diff --git a/examples/api-tests/tsconfig.json b/examples/api-tests/tsconfig.json new file mode 100644 index 0000000000000..1166e7d50cc31 --- /dev/null +++ b/examples/api-tests/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../configs/base.tsconfig", + "compilerOptions": { + "rootDir": "src", + "outDir": "lib", + "allowJs": true, + "baseUrl": "." + }, + "include": [ + "src" + ] +} diff --git a/scripts/compile-references.js b/scripts/compile-references.js index c3d2a2e478a28..43622a251d68f 100644 --- a/scripts/compile-references.js +++ b/scripts/compile-references.js @@ -74,7 +74,7 @@ async function getTypescriptReferences(requestedPackage) { const references = await Promise.all((requestedPackage.workspaceDependencies || []).map(async dependency => { const depWorkspace = YARN_WORKSPACES[dependency]; const depConfig = path.join(ROOT, depWorkspace.location, 'tsconfig.json'); - if (!await fileExists(depConfig)) { + if (depWorkspace.location.includes('api-tests') || !await fileExists(depConfig)) { return undefined; // ignore because dep has no tsconfig } return path.posix.relative(requestedPackage.location, depWorkspace.location);