using System; using System.Globalization; using Amphora; using Glass.Text; using UnitTestSharp; using static Glass.Text.Plurals; using static Glass.Text.Styles; namespace Glass.UnitTests { public class LocaleBehaviorTests : TestFixture { public static TextPieces Stock(long boxes) { return $"{Count(boxes)} boxes"; } public class VersionTests : TestFixture { public void StartsAtZero() { CheckEqual(0, new LocaleBehavior().Version); } public void EveryAssignmentBumpsIt() { var locale = new LocaleBehavior(); locale.NumberFormat = NumberFormat.Invariant; CheckEqual(1, locale.Version); locale.PluralRules = PluralRules.None; CheckEqual(2, locale.Version); locale.SetCulture(new CultureInfo("de-DE")); CheckEqual(3, locale.Version); } public void ARejectedAssignment_LeavesItAlone() { var locale = new LocaleBehavior(); CheckThrow(typeof(ArgumentNullException)); locale.NumberFormat = null; CheckThrow(typeof(ArgumentNullException)); locale.PluralRules = null; CheckThrow(typeof(ArgumentNullException)); locale.SetCulture(null); CheckEqual(0, locale.Version); } } public class NumberFormatTests : TestFixture { public void IsInvariantUnlessChanged() { CheckTrue(ReferenceEquals(NumberFormat.Invariant, new LocaleBehavior().NumberFormat)); } public void Setting_IsKept() { NumberFormat format = NumberFormat.FromCulture(new CultureInfo("de-DE")); var locale = new LocaleBehavior { NumberFormat = format }; CheckTrue(ReferenceEquals(format, locale.NumberFormat)); } } public class PluralRulesTests : TestFixture { public void AreEnglishUnlessChanged() { CheckTrue(ReferenceEquals(PluralRules.English, new LocaleBehavior().PluralRules)); } public void Setting_IsKept() { var locale = new LocaleBehavior { PluralRules = PluralRules.None }; CheckTrue(ReferenceEquals(PluralRules.None, locale.PluralRules)); } } public class SetCultureTests : TestFixture { public void TakesBothTheNumberFormatAndThePluralRules() { var locale = new LocaleBehavior(); locale.SetCulture(new CultureInfo("de-DE")); CheckEqual(".", locale.NumberFormat.GroupSeparator); CheckEqual("de", locale.PluralRules.Tag); } } public class WriteTests : TestFixture { public void ALine_UsesTheNumberFormat() { var locale = new LocaleBehavior(); locale.SetCulture(new CultureInfo("de-DE")); char[] scratch = null; CheckEqual("1.234 boxes", locale.Write(Stock(1234), ref scratch).ToString()); } public void ALine_ChangesWithTheLocale() { var locale = new LocaleBehavior(); char[] scratch = null; CheckEqual("1,234 boxes", locale.Write(Stock(1234), ref scratch).ToString()); locale.SetCulture(new CultureInfo("de-DE")); CheckEqual("1.234 boxes", locale.Write(Stock(1234), ref scratch).ToString()); } public void ALineWithSpans_FillsTheSpans() { var locale = new LocaleBehavior(); var spans = new DynamicArray(); char[] scratch = null; TextPieces line = $"{Bold(Count(1234))} boxes"; StringView view = locale.Write(line, ref scratch, spans); CheckEqual("1,234 boxes", view.ToString()); CheckEqual(1, spans.Count); CheckEqual(0, spans[0].Start); CheckEqual(5, spans[0].End); } public void APluralLine_ChoosesByTheRules() { var locale = new LocaleBehavior(); char[] scratch = null; PluralLine line = Plural(Count(1), one: $"{Amount} box", other: $"{Amount} boxes"); CheckEqual("1 box", locale.Write(line, ref scratch).ToString()); locale.PluralRules = PluralRules.None; CheckEqual("1 boxes", locale.Write(line, ref scratch).ToString()); } public void APluralLineWithSpans_FillsTheSpans() { var locale = new LocaleBehavior(); var spans = new DynamicArray(); char[] scratch = null; PluralLine line = Plural(Count(1), one: $"{Bold(Amount)} box", other: $"{Bold(Amount)} boxes"); StringView view = locale.Write(line, ref scratch, spans); CheckEqual("1 box", view.ToString()); CheckEqual(1, spans.Count); } } } }