NumberTranslatorTests.cs
1 // Copyright (c) Microsoft Corporation 2 // The Microsoft Corporation licenses this file to you under the MIT license. 3 // See the LICENSE file in the project root for more information. 4 5 using System; 6 using System.Globalization; 7 using Microsoft.CmdPal.Ext.Calc.Helper; 8 using Microsoft.VisualStudio.TestTools.UnitTesting; 9 10 namespace Microsoft.CmdPal.Ext.Calc.UnitTests; 11 12 [TestClass] 13 public class NumberTranslatorTests 14 { 15 [DataTestMethod] 16 [DataRow(null, "en-US")] 17 [DataRow("de-DE", null)] 18 public void Create_ThrowError_WhenCalledNullOrEmpty(string sourceCultureName, string targetCultureName) 19 { 20 // Arrange 21 CultureInfo sourceCulture = sourceCultureName is not null ? new CultureInfo(sourceCultureName) : null; 22 CultureInfo targetCulture = targetCultureName is not null ? new CultureInfo(targetCultureName) : null; 23 24 // Act 25 Assert.ThrowsException<ArgumentNullException>(() => NumberTranslator.Create(sourceCulture, targetCulture)); 26 } 27 28 [DataTestMethod] 29 [DataRow("en-US", "en-US")] 30 [DataRow("en-EN", "en-US")] 31 [DataRow("de-DE", "en-US")] 32 public void Create_WhenCalled(string sourceCultureName, string targetCultureName) 33 { 34 // Arrange 35 CultureInfo sourceCulture = new CultureInfo(sourceCultureName); 36 CultureInfo targetCulture = new CultureInfo(targetCultureName); 37 38 // Act 39 var translator = NumberTranslator.Create(sourceCulture, targetCulture); 40 41 // Assert 42 Assert.IsNotNull(translator); 43 } 44 45 [DataTestMethod] 46 [DataRow(null)] 47 public void Translate_ThrowError_WhenCalledNull(string input) 48 { 49 // Arrange 50 var translator = NumberTranslator.Create(new CultureInfo("de-DE", false), new CultureInfo("en-US", false)); 51 52 // Act 53 Assert.ThrowsException<ArgumentNullException>(() => translator.Translate(input)); 54 } 55 56 [DataTestMethod] 57 [DataRow("")] 58 [DataRow(" ")] 59 public void Translate_WhenCalledEmpty(string input) 60 { 61 // Arrange 62 var translator = NumberTranslator.Create(new CultureInfo("de-DE", false), new CultureInfo("en-US", false)); 63 64 // Act 65 var result = translator.Translate(input); 66 67 // Assert 68 Assert.AreEqual(input, result); 69 } 70 71 [DataTestMethod] 72 [DataRow("2,0 * 2", "2.0 * 2")] 73 [DataRow("4 * 3,6 + 9", "4 * 3.6 + 9")] 74 [DataRow("5,2+6", "5.2+6")] 75 [DataRow("round(2,5)", "round(2.5)")] 76 [DataRow("3,3333", "3.3333")] 77 [DataRow("max(2;3)", "max(2,3)")] 78 public void Translate_NoErrors_WhenCalled(string input, string expectedResult) 79 { 80 // Arrange 81 var translator = NumberTranslator.Create(new CultureInfo("de-DE", false), new CultureInfo("en-US", false)); 82 83 // Act 84 var result = translator.Translate(input); 85 86 // Assert 87 Assert.IsNotNull(result); 88 Assert.AreEqual(expectedResult, result); 89 } 90 91 [DataTestMethod] 92 [DataRow("2.0 * 2", "2,0 * 2")] 93 [DataRow("4 * 3.6 + 9", "4 * 3,6 + 9")] 94 [DataRow("5.2+6", "5,2+6")] 95 [DataRow("round(2.5)", "round(2,5)")] 96 [DataRow("3.3333", "3,3333")] 97 public void TranslateBack_NoErrors_WhenCalled(string input, string expectedResult) 98 { 99 // Arrange 100 var translator = NumberTranslator.Create(new CultureInfo("de-DE", false), new CultureInfo("en-US", false)); 101 102 // Act 103 var result = translator.TranslateBack(input); 104 105 // Assert 106 Assert.IsNotNull(result); 107 Assert.AreEqual(expectedResult, result); 108 } 109 110 [DataTestMethod] 111 [DataRow(".", ",", "2,000,000", "2000000")] 112 [DataRow(".", ",", "2,000,000.6", "2000000.6")] 113 [DataRow(",", ".", "2.000.000", "2000000")] 114 [DataRow(",", ".", "2.000.000,6", "2000000.6")] 115 public void Translate_RemoveNumberGroupSeparator_WhenCalled(string decimalSeparator, string groupSeparator, string input, string expectedResult) 116 { 117 // Arrange 118 var sourceCulture = new CultureInfo("en-US", false) 119 { 120 NumberFormat = 121 { 122 NumberDecimalSeparator = decimalSeparator, 123 NumberGroupSeparator = groupSeparator, 124 }, 125 }; 126 var translator = NumberTranslator.Create(sourceCulture, new CultureInfo("en-US", false)); 127 128 // Act 129 var result = translator.Translate(input); 130 131 // Assert 132 Assert.IsNotNull(result); 133 Assert.AreEqual(expectedResult, result); 134 } 135 136 [DataTestMethod] 137 [DataRow("de-DE", "12,0004", "12.0004")] 138 [DataRow("de-DE", "0xF000", "61440")] 139 [DataRow("de-DE", "0", "0")] 140 [DataRow("de-DE", "00", "0")] 141 [DataRow("de-DE", "12.004", "12004")] // . is the group separator in de-DE 142 [DataRow("de-DE", "12.04", "1204")] 143 [DataRow("de-DE", "12.4", "124")] 144 [DataRow("de-DE", "3.004.044.444,05", "3004044444.05")] 145 [DataRow("de-DE", "123.01 + 52.30", "12301 + 5230")] 146 [DataRow("de-DE", "123.001 + 52.30", "123001 + 5230")] 147 [DataRow("fr-FR", "0", "0")] 148 [DataRow("fr-FR", "00", "0")] 149 [DataRow("fr-FR", "12.004", "12.004")] // . is not decimal or group separator in fr-FR 150 [DataRow("fr-FR", "12.04", "12.04")] 151 [DataRow("fr-FR", "12.4", "12.4")] 152 [DataRow("fr-FR", "12.0004", "12.0004")] 153 154 // [DataRow("fr-FR", "123.01 + 52.30", "123.01 + 52.30")] 155 // [DataRow("fr-FR", "123.001 + 52.30", "123.001 + 52.30")] passed locally, failed in CI 156 public void Translate_NoRemovalOfLeadingZeroesOnEdgeCases(string sourceCultureName, string input, string expectedResult) 157 { 158 // Arrange 159 var translator = NumberTranslator.Create(new CultureInfo(sourceCultureName, false), new CultureInfo("en-US", false)); 160 161 // Act 162 var result = translator.Translate(input); 163 164 // Assert 165 Assert.IsNotNull(result); 166 Assert.AreEqual(expectedResult, result); 167 } 168 169 [DataTestMethod] 170 [DataRow("en-US", "0xF000", "61440")] 171 [DataRow("en-US", "0xf4572220", "4099351072")] 172 [DataRow("en-US", "0x12345678", "305419896")] 173 public void Translate_LargeHexadecimalNumbersToDecimal(string sourceCultureName, string input, string expectedResult) 174 { 175 // Arrange 176 var translator = NumberTranslator.Create(new CultureInfo(sourceCultureName, false), new CultureInfo("en-US", false)); 177 178 // Act 179 var result = translator.Translate(input); 180 181 // Assert 182 Assert.IsNotNull(result); 183 Assert.AreEqual(expectedResult, result); 184 } 185 }