mirror of
https://github.com/microsoft/PowerToys.git
synced 2026-04-07 19:57:07 +02:00
[PT Run][Calculator] Input validation improvements (#20067)
* improve input validation * update test * update tests * simplify test case * fix devision by zero check
This commit is contained in:
@@ -174,6 +174,8 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests
|
||||
[DataRow("abcde", false)]
|
||||
[DataRow("1 + 2 +", false)]
|
||||
[DataRow("1+2*", false)]
|
||||
[DataRow("1+2/", false)]
|
||||
[DataRow("1+2%", false)]
|
||||
[DataRow("1 && 3 &&", false)]
|
||||
[DataRow("sqrt( 36)", true)]
|
||||
[DataRow("max 4", false)]
|
||||
@@ -220,6 +222,8 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests
|
||||
new object[] { "sign(2)", +1M },
|
||||
new object[] { "abs(-2)", 2M },
|
||||
new object[] { "abs(2)", 2M },
|
||||
new object[] { "0+(1*2)/(0+1)", 2M }, // Validate that division by "(0+1)" is not interpret as division by zero.
|
||||
new object[] { "0+(1*2)/0.5", 4M }, // Validate that division by number with decimal digits is not interpret as division by zero.
|
||||
};
|
||||
|
||||
[DataTestMethod]
|
||||
@@ -230,8 +234,8 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests
|
||||
var engine = new CalculateEngine();
|
||||
|
||||
// Act
|
||||
// Using InvariantCulture since this is internal
|
||||
var result = engine.Interpret(input, CultureInfo.InvariantCulture, out _);
|
||||
// Using en-us culture to have a fixed number style
|
||||
var result = engine.Interpret(input, new CultureInfo("en-us"), out _);
|
||||
|
||||
// Assert
|
||||
Assert.IsNotNull(result);
|
||||
|
||||
@@ -22,6 +22,10 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests
|
||||
[DataRow("=2^96", "Result value was either too large or too small for a decimal number")]
|
||||
[DataRow("=+()", "Calculation result is not a valid number (NaN)")]
|
||||
[DataRow("=[10,10]", "Unsupported use of square brackets")]
|
||||
[DataRow("=5/0", "Expression contains division by zero")]
|
||||
[DataRow("=5 / 0", "Expression contains division by zero")]
|
||||
[DataRow("10+(8*9)/0+7", "Expression contains division by zero")]
|
||||
[DataRow("10+(8*9)/0*7", "Expression contains division by zero")]
|
||||
public void ErrorResultOnInvalidKeywordQuery(string typedString, string expectedResult)
|
||||
{
|
||||
// Setup
|
||||
@@ -45,6 +49,10 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests
|
||||
[DataRow("2^96")]
|
||||
[DataRow("+()")]
|
||||
[DataRow("[10,10]")]
|
||||
[DataRow("5/0")]
|
||||
[DataRow("5 / 0")]
|
||||
[DataRow("10+(8*9)/0+7")]
|
||||
[DataRow("10+(8*9)/0*7")]
|
||||
public void NoResultOnInvalidGlobalQuery(string typedString)
|
||||
{
|
||||
// Setup
|
||||
@@ -57,5 +65,53 @@ namespace Microsoft.PowerToys.Run.Plugin.Calculator.UnitTests
|
||||
// Assert
|
||||
Assert.AreEqual(result, 0);
|
||||
}
|
||||
|
||||
[DataTestMethod]
|
||||
[DataRow("9+")]
|
||||
[DataRow("9-")]
|
||||
[DataRow("9*")]
|
||||
[DataRow("9|")]
|
||||
[DataRow("9\\")]
|
||||
[DataRow("9^")]
|
||||
[DataRow("9=")]
|
||||
[DataRow("9&")]
|
||||
[DataRow("9/")]
|
||||
[DataRow("9%")]
|
||||
public void NoResultIfQueryEndsWithBinaryOperator(string typedString)
|
||||
{
|
||||
// Setup
|
||||
Mock<Main> main = new ();
|
||||
Query expectedQuery = new (typedString);
|
||||
Query expectedQueryWithKeyword = new ("=" + typedString, "=");
|
||||
|
||||
// Act
|
||||
var result = main.Object.Query(expectedQuery).Count;
|
||||
var resultWithKeyword = main.Object.Query(expectedQueryWithKeyword).Count;
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(result, 0);
|
||||
Assert.AreEqual(resultWithKeyword, 0);
|
||||
}
|
||||
|
||||
[DataTestMethod]
|
||||
[DataRow("10+(8*9)/0,5")] // German decimal digit separator
|
||||
[DataRow("10+(8*9)/0.5")]
|
||||
[DataRow("10+(8*9)/1,5")] // German decimal digit separator
|
||||
[DataRow("10+(8*9)/1.5")]
|
||||
public void NoErrorForDivisionByNumberWithDecimalDigits(string typedString)
|
||||
{
|
||||
// Setup
|
||||
Mock<Main> main = new ();
|
||||
Query expectedQuery = new (typedString);
|
||||
Query expectedQueryWithKeyword = new ("=" + typedString, "=");
|
||||
|
||||
// Act
|
||||
var result = main.Object.Query(expectedQuery).FirstOrDefault().SubTitle;
|
||||
var resultWithKeyword = main.Object.Query(expectedQueryWithKeyword).FirstOrDefault().SubTitle;
|
||||
|
||||
// Assert
|
||||
Assert.AreEqual(result, "Copy this number to the clipboard");
|
||||
Assert.AreEqual(resultWithKeyword, "Copy this number to the clipboard");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user