/ src / modules / cmdpal / Tests / Microsoft.CmdPal.Ext.Calc.UnitTests / NumberTranslatorTests.cs
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  }