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));
}