diff options
Diffstat (limited to 'packages/frontend/test/intl-string.test.ts')
| -rw-r--r-- | packages/frontend/test/intl-string.test.ts | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/packages/frontend/test/intl-string.test.ts b/packages/frontend/test/intl-string.test.ts new file mode 100644 index 0000000000..b52824db86 --- /dev/null +++ b/packages/frontend/test/intl-string.test.ts @@ -0,0 +1,142 @@ +/* + * SPDX-FileCopyrightText: syuilo and misskey-project + * SPDX-License-Identifier: AGPL-3.0-only + */ + +import { assert, beforeEach, describe, test } from 'vitest'; +import { + normalizeString, + initIntlString, + normalizeStringWithHiragana, + compareStringEquals, + compareStringIncludes, +} from '@/utility/intl-string.js'; + +// 共通のテストを実行するヘルパー関数 +const runCommonTests = (normalizeFn: (str: string) => string) => { + test('全角英数字が半角の小文字になる', () => { + // ローマ字にならないようにする + const input = 'B123'; + const expected = 'b123'; + assert.strictEqual(normalizeFn(input), expected); + }); + test('濁点・半濁点が正しく結合される', () => { + const input = 'か\u3099'; + const expected = 'が'; + assert.strictEqual(normalizeFn(input), expected); + }); + test('小文字に揃う', () => { + // ローマ字にならないようにする + const input = 'tSt'; + const expected = 'tst'; + assert.strictEqual(normalizeFn(input), expected); + }); + test('文字列の前後の空白が削除される', () => { + const input = ' tst '; + const expected = 'tst'; + assert.strictEqual(normalizeFn(input), expected); + }); +}; + +describe('normalize string', () => { + runCommonTests(normalizeString); + + test('異体字の正規化 (ligature)', () => { + const input = 'fi'; + const expected = 'fi'; + assert.strictEqual(normalizeString(input), expected); + }); + + test('半角カタカナは全角に変換される', () => { + const input = 'カタカナ'; + const expected = 'カタカナ'; + assert.strictEqual(normalizeString(input), expected); + }); +}); + +// normalizeStringWithHiraganaのテスト +describe('normalize string with hiragana', () => { + beforeEach(async () => { + await initIntlString(true); + }); + + // 共通テスト + describe('共通のnormalizeStringテスト', () => { + runCommonTests(normalizeStringWithHiragana); + }); + + test('半角カタカナがひらがなに変換される', () => { + const input = 'カタカナ'; + const expected = 'かたかな'; + assert.strictEqual(normalizeStringWithHiragana(input), expected); + }); + + // normalizeStringWithHiragana特有のテスト + test('カタカナがひらがなに変換される・伸ばし棒はハイフンに変換される', () => { + const input = 'カタカナひーらがーな'; + const expected = 'かたかなひ-らが-な'; + assert.strictEqual(normalizeStringWithHiragana(input), expected); + }); + + test('ローマ字がひらがなに変換される', () => { + const input = 'ro-majimohiragananinarimasu'; + const expected = 'ろ-まじもひらがなになります'; + assert.strictEqual(normalizeStringWithHiragana(input), expected); + }); +}); + +describe('compareStringEquals', () => { + beforeEach(async () => { + await initIntlString(true); + }); + + test('完全一致ならtrue', () => { + assert.isTrue(compareStringEquals('テスト', 'テスト')); + }); + + test('大文字・小文字の違いを無視', () => { + assert.isTrue(compareStringEquals('TeSt', 'test')); + }); + + test('全角・半角の違いを無視', () => { + assert.isTrue(compareStringEquals('ABC', 'abc')); + }); + + test('カタカナとひらがなの違いを無視', () => { + assert.isTrue(compareStringEquals('カタカナ', 'かたかな')); + }); + + test('ローマ字をひらがなと比較可能', () => { + assert.isTrue(compareStringEquals('hiragana', 'ひらがな')); + }); + + test('異なる文字列はfalse', () => { + assert.isFalse(compareStringEquals('テスト', 'サンプル')); + }); +}); + +describe('compareStringIncludes', () => { + test('部分一致ならtrue', () => { + assert.isTrue(compareStringIncludes('これはテストです', 'テスト')); + }); + + test('大文字・小文字の違いを無視', () => { + assert.isTrue(compareStringIncludes('This is a Test', 'test')); + }); + + test('全角・半角の違いを無視', () => { + assert.isTrue(compareStringIncludes('ABCDE', 'abc')); + }); + + test('カタカナとひらがなの違いを無視', () => { + assert.isTrue(compareStringIncludes('カタカナのテスト', 'かたかな')); + }); + + test('ローマ字をひらがなと比較可能', () => { + assert.isTrue(compareStringIncludes('これはhiraganaのテスト', 'ひらがな')); + }); + + test('異なる文字列はfalse', () => { + assert.isFalse(compareStringIncludes('これはテストです', 'サンプル')); + }); +}); |