From f44bf99dfdc1ff7b36954fa8fa9ace18049a165f Mon Sep 17 00:00:00 2001 From: Floris Westerman Date: Wed, 24 Aug 2022 11:50:34 +0200 Subject: [PATCH] [PTRun][Unit]Support for plural units and improve alternative spellings (#19961) * Upgrade UnitsNet package to a version that supports plural * Add support for plurals Fix metre conversion Add and update unit tests --- .../InputInterpreterTests.cs | 10 ++++ .../UnitHandlerTests.cs | 16 +++++-- ....PowerToys.Run.Plugin.UnitConverter.csproj | 2 +- .../InputInterpreter.cs | 13 ++---- .../Main.cs | 2 +- .../UnitConversionResult.cs | 6 +-- .../UnitHandler.cs | 46 +++++++++---------- .../PowerLauncher/PowerLauncher.csproj | 2 +- 8 files changed, 54 insertions(+), 43 deletions(-) diff --git a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/InputInterpreterTests.cs b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/InputInterpreterTests.cs index 92b5c19b1d..360543558f 100644 --- a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/InputInterpreterTests.cs +++ b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/InputInterpreterTests.cs @@ -43,6 +43,16 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter.UnitTest CollectionAssert.AreEqual(expectedResult, input); } + [DataTestMethod] + [DataRow(new string[] { "1", "metre", "in", "metre" }, new object[] { new string[] { "1", "meter", "in", "meter" } })] + [DataRow(new string[] { "1", "centimetre", "in", "kilometre" }, new object[] { new string[] { "1", "centimeter", "in", "kilometer" } })] + [DataRow(new string[] { "1", "metres", "in", "kilometres" }, new object[] { new string[] { "1", "meters", "in", "kilometers" } })] + public void HandlesMetreVsMeterNotation(string[] input, string[] expectedResult) + { + InputInterpreter.MetreToMeter(ref input); + CollectionAssert.AreEqual(expectedResult, input); + } + [DataTestMethod] [DataRow(new string[] { "5", "CeLsIuS", "in", "faHrenheiT" }, new object[] { new string[] { "5", "DegreeCelsius", "in", "DegreeFahrenheit" } })] [DataRow(new string[] { "5", "f", "in", "celsius" }, new object[] { new string[] { "5", "°f", "in", "DegreeCelsius" } })] diff --git a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/UnitHandlerTests.cs b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/UnitHandlerTests.cs index 5b1988cb1c..8f5d1cfc90 100644 --- a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/UnitHandlerTests.cs +++ b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter.UnitTest/UnitHandlerTests.cs @@ -14,7 +14,7 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter.UnitTest public void HandleTemperature() { var convertModel = new ConvertModel(1, "DegreeCelsius", "DegreeFahrenheit"); - double result = UnitHandler.ConvertInput(convertModel, UnitsNet.QuantityType.Temperature); + double result = UnitHandler.ConvertInput(convertModel, UnitsNet.Temperature.Info); Assert.AreEqual(33.79999999999999d, result); } @@ -22,7 +22,7 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter.UnitTest public void HandleLength() { var convertModel = new ConvertModel(1, "meter", "centimeter"); - double result = UnitHandler.ConvertInput(convertModel, UnitsNet.QuantityType.Length); + double result = UnitHandler.ConvertInput(convertModel, UnitsNet.Length.Info); Assert.AreEqual(100, result); } @@ -30,15 +30,23 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter.UnitTest public void HandleNanometerToKilometer() { var convertModel = new ConvertModel(1, "nanometer", "kilometer"); - double result = UnitHandler.ConvertInput(convertModel, UnitsNet.QuantityType.Length); + double result = UnitHandler.ConvertInput(convertModel, UnitsNet.Length.Info); Assert.AreEqual(1E-12, result); } + [TestMethod] + public void HandlePlurals() + { + var convertModel = new ConvertModel(1, "meters", "centimeters"); + double result = UnitHandler.ConvertInput(convertModel, UnitsNet.Length.Info); + Assert.AreEqual(100, result); + } + [TestMethod] public void HandlesByteCapitals() { var convertModel = new ConvertModel(1, "kB", "kb"); - double result = UnitHandler.ConvertInput(convertModel, UnitsNet.QuantityType.Information); + double result = UnitHandler.ConvertInput(convertModel, UnitsNet.Information.Info); Assert.AreEqual(8, result); } diff --git a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Community.PowerToys.Run.Plugin.UnitConverter.csproj b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Community.PowerToys.Run.Plugin.UnitConverter.csproj index 13577f0162..76afbf6b9e 100644 --- a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Community.PowerToys.Run.Plugin.UnitConverter.csproj +++ b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Community.PowerToys.Run.Plugin.UnitConverter.csproj @@ -44,7 +44,7 @@ - + diff --git a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/InputInterpreter.cs b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/InputInterpreter.cs index 537bb99c1a..6e9d621906 100644 --- a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/InputInterpreter.cs +++ b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/InputInterpreter.cs @@ -169,19 +169,12 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter } /// - /// Converts spelling "metre" to "meter" + /// Converts spelling "metre" to "meter", also for centimetre and other variants /// public static void MetreToMeter(ref string[] split) { - if (split[1].ToLowerInvariant() == "metre") - { - split[1] = "meter"; - } - - if (split[3].ToLowerInvariant() == "metre") - { - split[3] = "meter"; - } + split[1] = split[1].Replace("metre", "meter", System.StringComparison.CurrentCultureIgnoreCase); + split[3] = split[3].Replace("metre", "meter", System.StringComparison.CurrentCultureIgnoreCase); } /// diff --git a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Main.cs b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Main.cs index 6d1638d264..aa25ceb994 100644 --- a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Main.cs +++ b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/Main.cs @@ -65,7 +65,7 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter Title = result.ToString(), IcoPath = _icon_path, Score = 300, - SubTitle = string.Format(CultureInfo.CurrentCulture, Properties.Resources.copy_to_clipboard, result.QuantityType), + SubTitle = string.Format(CultureInfo.CurrentCulture, Properties.Resources.copy_to_clipboard, result.QuantityInfo.Name), Action = c => { var ret = false; diff --git a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitConversionResult.cs b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitConversionResult.cs index 9079b27bf2..9c5c94c69e 100644 --- a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitConversionResult.cs +++ b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitConversionResult.cs @@ -14,13 +14,13 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter public string UnitName { get; } - public QuantityType QuantityType { get; } + public QuantityInfo QuantityInfo { get; } - public UnitConversionResult(double convertedValue, string unitName, QuantityType quantityType) + public UnitConversionResult(double convertedValue, string unitName, QuantityInfo quantityInfo) { ConvertedValue = convertedValue; UnitName = unitName; - QuantityType = quantityType; + QuantityInfo = quantityInfo; } public string ToString(System.IFormatProvider provider = null) diff --git a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitHandler.cs b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitHandler.cs index d80790d888..40dfcacb32 100644 --- a/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitHandler.cs +++ b/src/modules/launcher/Plugins/Community.PowerToys.Run.Plugin.UnitConverter/UnitHandler.cs @@ -14,21 +14,21 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter { private static readonly int _roundingFractionalDigits = 4; - private static readonly QuantityType[] _included = new QuantityType[] + private static readonly QuantityInfo[] _included = new QuantityInfo[] { - QuantityType.Acceleration, - QuantityType.Angle, - QuantityType.Area, - QuantityType.Duration, - QuantityType.Energy, - QuantityType.Information, - QuantityType.Length, - QuantityType.Mass, - QuantityType.Power, - QuantityType.Pressure, - QuantityType.Speed, - QuantityType.Temperature, - QuantityType.Volume, + Acceleration.Info, + Angle.Info, + Area.Info, + Duration.Info, + Energy.Info, + Information.Info, + Length.Info, + Mass.Info, + Power.Info, + Pressure.Info, + Speed.Info, + Temperature.Info, + Volume.Info, }; /// @@ -37,7 +37,9 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter /// Corresponding enum or null. private static Enum GetUnitEnum(string unit, QuantityInfo unitInfo) { - UnitInfo first = Array.Find(unitInfo.UnitInfos, info => info.Name.ToLowerInvariant() == unit.ToLowerInvariant()); + UnitInfo first = Array.Find(unitInfo.UnitInfos, info => + unit.ToLowerInvariant() == info.Name.ToLowerInvariant() || unit.ToLowerInvariant() == info.PluralName.ToLowerInvariant()); + if (first != null) { return first.Value; @@ -72,12 +74,10 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter /// Given parsed ConvertModel, computes result. (E.g "1 foot in cm"). /// /// The converted value as a double. - public static double ConvertInput(ConvertModel convertModel, QuantityType quantityType) + public static double ConvertInput(ConvertModel convertModel, QuantityInfo quantityInfo) { - QuantityInfo unitInfo = Quantity.GetInfo(quantityType); - - var fromUnit = GetUnitEnum(convertModel.FromUnit, unitInfo); - var toUnit = GetUnitEnum(convertModel.ToUnit, unitInfo); + var fromUnit = GetUnitEnum(convertModel.FromUnit, quantityInfo); + var toUnit = GetUnitEnum(convertModel.ToUnit, quantityInfo); if (fromUnit != null && toUnit != null) { @@ -94,13 +94,13 @@ namespace Community.PowerToys.Run.Plugin.UnitConverter public static IEnumerable Convert(ConvertModel convertModel) { var results = new List(); - foreach (QuantityType quantityType in _included) + foreach (var quantityInfo in _included) { - double convertedValue = UnitHandler.ConvertInput(convertModel, quantityType); + double convertedValue = UnitHandler.ConvertInput(convertModel, quantityInfo); if (!double.IsNaN(convertedValue)) { - UnitConversionResult result = new UnitConversionResult(Round(convertedValue), convertModel.ToUnit, quantityType); + UnitConversionResult result = new UnitConversionResult(Round(convertedValue), convertModel.ToUnit, quantityInfo); results.Add(result); } } diff --git a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj index 0b2df74728..1246204178 100644 --- a/src/modules/launcher/PowerLauncher/PowerLauncher.csproj +++ b/src/modules/launcher/PowerLauncher/PowerLauncher.csproj @@ -90,7 +90,7 @@ - +