Path: blob/main/extensions/copilot/src/extension/prompts/node/test/fixtures/strings.test-example.ts
13406 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*--------------------------------------------------------------------------------------------*/4import * as assert from 'assert';5import * as strings from './strings';67suite('Strings', () => {8test('equalsIgnoreCase', () => {9assert(strings.equalsIgnoreCase('', ''));10assert(!strings.equalsIgnoreCase('', '1'));11assert(!strings.equalsIgnoreCase('1', ''));1213assert(strings.equalsIgnoreCase('a', 'a'));14assert(strings.equalsIgnoreCase('abc', 'Abc'));15assert(strings.equalsIgnoreCase('abc', 'ABC'));16assert(strings.equalsIgnoreCase('Höhenmeter', 'HÖhenmeter'));17assert(strings.equalsIgnoreCase('ÖL', 'Öl'));18});1920test('beginsWithIgnoreCase', () => {21assert(strings.startsWithIgnoreCase('', ''));22assert(!strings.startsWithIgnoreCase('', '1'));23assert(strings.startsWithIgnoreCase('1', ''));2425assert(strings.startsWithIgnoreCase('a', 'a'));26assert(strings.startsWithIgnoreCase('abc', 'Abc'));27assert(strings.startsWithIgnoreCase('abc', 'ABC'));28assert(strings.startsWithIgnoreCase('Höhenmeter', 'HÖhenmeter'));29assert(strings.startsWithIgnoreCase('ÖL', 'Öl'));3031assert(strings.startsWithIgnoreCase('alles klar', 'a'));32assert(strings.startsWithIgnoreCase('alles klar', 'A'));33assert(strings.startsWithIgnoreCase('alles klar', 'alles k'));34assert(strings.startsWithIgnoreCase('alles klar', 'alles K'));35assert(strings.startsWithIgnoreCase('alles klar', 'ALLES K'));36assert(strings.startsWithIgnoreCase('alles klar', 'alles klar'));37assert(strings.startsWithIgnoreCase('alles klar', 'ALLES KLAR'));3839assert(!strings.startsWithIgnoreCase('alles klar', ' ALLES K'));40assert(!strings.startsWithIgnoreCase('alles klar', 'ALLES K '));41assert(!strings.startsWithIgnoreCase('alles klar', 'öALLES K '));42assert(!strings.startsWithIgnoreCase('alles klar', ' '));43assert(!strings.startsWithIgnoreCase('alles klar', 'ö'));44});4546test('compareIgnoreCase', () => {4748function assertCompareIgnoreCase(a: string, b: string, recurse = true): void {49let actual = strings.compareIgnoreCase(a, b);50actual = actual > 0 ? 1 : actual < 0 ? -1 : actual;5152let expected = strings.compare(a.toLowerCase(), b.toLowerCase());53expected = expected > 0 ? 1 : expected < 0 ? -1 : expected;54assert.strictEqual(actual, expected, `${a} <> ${b}`);5556if (recurse) {57assertCompareIgnoreCase(b, a, false);58}59}6061assertCompareIgnoreCase('', '');62assertCompareIgnoreCase('abc', 'ABC');63assertCompareIgnoreCase('abc', 'ABc');64assertCompareIgnoreCase('abc', 'ABcd');65assertCompareIgnoreCase('abc', 'abcd');66assertCompareIgnoreCase('foo', 'föo');67assertCompareIgnoreCase('Code', 'code');68assertCompareIgnoreCase('Code', 'cöde');6970assertCompareIgnoreCase('B', 'a');71assertCompareIgnoreCase('a', 'B');72assertCompareIgnoreCase('b', 'a');73assertCompareIgnoreCase('a', 'b');7475assertCompareIgnoreCase('aa', 'ab');76assertCompareIgnoreCase('aa', 'aB');77assertCompareIgnoreCase('aa', 'aA');78assertCompareIgnoreCase('a', 'aa');79assertCompareIgnoreCase('ab', 'aA');80assertCompareIgnoreCase('O', '/');81});8283test('compareIgnoreCase (substring)', () => {8485function assertCompareIgnoreCase(a: string, b: string, aStart: number, aEnd: number, bStart: number, bEnd: number, recurse = true): void {86let actual = strings.compareSubstringIgnoreCase(a, b, aStart, aEnd, bStart, bEnd);87actual = actual > 0 ? 1 : actual < 0 ? -1 : actual;8889let expected = strings.compare(a.toLowerCase().substring(aStart, aEnd), b.toLowerCase().substring(bStart, bEnd));90expected = expected > 0 ? 1 : expected < 0 ? -1 : expected;91assert.strictEqual(actual, expected, `${a} <> ${b}`);9293if (recurse) {94assertCompareIgnoreCase(b, a, bStart, bEnd, aStart, aEnd, false);95}96}9798assertCompareIgnoreCase('', '', 0, 0, 0, 0);99assertCompareIgnoreCase('abc', 'ABC', 0, 1, 0, 1);100assertCompareIgnoreCase('abc', 'Aabc', 0, 3, 1, 4);101assertCompareIgnoreCase('abcABc', 'ABcd', 3, 6, 0, 4);102});103104test('format', () => {105assert.strictEqual(strings.format('Foo Bar'), 'Foo Bar');106assert.strictEqual(strings.format('Foo {0} Bar'), 'Foo {0} Bar');107assert.strictEqual(strings.format('Foo {0} Bar', 'yes'), 'Foo yes Bar');108assert.strictEqual(strings.format('Foo {0} Bar {0}', 'yes'), 'Foo yes Bar yes');109assert.strictEqual(strings.format('Foo {0} Bar {1}{2}', 'yes'), 'Foo yes Bar {1}{2}');110assert.strictEqual(strings.format('Foo {0} Bar {1}{2}', 'yes', undefined), 'Foo yes Bar undefined{2}');111assert.strictEqual(strings.format('Foo {0} Bar {1}{2}', 'yes', 5, false), 'Foo yes Bar 5false');112assert.strictEqual(strings.format('Foo {0} Bar. {1}', '(foo)', '.test'), 'Foo (foo) Bar. .test');113});114115test('format2', () => {116assert.strictEqual(strings.format2('Foo Bar', {}), 'Foo Bar');117assert.strictEqual(strings.format2('Foo {oops} Bar', {}), 'Foo {oops} Bar');118assert.strictEqual(strings.format2('Foo {foo} Bar', { foo: 'bar' }), 'Foo bar Bar');119assert.strictEqual(strings.format2('Foo {foo} Bar {foo}', { foo: 'bar' }), 'Foo bar Bar bar');120assert.strictEqual(strings.format2('Foo {foo} Bar {bar}{boo}', { foo: 'bar' }), 'Foo bar Bar {bar}{boo}');121assert.strictEqual(strings.format2('Foo {foo} Bar {bar}{boo}', { foo: 'bar', bar: 'undefined' }), 'Foo bar Bar undefined{boo}');122assert.strictEqual(strings.format2('Foo {foo} Bar {bar}{boo}', { foo: 'bar', bar: '5', boo: false }), 'Foo bar Bar 5false');123assert.strictEqual(strings.format2('Foo {foo} Bar. {bar}', { foo: '(foo)', bar: '.test' }), 'Foo (foo) Bar. .test');124});125126test('lcut', () => {127assert.strictEqual(strings.lcut('foo bar', 0), '');128assert.strictEqual(strings.lcut('foo bar', 1), 'bar');129assert.strictEqual(strings.lcut('foo bar', 3), 'bar');130assert.strictEqual(strings.lcut('foo bar', 4), 'bar'); // Leading whitespace trimmed131assert.strictEqual(strings.lcut('foo bar', 5), 'foo bar');132assert.strictEqual(strings.lcut('test string 0.1.2.3', 3), '2.3');133134assert.strictEqual(strings.lcut('', 10), '');135assert.strictEqual(strings.lcut('a', 10), 'a');136});137138test('escape', () => {139assert.strictEqual(strings.escape(''), '');140assert.strictEqual(strings.escape('foo'), 'foo');141assert.strictEqual(strings.escape('foo bar'), 'foo bar');142assert.strictEqual(strings.escape('<foo bar>'), '<foo bar>');143assert.strictEqual(strings.escape('<foo>Hello</foo>'), '<foo>Hello</foo>');144});145146test('ltrim', () => {147assert.strictEqual(strings.ltrim('foo', 'f'), 'oo');148assert.strictEqual(strings.ltrim('foo', 'o'), 'foo');149assert.strictEqual(strings.ltrim('http://www.test.de', 'http://'), 'www.test.de');150assert.strictEqual(strings.ltrim('/foo/', '/'), 'foo/');151assert.strictEqual(strings.ltrim('//foo/', '/'), 'foo/');152assert.strictEqual(strings.ltrim('/', ''), '/');153assert.strictEqual(strings.ltrim('/', '/'), '');154assert.strictEqual(strings.ltrim('///', '/'), '');155assert.strictEqual(strings.ltrim('', ''), '');156assert.strictEqual(strings.ltrim('', '/'), '');157});158159test('rtrim', () => {160assert.strictEqual(strings.rtrim('foo', 'o'), 'f');161assert.strictEqual(strings.rtrim('foo', 'f'), 'foo');162assert.strictEqual(strings.rtrim('http://www.test.de', '.de'), 'http://www.test');163assert.strictEqual(strings.rtrim('/foo/', '/'), '/foo');164assert.strictEqual(strings.rtrim('/foo//', '/'), '/foo');165assert.strictEqual(strings.rtrim('/', ''), '/');166assert.strictEqual(strings.rtrim('/', '/'), '');167assert.strictEqual(strings.rtrim('///', '/'), '');168assert.strictEqual(strings.rtrim('', ''), '');169assert.strictEqual(strings.rtrim('', '/'), '');170});171172test('trim', () => {173assert.strictEqual(strings.trim(' foo '), 'foo');174assert.strictEqual(strings.trim(' foo'), 'foo');175assert.strictEqual(strings.trim('bar '), 'bar');176assert.strictEqual(strings.trim(' '), '');177assert.strictEqual(strings.trim('foo bar', 'bar'), 'foo ');178});179180test('trimWhitespace', () => {181assert.strictEqual(' foo '.trim(), 'foo');182assert.strictEqual(' foo '.trim(), 'foo');183assert.strictEqual(' foo'.trim(), 'foo');184assert.strictEqual('bar '.trim(), 'bar');185assert.strictEqual(' '.trim(), '');186assert.strictEqual(' '.trim(), '');187});188189test('lastNonWhitespaceIndex', () => {190assert.strictEqual(strings.lastNonWhitespaceIndex('abc \t \t '), 2);191assert.strictEqual(strings.lastNonWhitespaceIndex('abc'), 2);192assert.strictEqual(strings.lastNonWhitespaceIndex('abc\t'), 2);193assert.strictEqual(strings.lastNonWhitespaceIndex('abc '), 2);194assert.strictEqual(strings.lastNonWhitespaceIndex('abc \t \t '), 2);195assert.strictEqual(strings.lastNonWhitespaceIndex('abc \t \t abc \t \t '), 11);196assert.strictEqual(strings.lastNonWhitespaceIndex('abc \t \t abc \t \t ', 8), 2);197assert.strictEqual(strings.lastNonWhitespaceIndex(' \t \t '), -1);198});199200test('containsRTL', () => {201assert.strictEqual(strings.containsRTL('a'), false);202assert.strictEqual(strings.containsRTL(''), false);203assert.strictEqual(strings.containsRTL(strings.UTF8_BOM_CHARACTER + 'a'), false);204assert.strictEqual(strings.containsRTL('hello world!'), false);205assert.strictEqual(strings.containsRTL('a📚📚b'), false);206assert.strictEqual(strings.containsRTL('هناك حقيقة مثبتة منذ زمن طويل'), true);207assert.strictEqual(strings.containsRTL('זוהי עובדה מבוססת שדעתו'), true);208});209210test('issue #115221: isEmojiImprecise misses ⭐', () => {211const codePoint = strings.getNextCodePoint('⭐', '⭐'.length, 0);212assert.strictEqual(strings.isEmojiImprecise(codePoint), true);213});214215test('isBasicASCII', () => {216function assertIsBasicASCII(str: string, expected: boolean): void {217assert.strictEqual(strings.isBasicASCII(str), expected, str + ` (${str.charCodeAt(0)})`);218}219assertIsBasicASCII('abcdefghijklmnopqrstuvwxyz', true);220assertIsBasicASCII('ABCDEFGHIJKLMNOPQRSTUVWXYZ', true);221assertIsBasicASCII('1234567890', true);222assertIsBasicASCII('`~!@#$%^&*()-_=+[{]}\\|;:\'",<.>/?', true);223assertIsBasicASCII(' ', true);224assertIsBasicASCII('\t', true);225assertIsBasicASCII('\n', true);226assertIsBasicASCII('\r', true);227228let ALL = '\r\t\n';229for (let i = 32; i < 127; i++) {230ALL += String.fromCharCode(i);231}232assertIsBasicASCII(ALL, true);233234assertIsBasicASCII(String.fromCharCode(31), false);235assertIsBasicASCII(String.fromCharCode(127), false);236assertIsBasicASCII('ü', false);237assertIsBasicASCII('a📚📚b', false);238});239240test('createRegExp', () => {241// Empty242assert.throws(() => strings.createRegExp('', false));243244// Escapes appropriately245assert.strictEqual(strings.createRegExp('abc', false).source, 'abc');246assert.strictEqual(strings.createRegExp('([^ ,.]*)', false).source, '\\(\\[\\^ ,\\.\\]\\*\\)');247assert.strictEqual(strings.createRegExp('([^ ,.]*)', true).source, '([^ ,.]*)');248249// Whole word250assert.strictEqual(strings.createRegExp('abc', false, { wholeWord: true }).source, '\\babc\\b');251assert.strictEqual(strings.createRegExp('abc', true, { wholeWord: true }).source, '\\babc\\b');252assert.strictEqual(strings.createRegExp(' abc', true, { wholeWord: true }).source, ' abc\\b');253assert.strictEqual(strings.createRegExp('abc ', true, { wholeWord: true }).source, '\\babc ');254assert.strictEqual(strings.createRegExp(' abc ', true, { wholeWord: true }).source, ' abc ');255256const regExpWithoutFlags = strings.createRegExp('abc', true);257assert(!regExpWithoutFlags.global);258assert(regExpWithoutFlags.ignoreCase);259assert(!regExpWithoutFlags.multiline);260261const regExpWithFlags = strings.createRegExp('abc', true, { global: true, matchCase: true, multiline: true });262assert(regExpWithFlags.global);263assert(!regExpWithFlags.ignoreCase);264assert(regExpWithFlags.multiline);265});266267test('regExpContainsBackreference', () => {268assert(strings.regExpContainsBackreference('foo \\5 bar'));269assert(strings.regExpContainsBackreference('\\2'));270assert(strings.regExpContainsBackreference('(\\d)(\\n)(\\1)'));271assert(strings.regExpContainsBackreference('(A).*?\\1'));272assert(strings.regExpContainsBackreference('\\\\\\1'));273assert(strings.regExpContainsBackreference('foo \\\\\\1'));274275assert(!strings.regExpContainsBackreference(''));276assert(!strings.regExpContainsBackreference('\\\\1'));277assert(!strings.regExpContainsBackreference('foo \\\\1'));278assert(!strings.regExpContainsBackreference('(A).*?\\\\1'));279assert(!strings.regExpContainsBackreference('foo \\d1 bar'));280assert(!strings.regExpContainsBackreference('123'));281});282283test('getLeadingWhitespace', () => {284assert.strictEqual(strings.getLeadingWhitespace(' foo'), ' ');285assert.strictEqual(strings.getLeadingWhitespace(' foo', 2), '');286assert.strictEqual(strings.getLeadingWhitespace(' foo', 1, 1), '');287assert.strictEqual(strings.getLeadingWhitespace(' foo', 0, 1), ' ');288assert.strictEqual(strings.getLeadingWhitespace(' '), ' ');289assert.strictEqual(strings.getLeadingWhitespace(' ', 1), ' ');290assert.strictEqual(strings.getLeadingWhitespace(' ', 0, 1), ' ');291assert.strictEqual(strings.getLeadingWhitespace('\t\tfunction foo(){', 0, 1), '\t');292assert.strictEqual(strings.getLeadingWhitespace('\t\tfunction foo(){', 0, 2), '\t\t');293});294295test('fuzzyContains', () => {296assert.ok(!strings.fuzzyContains((undefined)!, null!));297assert.ok(strings.fuzzyContains('hello world', 'h'));298assert.ok(!strings.fuzzyContains('hello world', 'q'));299assert.ok(strings.fuzzyContains('hello world', 'hw'));300assert.ok(strings.fuzzyContains('hello world', 'horl'));301assert.ok(strings.fuzzyContains('hello world', 'd'));302assert.ok(!strings.fuzzyContains('hello world', 'wh'));303assert.ok(!strings.fuzzyContains('d', 'dd'));304});305306test('startsWithUTF8BOM', () => {307assert(strings.startsWithUTF8BOM(strings.UTF8_BOM_CHARACTER));308assert(strings.startsWithUTF8BOM(strings.UTF8_BOM_CHARACTER + 'a'));309assert(strings.startsWithUTF8BOM(strings.UTF8_BOM_CHARACTER + 'aaaaaaaaaa'));310assert(!strings.startsWithUTF8BOM(' ' + strings.UTF8_BOM_CHARACTER));311assert(!strings.startsWithUTF8BOM('foo'));312assert(!strings.startsWithUTF8BOM(''));313});314315test('stripUTF8BOM', () => {316assert.strictEqual(strings.stripUTF8BOM(strings.UTF8_BOM_CHARACTER), '');317assert.strictEqual(strings.stripUTF8BOM(strings.UTF8_BOM_CHARACTER + 'foobar'), 'foobar');318assert.strictEqual(strings.stripUTF8BOM('foobar' + strings.UTF8_BOM_CHARACTER), 'foobar' + strings.UTF8_BOM_CHARACTER);319assert.strictEqual(strings.stripUTF8BOM('abc'), 'abc');320assert.strictEqual(strings.stripUTF8BOM(''), '');321});322323test('containsUppercaseCharacter', () => {324[325[null, false],326['', false],327['foo', false],328['föö', false],329['ناك', false],330['מבוססת', false],331['😀', false],332['(#@()*&%()@*#&09827340982374}{:">?></\'\\~`', false],333334['Foo', true],335['FOO', true],336['FöÖ', true],337['FöÖ', true],338['\\Foo', true],339].forEach(([str, result]) => {340assert.strictEqual(strings.containsUppercaseCharacter(<string>str), result, `Wrong result for ${str}`);341});342});343344345346test('containsUppercaseCharacter (ignoreEscapedChars)', () => {347[348['\\Woo', false],349['f\\S\\S', false],350['foo', false],351352['Foo', true],353].forEach(([str, result]) => {354assert.strictEqual(strings.containsUppercaseCharacter(<string>str, true), result, `Wrong result for ${str}`);355});356});357358});359360361