Path: blob/main/src/vs/base/test/browser/formattedTextRenderer.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 assert from 'assert';6import { renderFormattedText, renderText } from '../../browser/formattedTextRenderer.js';7import { DisposableStore } from '../../common/lifecycle.js';8import { ensureNoDisposablesAreLeakedInTestSuite } from '../common/utils.js';9import { $ } from '../../browser/dom.js';1011suite('FormattedTextRenderer', () => {12const store = new DisposableStore();1314setup(() => {15store.clear();16});1718teardown(() => {19store.clear();20});2122test('render simple element', () => {23const result: HTMLElement = renderText('testing');2425assert.strictEqual(result.nodeType, document.ELEMENT_NODE);26assert.strictEqual(result.textContent, 'testing');27assert.strictEqual(result.tagName, 'DIV');28});2930test('render element with target', () => {31const target = $('div.testClass');32const result = renderText('testing', {}, target);33assert.strictEqual(result.nodeType, document.ELEMENT_NODE);34assert.strictEqual(result, target);35assert.strictEqual(result.className, 'testClass');36});3738test('simple formatting', () => {39let result: HTMLElement = renderFormattedText('**bold**');40assert.strictEqual(result.children.length, 1);41assert.strictEqual(result.firstChild!.textContent, 'bold');42assert.strictEqual((<HTMLElement>result.firstChild).tagName, 'B');43assert.strictEqual(result.innerHTML, '<b>bold</b>');4445result = renderFormattedText('__italics__');46assert.strictEqual(result.innerHTML, '<i>italics</i>');4748result = renderFormattedText('``code``');49assert.strictEqual(result.innerHTML, '``code``');5051result = renderFormattedText('``code``', { renderCodeSegments: true });52assert.strictEqual(result.innerHTML, '<code>code</code>');5354result = renderFormattedText('this string has **bold**, __italics__, and ``code``!!', { renderCodeSegments: true });55assert.strictEqual(result.innerHTML, 'this string has <b>bold</b>, <i>italics</i>, and <code>code</code>!!');56});5758test('no formatting', () => {59const result: HTMLElement = renderFormattedText('this is just a string');60assert.strictEqual(result.innerHTML, 'this is just a string');61});6263test('preserve newlines', () => {64const result: HTMLElement = renderFormattedText('line one\nline two');65assert.strictEqual(result.innerHTML, 'line one<br>line two');66});6768test('action', () => {69let callbackCalled = false;70const result: HTMLElement = renderFormattedText('[[action]]', {71actionHandler: {72callback(content) {73assert.strictEqual(content, '0');74callbackCalled = true;75},76disposables: store77}78});79assert.strictEqual(result.innerHTML, '<a>action</a>');8081const event: MouseEvent = document.createEvent('MouseEvent');82event.initEvent('click', true, true);83result.firstChild!.dispatchEvent(event);84assert.strictEqual(callbackCalled, true);85});8687test('fancy action', () => {88let callbackCalled = false;89const result: HTMLElement = renderFormattedText('__**[[action]]**__', {90actionHandler: {91callback(content) {92assert.strictEqual(content, '0');93callbackCalled = true;94},95disposables: store96}97});98assert.strictEqual(result.innerHTML, '<i><b><a>action</a></b></i>');99100const event: MouseEvent = document.createEvent('MouseEvent');101event.initEvent('click', true, true);102result.firstChild!.firstChild!.firstChild!.dispatchEvent(event);103assert.strictEqual(callbackCalled, true);104});105106test('fancier action', () => {107let callbackCalled = false;108const result: HTMLElement = renderFormattedText('``__**[[action]]**__``', {109renderCodeSegments: true,110actionHandler: {111callback(content) {112assert.strictEqual(content, '0');113callbackCalled = true;114},115disposables: store116}117});118assert.strictEqual(result.innerHTML, '<code><i><b><a>action</a></b></i></code>');119120const event: MouseEvent = document.createEvent('MouseEvent');121event.initEvent('click', true, true);122result.firstChild!.firstChild!.firstChild!.firstChild!.dispatchEvent(event);123assert.strictEqual(callbackCalled, true);124});125126test('escaped formatting', () => {127const result: HTMLElement = renderFormattedText('\\*\\*bold\\*\\*');128assert.strictEqual(result.children.length, 0);129assert.strictEqual(result.innerHTML, '**bold**');130});131132ensureNoDisposablesAreLeakedInTestSuite();133});134135136