From 2f1c5b991cd2d01806213658aa14d4f642afb64a Mon Sep 17 00:00:00 2001 From: Cameron Dubas Date: Sun, 22 Oct 2023 14:59:01 +0100 Subject: [PATCH] test(lsp): sorting multiple import blocks --- .../language-server/organize-imports.test.ts | 178 ++++++++++ .../language-server/requests.test.ts | 328 ------------------ 2 files changed, 178 insertions(+), 328 deletions(-) create mode 100644 packages/core/__tests__/language-server/organize-imports.test.ts delete mode 100644 packages/core/__tests__/language-server/requests.test.ts diff --git a/packages/core/__tests__/language-server/organize-imports.test.ts b/packages/core/__tests__/language-server/organize-imports.test.ts new file mode 100644 index 000000000..08a90d6a8 --- /dev/null +++ b/packages/core/__tests__/language-server/organize-imports.test.ts @@ -0,0 +1,178 @@ +import { Project } from 'glint-monorepo-test-utils'; +import { describe, beforeEach, afterEach, test, expect } from 'vitest'; +import { stripIndent } from 'common-tags'; +import * as ts from 'typescript'; + +describe('Language Server: Organize Imports', () => { + let project!: Project; + + beforeEach(async () => { + project = await Project.create(); + }); + + afterEach(async () => { + await project.destroy(); + }); + + test('no imports', () => { + project.write({ + 'index.ts': stripIndent` + + export default class Application extends Component { + static template = hbs\` + Hello, world! + \`; + } + `, + }); + + let server = project.startLanguageServer(); + let formatting = ts.getDefaultFormatCodeSettings(); + let preferences = {}; + let edits = server.organizeImports(project.fileURI('index.ts'), formatting, preferences); + + expect(edits).toEqual([]); + }); + + test('ts: handles sorting imports', () => { + project.write({ + 'index.ts': stripIndent` + import './App.css'; + import EmberComponent from './ember-component'; + import Component from '@ember/component'; + + interface WrapperComponentSignature { + Blocks: { + default: [ + { + InnerComponent: WithBoundArgs; + MaybeComponent?: ComponentLike<{ Args: { key: string } }>; + } + ]; + }; + } + + // Second Import Block + import logo from './logo.svg'; + import { ComponentLike, WithBoundArgs } from '@glint/template'; + + export default class WrapperComponent extends Component { + logo = logo + } + `, + }); + + let server = project.startLanguageServer(); + + let formatting = ts.getDefaultFormatCodeSettings(); + let preferences = {}; + let edits = server.organizeImports(project.fileURI('index.ts'), formatting, preferences); + + expect(edits).toEqual([ + { + newText: + "import Component from '@ember/component';\nimport './App.css';\nimport EmberComponent from './ember-component';\n", + range: { + start: { character: 0, line: 0 }, + end: { character: 0, line: 1 }, + }, + }, + { + newText: '', + range: { + start: { character: 0, line: 1 }, + end: { character: 0, line: 2 }, + }, + }, + { + newText: '', + range: { + start: { character: 0, line: 2 }, + end: { character: 0, line: 3 }, + }, + }, + { + newText: + "import { ComponentLike, WithBoundArgs } from '@glint/template';\nimport logo from './logo.svg';\n", + range: { + start: { character: 0, line: 16 }, + end: { character: 0, line: 17 }, + }, + }, + { + newText: '', + range: { + start: { character: 0, line: 17 }, + end: { character: 0, line: 18 }, + }, + }, + ]); + }); + + test('gts: handles sorting imports', () => { + project.setGlintConfig({ environment: 'ember-template-imports' }); + project.write({ + 'index.gts': stripIndent` + import Component from '@glimmer/component'; + import { hash } from '@ember/helper'; + + class List extends Component { + + } + + // Second Import Block + import { ComponentLike, ModifierLike, HelperLike } from '@glint/template'; + import { TOC } from '@ember/component/template-only'; + + const MaybeComponent: undefined as TOC<{ Args: { arg: string } }> | undefined; + declare const CanvasThing: ComponentLike<{ Args: { str: string }; Element: HTMLCanvasElement }>; + `, + }); + + let server = project.startLanguageServer(); + + let formatting = ts.getDefaultFormatCodeSettings(); + let preferences = {}; + let edits = server.organizeImports(project.fileURI('index.gts'), formatting, preferences); + + expect(edits).toEqual([ + { + newText: + "import { hash } from '@ember/helper';\nimport Component from '@glimmer/component';\n", + range: { + start: { character: 0, line: 0 }, + end: { character: 0, line: 1 }, + }, + }, + { + newText: '', + range: { + start: { character: 0, line: 1 }, + end: { character: 0, line: 2 }, + }, + }, + { + newText: + "import { TOC } from '@ember/component/template-only';\nimport { ComponentLike, HelperLike, ModifierLike } from '@glint/template';\n", + range: { + start: { character: 0, line: 15 }, + end: { character: 0, line: 16 }, + }, + }, + { + newText: '', + range: { + start: { character: 0, line: 16 }, + end: { character: 0, line: 17 }, + }, + }, + ]); + }); +}); diff --git a/packages/core/__tests__/language-server/requests.test.ts b/packages/core/__tests__/language-server/requests.test.ts deleted file mode 100644 index adb268c37..000000000 --- a/packages/core/__tests__/language-server/requests.test.ts +++ /dev/null @@ -1,328 +0,0 @@ -import { Project } from 'glint-monorepo-test-utils'; -import { describe, beforeEach, afterEach, test, expect } from 'vitest'; -import { stripIndent } from 'common-tags'; -import * as ts from 'typescript'; - -describe('Language Server: Requests', () => { - let project!: Project; - - beforeEach(async () => { - project = await Project.create(); - }); - - afterEach(async () => { - await project.destroy(); - }); - - test('no imports', () => { - project.write({ - 'index.ts': stripIndent` - - export default class Application extends Component { - static template = hbs\` - Hello, world! - \`; - } - `, - }); - - let server = project.startLanguageServer(); - let formatting = ts.getDefaultFormatCodeSettings(); - let preferences = {}; - let edits = server.organizeImports(project.fileURI('index.ts'), formatting, preferences); - - expect(edits).toEqual([]); - }); - - test('single import', () => { - project.write({ - 'index.ts': stripIndent` - import Component, { hbs } from '@glimmerx/component'; - - export default class Application extends Component { - static template = hbs\` - Hello, world! - \`; - } - `, - }); - - let server = project.startLanguageServer(); - let formatting = ts.getDefaultFormatCodeSettings(); - let preferences = {}; - let edits = server.organizeImports(project.fileURI('index.ts'), formatting, preferences); - - expect(edits).toEqual([]); - }); - - test('many imports, unsorted', () => { - project.write({ - 'index.ts': stripIndent` - import './App.css'; - import EmberComponent from './ember-component'; - import Component from '@ember/component'; - import logo from './logo.svg'; - import { ComponentLike, WithBoundArgs } from '@glint/template'; - - interface WrapperComponentSignature { - Blocks: { - default: [ - { - InnerComponent: WithBoundArgs; - MaybeComponent?: ComponentLike<{ Args: { key: string } }>; - } - ]; - }; - } - - export default class WrapperComponent extends Component { - logo = logo - } - `, - }); - - let server = project.startLanguageServer(); - - let formatting = ts.getDefaultFormatCodeSettings(); - let preferences = {}; - let edits = server.organizeImports(project.fileURI('index.ts'), formatting, preferences); - - expect(edits).toEqual([ - { - newText: - "import Component from '@ember/component';\nimport { ComponentLike, WithBoundArgs } from '@glint/template';\nimport './App.css';\nimport EmberComponent from './ember-component';\nimport logo from './logo.svg';\n", - range: { - start: { character: 0, line: 0 }, - end: { character: 0, line: 1 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 1 }, - end: { character: 0, line: 2 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 2 }, - end: { character: 0, line: 3 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 3 }, - end: { character: 0, line: 4 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 4 }, - end: { character: 0, line: 5 }, - }, - }, - ]); - - test('many imports, sorted', () => { - project.write({ - 'index.ts': stripIndent` - import Component from '@ember/component'; - import { ComponentLike, WithBoundArgs } from '@glint/template'; - import EmberComponent from './ember-component'; - import './App.css'; - import logo from './logo.svg'; - - interface WrapperComponentSignature { - Blocks: { - default: [ - { - InnerComponent: WithBoundArgs; - MaybeComponent?: ComponentLike<{ Args: { key: string } }>; - } - ]; - }; - } - - export default class WrapperComponent extends Component { - logo = logo - } - `, - }); - - let server = project.startLanguageServer(); - - let formatting = ts.getDefaultFormatCodeSettings(); - let preferences = {}; - let edits = server.organizeImports(project.fileURI('index.ts'), formatting, preferences); - - expect(edits).toEqual([ - { - newText: - "import Component from '@ember/component';\nimport { ComponentLike, WithBoundArgs } from '@glint/template';\nimport './App.css';\nimport EmberComponent from './ember-component';\nimport logo from './logo.svg';\n", - range: { - start: { character: 0, line: 0 }, - end: { character: 0, line: 1 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 1 }, - end: { character: 0, line: 2 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 2 }, - end: { character: 0, line: 3 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 3 }, - end: { character: 0, line: 4 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 4 }, - end: { character: 0, line: 5 }, - }, - }, - ]); - }); - }); - - test('many imports, already sorted', () => { - project.write({ - 'index.ts': stripIndent` - import Component from '@ember/component'; - import { ComponentLike, WithBoundArgs } from '@glint/template'; - import './App.css'; - import EmberComponent from './ember-component'; - import logo from './logo.svg'; - - interface WrapperComponentSignature { - Blocks: { - default: [ - { - InnerComponent: WithBoundArgs; - MaybeComponent?: ComponentLike<{ Args: { key: string } }>; - } - ]; - }; - } - - export default class WrapperComponent extends Component { - logo = logo - } - `, - }); - - let server = project.startLanguageServer(); - - let formatting = ts.getDefaultFormatCodeSettings(); - let preferences = {}; - let edits = server.organizeImports(project.fileURI('index.ts'), formatting, preferences); - - expect(edits).toEqual([ - { - newText: - "import Component from '@ember/component';\nimport { ComponentLike, WithBoundArgs } from '@glint/template';\nimport './App.css';\nimport EmberComponent from './ember-component';\nimport logo from './logo.svg';\n", - range: { - start: { character: 0, line: 0 }, - end: { character: 0, line: 1 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 1 }, - end: { character: 0, line: 2 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 2 }, - end: { character: 0, line: 3 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 3 }, - end: { character: 0, line: 4 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 4 }, - end: { character: 0, line: 5 }, - }, - }, - ]); - }); - - test('gts import sorting', () => { - project.setGlintConfig({ environment: 'ember-template-imports' }); - project.write({ - 'index.gts': stripIndent` - import Component from '@glimmer/component'; - import { TOC } from '@ember/component/template-only'; - import { hash } from '@ember/helper'; - - const MaybeComponent: undefined as TOC<{ Args: { arg: string } }> | undefined; - - class List extends Component { - - } - `, - }); - - let server = project.startLanguageServer(); - - let formatting = ts.getDefaultFormatCodeSettings(); - let preferences = {}; - let edits = server.organizeImports(project.fileURI('index.gts'), formatting, preferences); - - expect(edits).toEqual([ - { - newText: - "import { TOC } from '@ember/component/template-only';\nimport { hash } from '@ember/helper';\nimport Component from '@glimmer/component';\n", - range: { - start: { character: 0, line: 0 }, - end: { character: 0, line: 1 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 1 }, - end: { character: 0, line: 2 }, - }, - }, - { - newText: '', - range: { - start: { character: 0, line: 2 }, - end: { character: 0, line: 3 }, - }, - }, - ]); - }); -});