package com.marvinelsen.chinese.transliteration.api import io.kotest.core.spec.style.ShouldSpec import io.kotest.datatest.withData import io.kotest.matchers.shouldBe class PinyinSyllableTest : ShouldSpec({ context("from pinyin with tone numbers") { withData( nameFn = { "'${it.first}' -> ${it.second}" }, "sheng1" to PinyinSyllable("sheng", Tone.FIRST), "zhi2" to PinyinSyllable("zhi", Tone.SECOND), "ka3" to PinyinSyllable("ka", Tone.THIRD), "yao4" to PinyinSyllable("yao", Tone.FORTH), "me5" to PinyinSyllable("me", Tone.FIFTH), "Me5" to PinyinSyllable("Me", Tone.FIFTH), "nv3" to PinyinSyllable("nv", Tone.THIRD), "nü3" to PinyinSyllable("nü", Tone.THIRD), "nu:3" to PinyinSyllable("nu:", Tone.THIRD), "r5" to PinyinSyllable("r", Tone.FIFTH), "R5" to PinyinSyllable("R", Tone.FIFTH), "er2" to PinyinSyllable("er", Tone.SECOND), "Er2" to PinyinSyllable("Er", Tone.SECOND), ) { (pinyinWithNumber, expectedSyllable) -> PinyinSyllable.fromPinyinWithToneNumber(pinyinWithNumber) shouldBe expectedSyllable } } context("from zhuyin") { withData( nameFn = { "'${it.first}' -> ${it.second}" }, "ㄕㄥ" to PinyinSyllable("sheng", Tone.FIRST), "ㄓˊ" to PinyinSyllable("zhi", Tone.SECOND), "ㄎㄚˇ" to PinyinSyllable("ka", Tone.THIRD), "ㄧㄠˋ" to PinyinSyllable("yao", Tone.FORTH), "ㄇㄜ˙" to PinyinSyllable("me", Tone.FIFTH), "˙ㄇㄜ" to PinyinSyllable("me", Tone.FIFTH), "ㄋㄩˇ" to PinyinSyllable("nü", Tone.THIRD), ) { (zhuyin, expectedSyllable) -> PinyinSyllable.fromZhuyin(zhuyin) shouldBe expectedSyllable } } context("from invalid pinyin with tone numbers") { } context("from invalid zhuyin") { } context("format to zhuyin") { withData( nameFn = { "${it.first.format(TransliterationSystem.PINYIN_WITH_TONE_NUMBERS)} -> ${it.second}" }, PinyinSyllable("sheng", Tone.FIRST) to "ㄕㄥ", PinyinSyllable("zhi", Tone.SECOND) to "ㄓˊ", PinyinSyllable("ka", Tone.THIRD) to "ㄎㄚˇ", PinyinSyllable("yao", Tone.FORTH) to "ㄧㄠˋ", PinyinSyllable("me", Tone.FIFTH) to "˙ㄇㄜ", PinyinSyllable("nü", Tone.THIRD) to "ㄋㄩˇ", PinyinSyllable("nu:", Tone.THIRD) to "ㄋㄩˇ", PinyinSyllable("nv", Tone.THIRD) to "ㄋㄩˇ", PinyinSyllable("r", Tone.FIFTH) to "˙ㄦ", PinyinSyllable("R", Tone.FIFTH) to "˙ㄦ", PinyinSyllable("er", Tone.SECOND) to "ㄦˊ", PinyinSyllable("Er", Tone.SECOND) to "ㄦˊ", ) { (syllable, expectedZhuyin) -> syllable.format(TransliterationSystem.ZHUYIN) shouldBe expectedZhuyin } } context("format to pinyin with tone numbers") { withData( nameFn = { "${it.first.format(TransliterationSystem.PINYIN_WITH_TONE_NUMBERS)} -> ${it.second}" }, PinyinSyllable("sheng", Tone.FIRST) to "sheng1", PinyinSyllable("zhi", Tone.SECOND) to "zhi2", PinyinSyllable("ka", Tone.THIRD) to "ka3", PinyinSyllable("yao", Tone.FORTH) to "yao4", PinyinSyllable("me", Tone.FIFTH) to "me5", PinyinSyllable("nü", Tone.THIRD) to "nü3", PinyinSyllable("nu:", Tone.THIRD) to "nu:3", PinyinSyllable("nv", Tone.THIRD) to "nv3", PinyinSyllable("r", Tone.FIFTH) to "r5", PinyinSyllable("R", Tone.FIFTH) to "R5", PinyinSyllable("er", Tone.SECOND) to "er2", PinyinSyllable("Er", Tone.SECOND) to "Er2", ) { (syllable, expectedPinyinWithToneNumbers) -> syllable.format(TransliterationSystem.PINYIN_WITH_TONE_NUMBERS) shouldBe expectedPinyinWithToneNumbers } } context("format to pinyin with tone marks") { withData( nameFn = { "${it.first.format(TransliterationSystem.PINYIN_WITH_TONE_NUMBERS)} -> ${it.second}" }, PinyinSyllable("sheng", Tone.FIRST) to "shēng", PinyinSyllable("zhi", Tone.SECOND) to "zhí", PinyinSyllable("ka", Tone.THIRD) to "kǎ", PinyinSyllable("yao", Tone.FORTH) to "yào", PinyinSyllable("me", Tone.FIFTH) to "me", PinyinSyllable("zhui", Tone.FIRST) to "zhuī", PinyinSyllable("liu", Tone.FIRST) to "liū", PinyinSyllable("nü", Tone.THIRD) to "nǚ", PinyinSyllable("nu:", Tone.THIRD) to "nǚ", PinyinSyllable("nv", Tone.THIRD) to "nǚ", PinyinSyllable("r", Tone.FIFTH) to "r", PinyinSyllable("er", Tone.SECOND) to "ér", PinyinSyllable("Er", Tone.SECOND) to "Ér", ) { (syllable, expectedPinyinWithToneMarks) -> syllable.format(TransliterationSystem.PINYIN_WITH_TONE_MARKS) shouldBe expectedPinyinWithToneMarks } } context("format to zhuyin with invalid pinyin syllable") { } context("format to pinyin with tone diacritics with invalid pinyin syllable") { } context("format to pinyin with tone numbers with invalid pinyin syllable") { } })