[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:
Heiko
2022-08-26 17:40:15 +02:00
committed by GitHub
parent eedea3159c
commit 785160653c
6 changed files with 85 additions and 4 deletions

View File

@@ -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);

View File

@@ -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");
}
}
}