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;
}