Path: blob/main/src/vs/workbench/contrib/chat/test/browser/chatMarkdownRenderer.test.ts
3296 views
/*---------------------------------------------------------------------------------------------1* Copyright (c) Microsoft Corporation. All rights reserved.2* Licensed under the MIT License. See License.txt in the project root for license information.3*--------------------------------------------------------------------------------------------*/45import { MarkdownString } from '../../../../../base/common/htmlContent.js';6import { assertSnapshot } from '../../../../../base/test/common/snapshot.js';7import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../../base/test/common/utils.js';8import { ChatMarkdownRenderer } from '../../browser/chatMarkdownRenderer.js';9import { workbenchInstantiationService } from '../../../../test/browser/workbenchTestServices.js';1011suite('ChatMarkdownRenderer', () => {12const store = ensureNoDisposablesAreLeakedInTestSuite();1314let testRenderer: ChatMarkdownRenderer;15setup(() => {16const instantiationService = store.add(workbenchInstantiationService(undefined, store));17testRenderer = instantiationService.createInstance(ChatMarkdownRenderer, {});18});1920test('simple', async () => {21const md = new MarkdownString('a');22const result = store.add(testRenderer.render(md));23await assertSnapshot(result.element.textContent);24});2526test('supportHtml with one-line markdown', async () => {27const md = new MarkdownString('**hello**');28md.supportHtml = true;29const result = store.add(testRenderer.render(md));30await assertSnapshot(result.element.outerHTML);3132const md2 = new MarkdownString('1. [_hello_](https://example.com) test **text**');33md2.supportHtml = true;34const result2 = store.add(testRenderer.render(md2));35await assertSnapshot(result2.element.outerHTML);36});3738test('invalid HTML', async () => {39const md = new MarkdownString('1<canvas>2<details>3</details></canvas>4');40md.supportHtml = true;41const result = store.add(testRenderer.render(md));42await assertSnapshot(result.element.outerHTML);43});4445test('invalid HTML with attributes', async () => {46const md = new MarkdownString('1<details id="id1" style="display: none">2<details id="my id 2">3</details></details>4');47md.supportHtml = true;48const result = store.add(testRenderer.render(md));49await assertSnapshot(result.element.outerHTML);50});5152test('valid HTML', async () => {53const md = new MarkdownString(`54<h1>heading</h1>55<ul>56<li>1</li>57<li><b>hi</b></li>58</ul>59<pre><code>code here</code></pre>`);60md.supportHtml = true;61const result = store.add(testRenderer.render(md));62await assertSnapshot(result.element.outerHTML);63});6465test('mixed valid and invalid HTML', async () => {66const md = new MarkdownString(`67<h1>heading</h1>68<details>69<ul>70<li><span><details><i>1</i></details></span></li>71<li><b>hi</b></li>72</ul>73</details>74<pre><canvas>canvas here</canvas></pre><details></details>`);75md.supportHtml = true;76const result = store.add(testRenderer.render(md));77await assertSnapshot(result.element.outerHTML);78});7980test('self-closing elements', async () => {81{82const md = new MarkdownString('<area><hr><br><input type="text" value="test">');83md.supportHtml = true;84const result = store.add(testRenderer.render(md));85await assertSnapshot(result.element.outerHTML);86}87{88const md = new MarkdownString('<area><hr><br><input type="checkbox">');89md.supportHtml = true;90const result = store.add(testRenderer.render(md));91await assertSnapshot(result.element.outerHTML);92}93});9495test('html comments', async () => {96const md = new MarkdownString('<!-- comment1 <div></div> --><div>content</div><!-- comment2 -->');97md.supportHtml = true;98const result = store.add(testRenderer.render(md));99await assertSnapshot(result.element.outerHTML);100});101102test('CDATA', async () => {103const md = new MarkdownString('<![CDATA[<div>content</div>]]>');104md.supportHtml = true;105const result = store.add(testRenderer.render(md));106await assertSnapshot(result.element.outerHTML);107});108109test('remote images are disallowed', async () => {110const md = new MarkdownString('<img src="http://disallowed.com/image.jpg">');111md.supportHtml = true;112const result = store.add(testRenderer.render(md));113await assertSnapshot(result.element.outerHTML);114});115});116117118