Path: blob/main/src/vs/base/test/common/naturalLanguage/korean.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*--------------------------------------------------------------------------------------------*/45// allow-any-unicode-file67import { strictEqual } from 'assert';8import { getKoreanAltChars } from '../../../common/naturalLanguage/korean.js';9import { ensureNoDisposablesAreLeakedInTestSuite } from '../utils.js';1011function getKoreanAltCharsForString(text: string): string {12let result = '';13for (let i = 0; i < text.length; i++) {14const chars = getKoreanAltChars(text.charCodeAt(i));15if (chars) {16result += String.fromCharCode(...Array.from(chars));17} else {18result += text.charAt(i);19}20}21return result;22}2324suite('Korean', () => {25ensureNoDisposablesAreLeakedInTestSuite();2627suite('getKoreanAltChars', () => {28test('Modern initial consonants', () => {29const cases = new Map([30['ᄀ', 'r'],31['ᄁ', 'R'],32['ᄂ', 's'],33['ᄃ', 'e'],34['ᄄ', 'E'],35['ᄅ', 'f'],36['ᄆ', 'a'],37['ᄇ', 'q'],38['ᄈ', 'Q'],39['ᄉ', 't'],40['ᄊ', 'T'],41['ᄋ', 'd'],42['ᄌ', 'w'],43['ᄍ', 'W'],44['ᄎ', 'c'],45['ᄏ', 'z'],46['ᄐ', 'x'],47['ᄑ', 'v'],48['ᄒ', 'g'],49]);50for (const [hangul, alt] of cases.entries()) {51strictEqual(getKoreanAltCharsForString(hangul), alt, `"${hangul}" should result in "${alt}"`);52}53});5455test('Modern latter consonants', () => {56const cases = new Map([57['ᆨ', 'r'],58['ᆩ', 'R'],59['ᆪ', 'rt'],60['ᆫ', 's'],61['ᆬ', 'sw'],62['ᆭ', 'sg'],63['ᆮ', 'e'],64['ᆯ', 'f'],65['ᆰ', 'fr'],66['ᆱ', 'fa'],67['ᆲ', 'fq'],68['ᆳ', 'ft'],69['ᆴ', 'fx'],70['ᆵ', 'fv'],71['ᆶ', 'fg'],72['ᆷ', 'a'],73['ᆸ', 'q'],74['ᆹ', 'qt'],75['ᆺ', 't'],76['ᆻ', 'T'],77['ᆼ', 'd'],78['ᆽ', 'w'],79['ᆾ', 'c'],80['ᆿ', 'z'],81['ᇀ', 'x'],82['ᇁ', 'v'],83['ᇂ', 'g'],84]);85for (const [hangul, alt] of cases.entries()) {86strictEqual(getKoreanAltCharsForString(hangul), alt, `"${hangul}" (0x${hangul.charCodeAt(0).toString(16)}) should result in "${alt}"`);87}88});8990test('Modern vowels', () => {91const cases = new Map([92['ᅡ', 'k'],93['ᅢ', 'o'],94['ᅣ', 'i'],95['ᅤ', 'O'],96['ᅥ', 'j'],97['ᅦ', 'p'],98['ᅧ', 'u'],99['ᅨ', 'P'],100['ᅩ', 'h'],101['ᅪ', 'hk'],102['ᅫ', 'ho'],103['ᅬ', 'hl'],104['ᅭ', 'y'],105['ᅮ', 'n'],106['ᅯ', 'nj'],107['ᅰ', 'np'],108['ᅱ', 'nl'],109['ᅲ', 'b'],110['ᅳ', 'm'],111['ᅴ', 'ml'],112['ᅵ', 'l'],113]);114for (const [hangul, alt] of cases.entries()) {115strictEqual(getKoreanAltCharsForString(hangul), alt, `"${hangul}" (0x${hangul.charCodeAt(0).toString(16)}) should result in "${alt}"`);116}117});118119test('Compatibility Jamo', () => {120const cases = new Map([121['ㄱ', 'r'],122['ㄲ', 'R'],123['ㄳ', 'rt'],124['ㄴ', 's'],125['ㄵ', 'sw'],126['ㄶ', 'sg'],127['ㄷ', 'e'],128['ㄸ', 'E'],129['ㄹ', 'f'],130['ㄺ', 'fr'],131['ㄻ', 'fa'],132['ㄼ', 'fq'],133['ㄽ', 'ft'],134['ㄾ', 'fx'],135['ㄿ', 'fv'],136['ㅀ', 'fg'],137['ㅁ', 'a'],138['ㅂ', 'q'],139['ㅃ', 'Q'],140['ㅄ', 'qt'],141['ㅅ', 't'],142['ㅆ', 'T'],143['ㅇ', 'd'],144['ㅈ', 'w'],145['ㅉ', 'W'],146['ㅊ', 'c'],147['ㅋ', 'z'],148['ㅌ', 'x'],149['ㅍ', 'v'],150['ㅎ', 'g'],151['ㅏ', 'k'],152['ㅐ', 'o'],153['ㅑ', 'i'],154['ㅒ', 'O'],155['ㅓ', 'j'],156['ㅔ', 'p'],157['ㅕ', 'u'],158['ㅖ', 'P'],159['ㅗ', 'h'],160['ㅘ', 'hk'],161['ㅙ', 'ho'],162['ㅚ', 'hl'],163['ㅛ', 'y'],164['ㅜ', 'n'],165['ㅝ', 'nj'],166['ㅞ', 'np'],167['ㅟ', 'nl'],168['ㅠ', 'b'],169['ㅡ', 'm'],170['ㅢ', 'ml'],171['ㅣ', 'l'],172// HF: Hangul Filler (everything after this is archaic)173]);174for (const [hangul, alt] of cases.entries()) {175strictEqual(getKoreanAltCharsForString(hangul), alt, `"${hangul}" (0x${hangul.charCodeAt(0).toString(16)}) should result in "${alt}"`);176}177});178179// There are too many characters to test exhaustively, so select some180// real world use cases from this code base (workbench contrib names)181test('Composed samples', () => {182const cases = new Map([183['ㅁㅊㅊㄷㄴ냐ㅠㅑㅣㅑ쇼', 'accessibility'],184['ㅁㅊ채ㅕㅜㅅ뚜샤시드둣ㄴ', 'accountEntitlements'],185['며야ㅐ쳗ㄴ', 'audioCues'],186['ㅠㄱㅁ찯셰먁채ㅣㅐ걐ㄷㄱ2ㅆ디듣ㅅ교', 'bracketPairColorizer2Telemetry'],187['ㅠㅕㅣㅏㄸ얏', 'bulkEdit'],188['ㅊ미ㅣㅗㅑㄷㄱㅁㄱ초ㅛ', 'callHierarchy'],189['촘ㅅ', 'chat'],190['챙ㄷㅁㅊ샤ㅐㅜㄴ', 'codeActions'],191['챙ㄷㄸ야색', 'codeEditor'],192['채ㅡㅡ뭉ㄴ', 'commands'],193['채ㅡㅡ둣ㄴ', 'comments'],194['채ㅜ럏ㄸ테ㅐㄳㄷㄱ', 'configExporter'],195['채ㅜㅅㄷㅌ스두ㅕ', 'contextmenu'],196['쳔새ㅡㄸ야색', 'customEditor'],197['ㅇ듀ㅕㅎ', 'debug'],198['ㅇ덱ㄷㅊㅁㅅㄷㅇㄸㅌㅅ두냐ㅐㅜㅡㅑㅎㄱㅁ색', 'deprecatedExtensionMigrator'],199['ㄷ얏ㄴㄷㄴ냐ㅐㅜㄴ', 'editSessions'],200['드ㅡㄷㅅ', 'emmet'],201['ㄷㅌㅅ두냐ㅐㅜㄴ', 'extensions'],202['ㄷㅌㅅㄷ구밌ㄷ그ㅑㅜ미', 'externalTerminal'],203['ㄷㅌㅅㄷ구미ㅕ갸ㅒㅔ둗ㄱ', 'externalUriOpener'],204['랴ㅣㄷㄴ', 'files'],205['래ㅣ야ㅜㅎ', 'folding'],206['래금ㅅ', 'format'],207['ㅑㅟ묘ㅗㅑㅜㅅㄴ', 'inlayHints'],208['ㅑㅟㅑㅜㄷ촘ㅅ', 'inlineChat'],209['ㅑㅜㅅㄷㄱㅁㅊ샾ㄷ', 'interactive'],210['ㅑㄴ녇', 'issue'],211['ㅏ됴ㅠㅑㅜ야ㅜㅎㄴ', 'keybindings'],212['ㅣ무혐ㅎㄷㅇㄷㅅㄷㅊ샤ㅐㅜ', 'languageDetection'],213['ㅣ무혐ㅎㄷㄴㅅㅁ션', 'languageStatus'],214['ㅣㅑㅡㅑ샤ㅜ얓ㅁ색', 'limitIndicator'],215['ㅣㅑㄴㅅ', 'list'],216['ㅣㅐㅊ미ㅗㅑㄴ새교', 'localHistory'],217['ㅣㅐㅊ미ㅑㅋㅁ샤ㅐㅜ', 'localization'],218['ㅣㅐㅎㄴ', 'logs'],219['ㅡ메ㅔㄷㅇㄸ얏ㄴ', 'mappedEdits'],220['ㅡㅁ가애주', 'markdown'],221['ㅡㅁ갇ㄱㄴ', 'markers'],222['ㅡㄷㄱㅎㄷㄸ야색', 'mergeEditor'],223['ㅡㅕㅣ샤얄ㄹㄸ야색', 'multiDiffEditor'],224['ㅜㅐㅅ듀ㅐㅐㅏ', 'notebook'],225['ㅐㅕ시ㅑㅜㄷ', 'outline'],226['ㅐㅕ세ㅕㅅ', 'output'],227['ㅔㄷㄱ래그뭋ㄷ', 'performance'],228['ㅔㄱㄷㄹㄷㄱ둧ㄷㄴ', 'preferences'],229['벼ㅑ참ㅊㅊㄷㄴㄴ', 'quickaccess'],230['ㄱ디며ㅜ촏ㄱ', 'relauncher'],231['ㄱ드ㅐㅅㄷ', 'remote'],232['ㄱ드ㅐㅅㄷ쎠ㅜㅜ디', 'remoteTunnel'],233['ㄴㅁ노', 'sash'],234['ㄴ츠', 'scm'],235['ㄴㄷㅁㄱ초', 'search'],236['ㄴㄷㅁㄱ초ㄸ야색', 'searchEditor'],237['놈ㄱㄷ', 'share'],238['누ㅑㅔㅔㄷㅅㄴ', 'snippets'],239['넫ㄷ초', 'speech'],240['네ㅣㅁ노', 'splash'],241['녁ㅍ됸', 'surveys'],242['ㅅㅁㅎㄴ', 'tags'],243['ㅅㅁ난', 'tasks'],244['ㅅ디듣ㅅ교', 'telemetry'],245['ㅅㄷ그ㅑㅜ미', 'terminal'],246['ㅅㄷ그ㅑㅜ미채ㅜㅅ갸ㅠ', 'terminalContrib'],247['ㅅㄷㄴ샤ㅜㅎ', 'testing'],248['소듣ㄴ', 'themes'],249['샤ㅡ디ㅑㅜㄷ', 'timeline'],250['쇼ㅔ도ㅑㄷㄱㅁㄱ초ㅛ', 'typeHierarchy'],251['ㅕㅔㅇㅁㅅㄷ', 'update'],252['ㅕ기', 'url'],253['ㅕㄴㄷㄱㅇㅁㅅ몌개랴ㅣㄷ', 'userDataProfile'],254['ㅕㄴㄷㄱㅇㅁㅅㅁ뇨ㅜㅊ', 'userDataSync'],255['ㅈ듀퍋ㅈ', 'webview'],256['ㅈ듀퍋졔무디', 'webviewPanel'],257['ㅈ듀퍋ㅈ퍋ㅈ', 'webviewView'],258['ㅈ디채ㅡ듀무ㅜㄷㄱ', 'welcomeBanner'],259['ㅈ디채ㅡㄷ야미ㅐㅎ', 'welcomeDialog'],260['ㅈ디채ㅡㄷㅎㄷㅅ샤ㅜㅎㄴㅅㅁㄳㄷㅇ', 'welcomeGettingStarted'],261['ㅈ디채ㅡㄷ퍋ㅈㄴ', 'welcomeViews'],262['ㅈ디채ㅡㄷㅉ미ㅏ소개ㅕ호', 'welcomeWalkthrough'],263['재가넴ㅊㄷ', 'workspace'],264['재가넴ㅊㄷㄴ', 'workspaces'],265]);266for (const [hangul, alt] of cases.entries()) {267// Compare with lower case as some cases do not have268// corresponding hangul inputs269strictEqual(270getKoreanAltCharsForString(hangul).toLowerCase(),271alt.toLowerCase(),272`"${hangul}" (0x${hangul.charCodeAt(0).toString(16)}) should result in "${alt}"`273);274}275});276});277});278279280