From 421a8578e5324f0c6d60f6520e1cc89af3922ffd Mon Sep 17 00:00:00 2001 From: Stefan Markovic <57057282+stefansjfw@users.noreply.github.com> Date: Fri, 26 Jan 2024 15:09:38 +0100 Subject: [PATCH] [PT Run][Calculator] Fix processing large hex numbers (#31135) * [PT Run][Calculator] Fix processing large hex files * Spellcheck * Add tests --- Directory.Packages.props | 2 +- NOTICE.md | 2 +- .../NumberTranslatorTests.cs | 17 +++++++++++++++ .../QueryTests.cs | 21 +++++++++++++++++++ .../NumberTranslator.cs | 20 +++++++++++++++++- 5 files changed, 59 insertions(+), 3 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index aa368025a5..456bd4a7ed 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -23,7 +23,7 @@ - + diff --git a/NOTICE.md b/NOTICE.md index d31209b192..6ff3a5cbd7 100644 --- a/NOTICE.md +++ b/NOTICE.md @@ -1313,7 +1313,7 @@ EXHIBIT A -Mozilla Public License. - hyjiacan.pinyin4net 4.1.1 - Interop.Microsoft.Office.Interop.OneNote 1.1.0.2 - LazyCache 2.4.0 -- Mages 2.0.1 +- Mages 2.0.2 - Markdig.Signed 0.34.0 - Microsoft.CodeAnalysis.NetAnalyzers 8.0.0 - Microsoft.Data.Sqlite 8.0.0 diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs index d51c0dc734..b8f3dad617 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/NumberTranslatorTests.cs @@ -162,5 +162,22 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests Assert.IsNotNull(result); Assert.AreEqual(expectedResult, result); } + + [DataTestMethod] + [DataRow("en-US", "0xF000", "0xF000")] + [DataRow("en-US", "0xf4572220", "4099351072")] + [DataRow("en-US", "0x12345678", "305419896")] + public void Translate_LargeHexadecimalNumbersToDecimal(string sourceCultureName, string input, string expectedResult) + { + // Arrange + var translator = NumberTranslator.Create(new CultureInfo(sourceCultureName, false), new CultureInfo("en-US", false)); + + // Act + var result = translator.Translate(input); + + // Assert + Assert.IsNotNull(result); + Assert.AreEqual(expectedResult, result); + } } } diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/QueryTests.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/QueryTests.cs index 92bc417947..746206d8ed 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/QueryTests.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator.UnitTest/QueryTests.cs @@ -233,5 +233,26 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests Assert.AreEqual(answer.ToString(CultureInfo.CurrentCulture), result); Assert.AreEqual(answer.ToString(CultureInfo.CurrentCulture), resultWithKeyword); } + + [DataTestMethod] + [DataRow("0x1234+0x1234", 9320)] + [DataRow("0x1234-0x1234", 0)] + [DataRow("0x12345678+0x12345678", 610839792)] + [DataRow("0xf4572220-0xf4572410", -496)] + public void RightAnswerForLargeHexadecimalNumbers(string typedString, double answer) + { + // Setup + Mock
main = new(); + Query expectedQuery = new(typedString); + Query expectedQueryWithKeyword = new("=" + typedString, "="); + + // Act + var result = main.Object.Query(expectedQuery).FirstOrDefault()?.Title; + var resultWithKeyword = main.Object.Query(expectedQueryWithKeyword).FirstOrDefault()?.Title; + + // Assert + Assert.AreEqual(answer.ToString(CultureInfo.CurrentCulture), result); + Assert.AreEqual(answer.ToString(CultureInfo.CurrentCulture), resultWithKeyword); + } } } diff --git a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs index ce27a728bc..5de28ba775 100644 --- a/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs +++ b/src/modules/launcher/Plugins/Microsoft.PowerToys.Run.Plugin.Calculator/NumberTranslator.cs @@ -74,7 +74,25 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator { if (hexToken.StartsWith("0x", StringComparison.InvariantCultureIgnoreCase)) { - outputBuilder.Append(hexToken); + // Mages engine has issues processing large hex number (larger than 7 hex digits + 0x prefix = 9 characters). So we convert it to decimal and pass it to the engine. + if (hexToken.Length > 9) + { + try + { + long num = Convert.ToInt64(hexToken, 16); + string numStr = num.ToString(cultureFrom); + outputBuilder.Append(numStr); + } + catch (Exception) + { + outputBuilder.Append(hexToken); + } + } + else + { + outputBuilder.Append(hexToken); + } + continue; }