import { render } from '@testing-library/react' import { describe, expect, it } from 'vitest' import LocalisedText from '@/components/LocalisedText' describe ('LocalisedText', () => { it.each ([ ['ネコ チャペ', ['ネコ', 'チャペ']], ['ネコ、チャペ', ['ネコ、', 'チャペ']], ['著作者人格権、商標権、肖像権、パブリシティー権', ['著作者人格権、', '商標権、', '肖像権、', 'パブリシティー権']], ['ネコ、チャペ。', ['ネコ、', 'チャペ。']], ['ネコ、「チャペ」。', ['ネコ、', '「チャペ」。']], ['ネコ,、」チャペ', ['ネコ,、」', 'チャペ']]]) ( 'adds word boundaries without changing %s', (text, words) => { const { container } = render ({text}) const wrapper = container.firstElementChild! expect (wrapper).toHaveAttribute ('lang', 'ain-Kana') expect (wrapper.textContent).toBe (text) expect (Array.from (wrapper.querySelectorAll ('.ainu-ui-word'), node => node.textContent)) .toEqual (words) expect (wrapper.querySelectorAll ('wbr')).toHaveLength (words.length - 1) }) it ('preserves Japanese fallback and links and code inside an Ainu paragraph', () => { const { container } = render ( 日本語、本文 ネコ チャペ ネコ チャペ ネコ チャペ ) expect (container.querySelector ('[lang="ja"] .ainu-ui-word')).toBeNull () expect (container.querySelector ('a .ainu-ui-word')).toBeNull () expect (container.querySelector ('code .ainu-ui-word')).toBeNull () expect (container.querySelectorAll ('strong .ainu-ui-word')).toHaveLength (2) }) it ('does not apply Ainu word splitting to Japanese text', () => { const { container } = render ( ネコ、チャペ。) expect (container.firstElementChild).toHaveAttribute ('lang', 'ja') expect (container.querySelector ('.ainu-ui-word')).toBeNull () expect (container.textContent).toBe ('ネコ、チャペ。') }) })