using System; using System.Collections.Generic; using System.Globalization; using System.Threading; using Developpez.Dotnet.Language.Grammar; using Developpez.Dotnet.Properties; using NUnit.Framework; namespace Developpez.Dotnet.Tests.Language { [TestFixture] public class EnglishNumberSpellerTest { #region Setup/Teardown private CultureInfo _previousCulture; [TestFixtureSetUp] public void Setup() { _previousCulture = Thread.CurrentThread.CurrentCulture; Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US"); } [TestFixtureTearDown] public void Teardown() { Thread.CurrentThread.CurrentCulture = _previousCulture; } #endregion #region Test data private static readonly string[] _unitsAndTens = new string[100] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen", "twenty", "twenty-one", "twenty-two", "twenty-three", "twenty-four", "twenty-five", "twenty-six", "twenty-seven", "twenty-eight", "twenty-nine", "thirty", "thirty-one", "thirty-two", "thirty-three", "thirty-four", "thirty-five", "thirty-six", "thirty-seven", "thirty-eight", "thirty-nine", "forty", "forty-one", "forty-two", "forty-three", "forty-four", "forty-five", "forty-six", "forty-seven", "forty-eight", "forty-nine", "fifty", "fifty-one", "fifty-two", "fifty-three", "fifty-four", "fifty-five", "fifty-six", "fifty-seven", "fifty-eight", "fifty-nine", "sixty", "sixty-one", "sixty-two", "sixty-three", "sixty-four", "sixty-five", "sixty-six", "sixty-seven", "sixty-eight", "sixty-nine", "seventy", "seventy-one", "seventy-two", "seventy-three", "seventy-four", "seventy-five", "seventy-six", "seventy-seven", "seventy-eight", "seventy-nine", "eighty", "eighty-one", "eighty-two", "eighty-three", "eighty-four", "eighty-five", "eighty-six", "eighty-seven", "eighty-eight", "eighty-nine", "ninety", "ninety-one", "ninety-two", "ninety-three", "ninety-four", "ninety-five", "ninety-six", "ninety-seven", "ninety-eight", "ninety-nine", }; private static readonly string[] _unitsAndTensOrdinal = new string[100] { "zero", "first", "second", "third", "fourth", "fifth", "sixth", "seventh", "eighth", "ninth", "tenth", "eleventh", "twelfth", "thirteenth", "fourteenth", "fifteenth", "sixteenth", "seventeenth", "eighteenth", "nineteenth", "twentieth", "twenty-first", "twenty-second", "twenty-third", "twenty-fourth", "twenty-fifth", "twenty-sixth", "twenty-seventh", "twenty-eighth", "twenty-ninth", "thirtieth", "thirty-first", "thirty-second", "thirty-third", "thirty-fourth", "thirty-fifth", "thirty-sixth", "thirty-seventh", "thirty-eighth", "thirty-ninth", "fortieth", "forty-first", "forty-second", "forty-third", "forty-fourth", "forty-fifth", "forty-sixth", "forty-seventh", "forty-eighth", "forty-ninth", "fiftieth", "fifty-first", "fifty-second", "fifty-third", "fifty-fourth", "fifty-fifth", "fifty-sixth", "fifty-seventh", "fifty-eighth", "fifty-ninth", "sixtieth", "sixty-first", "sixty-second", "sixty-third", "sixty-fourth", "sixty-fifth", "sixty-sixth", "sixty-seventh", "sixty-eighth", "sixty-ninth", "seventieth", "seventy-first", "seventy-second", "seventy-third", "seventy-fourth", "seventy-fifth", "seventy-sixth", "seventy-seventh", "seventy-eighth", "seventy-ninth", "eightieth", "eighty-first", "eighty-second", "eighty-third", "eighty-fourth", "eighty-fifth", "eighty-sixth", "eighty-seventh", "eighty-eighth", "eighty-ninth", "ninetieth", "ninety-first", "ninety-second", "ninety-third", "ninety-fourth", "ninety-fifth", "ninety-sixth", "ninety-seventh", "ninety-eighth", "ninety-ninth", }; #endregion [Test] public void SpellMethodWithUnitsAndTens() { for (int number = 0; number < _unitsAndTens.Length; number++) { Assert.AreEqual(_unitsAndTens[number], NumberConverter.Spell(number)); } } [Test] public void SpellMethodWithUnitsAndTensAndMinus() { for (int number = 0; number < _unitsAndTens.Length; number++) { string expected = _unitsAndTens[number]; if (number != 0) expected = "minus " + expected; Assert.AreEqual(expected, NumberConverter.Spell(-number)); } } [Test] public void SpellMethodWithUnitsAndTensAndOrdinal() { try { NumberConverter.Spell(0, Gender.Masculine, NumeralAdjective.Ordinal); } catch (Exception ex) { Assert.IsInstanceOf(ex); Assert.AreEqual(ExceptionMessages.ZeroHasNoOrdinal, ex.Message); } for (int number = 1; number < _unitsAndTens.Length; number++) { Assert.AreEqual(_unitsAndTensOrdinal[number], NumberConverter.Spell(number, Gender.Masculine, NumeralAdjective.Ordinal)); } } [Test] public void SpellMethodWithHundreds() { Dictionary hundredsNumbers = new Dictionary(144); hundredsNumbers.Add(100, "one hundred"); hundredsNumbers.Add(101, "one hundred one"); hundredsNumbers.Add(110, "one hundred ten"); hundredsNumbers.Add(111, "one hundred eleven"); hundredsNumbers.Add(200, "two hundred"); hundredsNumbers.Add(202, "two hundred two"); hundredsNumbers.Add(220, "two hundred twenty"); hundredsNumbers.Add(222, "two hundred twenty-two"); hundredsNumbers.Add(300, "three hundred"); hundredsNumbers.Add(303, "three hundred three"); hundredsNumbers.Add(330, "three hundred thirty"); hundredsNumbers.Add(333, "three hundred thirty-three"); hundredsNumbers.Add(400, "four hundred"); hundredsNumbers.Add(404, "four hundred four"); hundredsNumbers.Add(440, "four hundred forty"); hundredsNumbers.Add(444, "four hundred forty-four"); hundredsNumbers.Add(500, "five hundred"); hundredsNumbers.Add(505, "five hundred five"); hundredsNumbers.Add(550, "five hundred fifty"); hundredsNumbers.Add(555, "five hundred fifty-five"); hundredsNumbers.Add(600, "six hundred"); hundredsNumbers.Add(606, "six hundred six"); hundredsNumbers.Add(660, "six hundred sixty"); hundredsNumbers.Add(666, "six hundred sixty-six"); hundredsNumbers.Add(700, "seven hundred"); hundredsNumbers.Add(707, "seven hundred seven"); hundredsNumbers.Add(770, "seven hundred seventy"); hundredsNumbers.Add(777, "seven hundred seventy-seven"); hundredsNumbers.Add(800, "eight hundred"); hundredsNumbers.Add(808, "eight hundred eight"); hundredsNumbers.Add(880, "eight hundred eighty"); hundredsNumbers.Add(888, "eight hundred eighty-eight"); hundredsNumbers.Add(900, "nine hundred"); hundredsNumbers.Add(909, "nine hundred nine"); hundredsNumbers.Add(990, "nine hundred ninety"); hundredsNumbers.Add(999, "nine hundred ninety-nine"); hundredsNumbers.Add(100000, "one hundred thousand"); hundredsNumbers.Add(101000, "one hundred one thousand"); hundredsNumbers.Add(110000, "one hundred ten thousand"); hundredsNumbers.Add(111000, "one hundred eleven thousand"); hundredsNumbers.Add(200000, "two hundred thousand"); hundredsNumbers.Add(202000, "two hundred two thousand"); hundredsNumbers.Add(220000, "two hundred twenty thousand"); hundredsNumbers.Add(222000, "two hundred twenty-two thousand"); hundredsNumbers.Add(300000, "three hundred thousand"); hundredsNumbers.Add(303000, "three hundred three thousand"); hundredsNumbers.Add(330000, "three hundred thirty thousand"); hundredsNumbers.Add(333000, "three hundred thirty-three thousand"); hundredsNumbers.Add(400000, "four hundred thousand"); hundredsNumbers.Add(404000, "four hundred four thousand"); hundredsNumbers.Add(440000, "four hundred forty thousand"); hundredsNumbers.Add(444000, "four hundred forty-four thousand"); hundredsNumbers.Add(500000, "five hundred thousand"); hundredsNumbers.Add(505000, "five hundred five thousand"); hundredsNumbers.Add(550000, "five hundred fifty thousand"); hundredsNumbers.Add(555000, "five hundred fifty-five thousand"); hundredsNumbers.Add(600000, "six hundred thousand"); hundredsNumbers.Add(606000, "six hundred six thousand"); hundredsNumbers.Add(660000, "six hundred sixty thousand"); hundredsNumbers.Add(666000, "six hundred sixty-six thousand"); hundredsNumbers.Add(700000, "seven hundred thousand"); hundredsNumbers.Add(707000, "seven hundred seven thousand"); hundredsNumbers.Add(770000, "seven hundred seventy thousand"); hundredsNumbers.Add(777000, "seven hundred seventy-seven thousand"); hundredsNumbers.Add(800000, "eight hundred thousand"); hundredsNumbers.Add(808000, "eight hundred eight thousand"); hundredsNumbers.Add(880000, "eight hundred eighty thousand"); hundredsNumbers.Add(888000, "eight hundred eighty-eight thousand"); hundredsNumbers.Add(900000, "nine hundred thousand"); hundredsNumbers.Add(909000, "nine hundred nine thousand"); hundredsNumbers.Add(990000, "nine hundred ninety thousand"); hundredsNumbers.Add(999000, "nine hundred ninety-nine thousand"); hundredsNumbers.Add(100000000, "one hundred million"); hundredsNumbers.Add(101000000, "one hundred one million"); hundredsNumbers.Add(110000000, "one hundred ten million"); hundredsNumbers.Add(111000000, "one hundred eleven million"); hundredsNumbers.Add(200000000, "two hundred million"); hundredsNumbers.Add(202000000, "two hundred two million"); hundredsNumbers.Add(220000000, "two hundred twenty million"); hundredsNumbers.Add(222000000, "two hundred twenty-two million"); hundredsNumbers.Add(300000000, "three hundred million"); hundredsNumbers.Add(303000000, "three hundred three million"); hundredsNumbers.Add(330000000, "three hundred thirty million"); hundredsNumbers.Add(333000000, "three hundred thirty-three million"); hundredsNumbers.Add(400000000, "four hundred million"); hundredsNumbers.Add(404000000, "four hundred four million"); hundredsNumbers.Add(440000000, "four hundred forty million"); hundredsNumbers.Add(444000000, "four hundred forty-four million"); hundredsNumbers.Add(500000000, "five hundred million"); hundredsNumbers.Add(505000000, "five hundred five million"); hundredsNumbers.Add(550000000, "five hundred fifty million"); hundredsNumbers.Add(555000000, "five hundred fifty-five million"); hundredsNumbers.Add(600000000, "six hundred million"); hundredsNumbers.Add(606000000, "six hundred six million"); hundredsNumbers.Add(660000000, "six hundred sixty million"); hundredsNumbers.Add(666000000, "six hundred sixty-six million"); hundredsNumbers.Add(700000000, "seven hundred million"); hundredsNumbers.Add(707000000, "seven hundred seven million"); hundredsNumbers.Add(770000000, "seven hundred seventy million"); hundredsNumbers.Add(777000000, "seven hundred seventy-seven million"); hundredsNumbers.Add(800000000, "eight hundred million"); hundredsNumbers.Add(808000000, "eight hundred eight million"); hundredsNumbers.Add(880000000, "eight hundred eighty million"); hundredsNumbers.Add(888000000, "eight hundred eighty-eight million"); hundredsNumbers.Add(900000000, "nine hundred million"); hundredsNumbers.Add(909000000, "nine hundred nine million"); hundredsNumbers.Add(990000000, "nine hundred ninety million"); hundredsNumbers.Add(999000000, "nine hundred ninety-nine million"); hundredsNumbers.Add(100000000000, "one hundred billion"); hundredsNumbers.Add(101000000000, "one hundred one billion"); hundredsNumbers.Add(110000000000, "one hundred ten billion"); hundredsNumbers.Add(111000000000, "one hundred eleven billion"); hundredsNumbers.Add(200000000000, "two hundred billion"); hundredsNumbers.Add(202000000000, "two hundred two billion"); hundredsNumbers.Add(220000000000, "two hundred twenty billion"); hundredsNumbers.Add(222000000000, "two hundred twenty-two billion"); hundredsNumbers.Add(300000000000, "three hundred billion"); hundredsNumbers.Add(303000000000, "three hundred three billion"); hundredsNumbers.Add(330000000000, "three hundred thirty billion"); hundredsNumbers.Add(333000000000, "three hundred thirty-three billion"); hundredsNumbers.Add(400000000000, "four hundred billion"); hundredsNumbers.Add(404000000000, "four hundred four billion"); hundredsNumbers.Add(440000000000, "four hundred forty billion"); hundredsNumbers.Add(444000000000, "four hundred forty-four billion"); hundredsNumbers.Add(500000000000, "five hundred billion"); hundredsNumbers.Add(505000000000, "five hundred five billion"); hundredsNumbers.Add(550000000000, "five hundred fifty billion"); hundredsNumbers.Add(555000000000, "five hundred fifty-five billion"); hundredsNumbers.Add(600000000000, "six hundred billion"); hundredsNumbers.Add(606000000000, "six hundred six billion"); hundredsNumbers.Add(660000000000, "six hundred sixty billion"); hundredsNumbers.Add(666000000000, "six hundred sixty-six billion"); hundredsNumbers.Add(700000000000, "seven hundred billion"); hundredsNumbers.Add(707000000000, "seven hundred seven billion"); hundredsNumbers.Add(770000000000, "seven hundred seventy billion"); hundredsNumbers.Add(777000000000, "seven hundred seventy-seven billion"); hundredsNumbers.Add(800000000000, "eight hundred billion"); hundredsNumbers.Add(808000000000, "eight hundred eight billion"); hundredsNumbers.Add(880000000000, "eight hundred eighty billion"); hundredsNumbers.Add(888000000000, "eight hundred eighty-eight billion"); hundredsNumbers.Add(900000000000, "nine hundred billion"); hundredsNumbers.Add(909000000000, "nine hundred nine billion"); hundredsNumbers.Add(990000000000, "nine hundred ninety billion"); hundredsNumbers.Add(999000000000, "nine hundred ninety-nine billion"); foreach (long number in hundredsNumbers.Keys) { Assert.AreEqual(hundredsNumbers[number], NumberConverter.Spell(number)); } } [Test] public void SpellMethodWithRoundNumbers() { Dictionary roundNumbers = new Dictionary(20); roundNumbers.Add(1, "one"); roundNumbers.Add(10, "ten"); roundNumbers.Add(100, "one hundred"); roundNumbers.Add(1000, "one thousand"); roundNumbers.Add(10000, "ten thousand"); roundNumbers.Add(100000, "one hundred thousand"); roundNumbers.Add(1000000, "one million"); roundNumbers.Add(10000000, "ten million"); roundNumbers.Add(100000000, "one hundred million"); roundNumbers.Add(1000000000, "one billion"); roundNumbers.Add(10000000000, "ten billion"); roundNumbers.Add(100000000000, "one hundred billion"); roundNumbers.Add(1000000000000, "one trillion"); roundNumbers.Add(10000000000000, "ten trillion"); roundNumbers.Add(100000000000000, "one hundred trillion"); roundNumbers.Add(1000000000000000, "one quadrillion"); roundNumbers.Add(10000000000000000, "ten quadrillion"); roundNumbers.Add(100000000000000000, "one hundred quadrillion"); roundNumbers.Add(1000000000000000000, "one quintillion"); roundNumbers.Add(10000000000000000000, "ten quintillion"); foreach (ulong number in roundNumbers.Keys) { Assert.AreEqual(roundNumbers[number], NumberConverter.Spell(number)); } } [Test] public void SpellMethodWithLongBoundaryValues() { Dictionary borderNumbers = new Dictionary(2); borderNumbers.Add(long.MinValue, "minus nine quintillion two hundred twenty-three quadrillion three hundred seventy-two trillion thirty-six billion eight hundred fifty-four million seven hundred seventy-five thousand eight hundred eight"); borderNumbers.Add(long.MaxValue, "nine quintillion two hundred twenty-three quadrillion three hundred seventy-two trillion thirty-six billion eight hundred fifty-four million seven hundred seventy-five thousand eight hundred seven"); foreach (long number in borderNumbers.Keys) { Assert.AreEqual(borderNumbers[number], NumberConverter.Spell(number)); } } [Test] public void SpellMethodWithULongBoundaryValues() { Dictionary borderNumbers = new Dictionary(2); borderNumbers.Add(ulong.MinValue, "zero"); borderNumbers.Add(ulong.MaxValue, "eighteen quintillion four hundred forty-six quadrillion seven hundred forty-four trillion seventy-three billion seven hundred nine million five hundred fifty-one thousand six hundred fifteen"); foreach (ulong number in borderNumbers.Keys) { Assert.AreEqual(borderNumbers[number], NumberConverter.Spell(number)); } } } }