diff --git a/packages/template/__tests__/emit-mathml.test.ts b/packages/template/__tests__/emit-mathml.test.ts new file mode 100644 index 000000000..419f1cf08 --- /dev/null +++ b/packages/template/__tests__/emit-mathml.test.ts @@ -0,0 +1,20 @@ +import { expectTypeOf } from 'expect-type'; +import { emitMathMlElement } from '../-private/dsl'; + +{ + let math = emitMathMlElement('math'); + + expectTypeOf(math).not.toBeAny(); + expectTypeOf(math).not.toBeUnknown(); + expectTypeOf(math.element).not.toEqualTypeOf(); + expectTypeOf(math.element).toEqualTypeOf(); +} + +{ + let mi = emitMathMlElement('mi'); + + expectTypeOf(mi).not.toBeAny(); + expectTypeOf(mi).not.toBeUnknown(); + expectTypeOf(mi.element).not.toEqualTypeOf(); + expectTypeOf(mi.element).toEqualTypeOf(); +} diff --git a/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts b/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts index a902f1172..49d1ad785 100644 --- a/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts +++ b/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts @@ -661,6 +661,39 @@ describe('Language Server: Diagnostics (ts plugin)', () => { expect(diagnostics.length).toBe(0); }); + test('mathml does not produce false positives', async () => { + let componentA = stripIndent` + export const MathMLExample = + `; + + const diagnostics = await requestTsserverDiagnostics( + 'ts-template-imports-app/src/ephemeral-index.gts', + 'glimmer-ts', + componentA, + ); + + expect(diagnostics).toMatchInlineSnapshot(`[]`); + }); + test('errors with modifiers are properly reported', async () => { const code = stripIndent` import Component from '@glimmer/component'; diff --git a/test-packages/package-test-core/__tests__/language-server/hover.test.ts b/test-packages/package-test-core/__tests__/language-server/hover.test.ts index 2147a4aa0..fb1b859fa 100644 --- a/test-packages/package-test-core/__tests__/language-server/hover.test.ts +++ b/test-packages/package-test-core/__tests__/language-server/hover.test.ts @@ -130,6 +130,25 @@ describe.skip('Language Server: Hover (ts plugin)', () => { } `); }); + + describe('MathML', () => { + test('empty ', async () => { + const [offset, content] = extractCursor(stripIndent` + + + `); + + const doc = await prepareDocument( + 'ts-template-imports-app/src/ephemeral.gts', + 'glimmer-ts', + content, + ); + + expect(await performHoverRequest(doc, offset)).toMatchInlineSnapshot(); + }); + }); }); async function performHoverRequest(document: TextDocument, offset: number): Promise { diff --git a/test-packages/package-test-core/__tests__/transform/template-to-typescript.test.ts b/test-packages/package-test-core/__tests__/transform/template-to-typescript.test.ts index 4d5a3089a..7f9650108 100644 --- a/test-packages/package-test-core/__tests__/transform/template-to-typescript.test.ts +++ b/test-packages/package-test-core/__tests__/transform/template-to-typescript.test.ts @@ -939,6 +939,26 @@ describe('Transform: rewriteTemplate', () => { }); describe('plain elements', () => { + describe('MathML', () => { + test('with static contents', () => { + let template = 'x=y'; + + expect(templateBody(template)).toMatchInlineSnapshot(` + "{ + const __glintY__ = __glintDSL__.emitMathMlElement("math"); + { + const __glintY__ = __glintDSL__.emitMathMlElement("mi"); + } + { + const __glintY__ = __glintDSL__.emitMathMlElement("mo"); + } + { + const __glintY__ = __glintDSL__.emitMathMlElement("mi"); + } + }" + `); + }); + }); test('with programmatic contents', () => { let template = '
{{@foo}}
'; diff --git a/test-packages/ts-template-imports-app/src/math-ml.gts b/test-packages/ts-template-imports-app/src/math-ml.gts new file mode 100644 index 000000000..28e3b88e5 --- /dev/null +++ b/test-packages/ts-template-imports-app/src/math-ml.gts @@ -0,0 +1,16 @@ +export const MathMLExample =