From 8290f6b6008a1aaca11f5fe2e806b733ddb3c9da Mon Sep 17 00:00:00 2001 From: Carsten Jendro <15619117+Machibuse@users.noreply.github.com> Date: Thu, 30 Oct 2025 21:30:45 +0100 Subject: [PATCH] Fix unit fallback handling and expand tests --- Source/Porticle.CLDR.Units.Tests/UnitTests.cs | 32 +++++++++++++++++-- Source/Porticle.CLDR.Units/CldrUnits.cs | 8 ++--- 2 files changed, 34 insertions(+), 6 deletions(-) diff --git a/Source/Porticle.CLDR.Units.Tests/UnitTests.cs b/Source/Porticle.CLDR.Units.Tests/UnitTests.cs index 7a82439..7da2938 100644 --- a/Source/Porticle.CLDR.Units.Tests/UnitTests.cs +++ b/Source/Porticle.CLDR.Units.Tests/UnitTests.cs @@ -1,3 +1,4 @@ +using System.Globalization; using Porticle.CLDR.Units.Serialization; namespace Porticle.CLDR.Units.Tests; @@ -50,7 +51,7 @@ public void TestAll() { foreach (var count in (int[])[0,1,2,3,11,21,111,121]) { - var result = cldrUnits.GetFormatString(lang, count, PluralFormLength.Long, grammaticalCase); + var result = cldrUnits.GetFormatString(lang, count, pluralFormLength, grammaticalCase); Assert.IsNotNull(result); Assert.IsTrue(result.Length > 0); if (count > 2) @@ -63,4 +64,31 @@ public void TestAll() } } } -} \ No newline at end of file + + [TestMethod] + public void FormatUnit_UsesFallbackForShortPatterns() + { + var cldrUnits = new CldrUnits(Unit.AreaBuJp); + var culture = new CultureInfo("de"); + + var formatted = cldrUnits.FormatUnit(culture, 123, PluralFormLength.Short, GrammaticalCase.Oblique); + Assert.AreEqual("123 歩", formatted); + + var formattedWithNumberFormat = cldrUnits.FormatUnit(culture, 123, PluralFormLength.Short, GrammaticalCase.Oblique, "N2"); + Assert.AreEqual("123,00 歩", formattedWithNumberFormat); + } + + [TestMethod] + public void FormatUnit_UsesFallbackForNarrowPatterns() + { + var cldrUnits = new CldrUnits(Unit.AreaBuJp); + var culture = new CultureInfo("de"); + + var formatted = cldrUnits.FormatUnit(culture, 321, PluralFormLength.Narrow, GrammaticalCase.Oblique); + Assert.AreEqual("321歩", formatted); + + var formattedWithNumberFormat = cldrUnits.FormatUnit(culture, 321, PluralFormLength.Narrow, GrammaticalCase.Oblique, "N1"); + Assert.AreEqual("321,0歩", formattedWithNumberFormat); + } +} + diff --git a/Source/Porticle.CLDR.Units/CldrUnits.cs b/Source/Porticle.CLDR.Units/CldrUnits.cs index 155d7ab..ab54b2a 100644 --- a/Source/Porticle.CLDR.Units/CldrUnits.cs +++ b/Source/Porticle.CLDR.Units/CldrUnits.cs @@ -48,7 +48,7 @@ public CldrUnits(Unit unit) /// The format String like "{0} weeks" public string GetFormatString(string language, int count, PluralFormLength length, GrammaticalCase grammaticalCase) { - return _patterns.GetFormat(language, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long); + return _patterns.GetFormat(language, count, length, grammaticalCase) ?? GetFallbackPattern(length); } /// @@ -61,7 +61,7 @@ public string GetFormatString(string language, int count, PluralFormLength lengt /// A format string that matches the specified culture, count, plural form length, and grammatical case. If no specific format string is found, a fallback pattern is returned. public string GetFormatString(CultureInfo culture, int count, PluralFormLength length, GrammaticalCase grammaticalCase) { - return _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long); + return _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(length); } /// @@ -81,10 +81,10 @@ public string FormatUnit(CultureInfo culture, int count, PluralFormLength length { if (numberFormat == null) { - return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long), count); + return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(length), count); } - return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(PluralFormLength.Long), + return string.Format(culture, _patterns.GetFormat(culture.Name, count, length, grammaticalCase) ?? GetFallbackPattern(length), count.ToString(numberFormat, culture)); }