Add functional UI Tests for currency converter

Reset currency before tests
Fix: input is blocked after switching to currency with less fractional digits
This commit is contained in:
Hongxu Xu 2020-11-24 11:33:31 +08:00
commit 96af003e36
7 changed files with 186 additions and 1 deletions

View file

@ -24,7 +24,7 @@ static constexpr uint32_t OPTIMALDIGITSALLOWED = 7U;
static constexpr wchar_t LEFTESCAPECHAR = L'{'; static constexpr wchar_t LEFTESCAPECHAR = L'{';
static constexpr wchar_t RIGHTESCAPECHAR = L'}'; static constexpr wchar_t RIGHTESCAPECHAR = L'}';
static const double OPTIMALDECIMALALLOWED = 1e-6; // pow(10, -1 * (OPTIMALDIGITSALLOWED - 1)); static const double OPTIMALDECIMALALLOWED = 1e-6; // pow(10, -1 * (OPTIMALDIGITSALLOWED - 1));
static const double MINIMUMDECIMALALLOWED = 1e-14; // pow(10, -1 * (MAXIMUMDIGITSALLOWED - 1)); static const double MINIMUMDECIMALALLOWED = 1e-14; // pow(10, -1 * (MAXIMUMDIGITSALLOWED - 1));
unordered_map<wchar_t, wstring> quoteConversions; unordered_map<wchar_t, wstring> quoteConversions;
@ -149,6 +149,11 @@ void UnitConverter::SetCurrentUnitTypes(const Unit& fromType, const Unit& toType
return; return;
} }
if (m_fromType != fromType)
{
m_switchedActive = true;
}
m_fromType = fromType; m_fromType = fromType;
m_toType = toType; m_toType = toType;
Calculate(); Calculate();

View file

@ -35,6 +35,14 @@ namespace CalculatorUITestFramework
AppName.Click(); AppName.Click();
} }
/// <summary>
/// Click the window (to lose focus on components)
/// </summary>
public static void ClickOnWindow()
{
Window.Click();
}
/// <summary> /// <summary>
/// If the the Dock Panel for the History and Memory lists is not displayed, resize the window /// If the the Dock Panel for the History and Memory lists is not displayed, resize the window
/// Two attempts are made, the the lable is not found a "not found" exception is thrown /// Two attempts are made, the the lable is not found a "not found" exception is thrown

View file

@ -13,5 +13,7 @@ namespace CalculatorUITestFramework
public NumberPad NumberPad = new NumberPad(); public NumberPad NumberPad = new NumberPad();
public WindowsElement ClearButton => this.session.TryFindElementByAccessibilityId("ClearEntryButtonPos0"); public WindowsElement ClearButton => this.session.TryFindElementByAccessibilityId("ClearEntryButtonPos0");
public WindowsElement BackSpaceButton => this.session.TryFindElementByAccessibilityId("BackSpaceButtonSmall"); public WindowsElement BackSpaceButton => this.session.TryFindElementByAccessibilityId("BackSpaceButtonSmall");
public WindowsElement Units1 => this.session.TryFindElementByAccessibilityId("Units1");
public WindowsElement Units2 => this.session.TryFindElementByAccessibilityId("Units2");
} }
} }

View file

@ -64,5 +64,44 @@ namespace CalculatorUITestFramework
} }
} }
/// <summary>
/// Ensure Units1 and Units2 are the same
/// </summary>
public void EnsureSameUnitsAreSelected()
{
CalculatorApp.ClickOnWindow();
UnitConverterOperators.Units1.SendKeys(OpenQA.Selenium.Keys.Home);
UnitConverterOperators.Units1.SendKeys(OpenQA.Selenium.Keys.Enter);
CalculatorApp.ClickOnWindow();
UnitConverterOperators.Units2.SendKeys(OpenQA.Selenium.Keys.Home);
UnitConverterOperators.Units2.SendKeys(OpenQA.Selenium.Keys.Enter);
CalculatorApp.ClickOnWindow();
}
/// <summary>
/// Select value in Units1 ComboBox
/// </summary>
/// <param name="value">Value in ComboBox Units1</param>
public void SelectUnits1(string value)
{
CalculatorApp.ClickOnWindow();
UnitConverterOperators.Units1.SendKeys(value);
UnitConverterOperators.Units1.SendKeys(OpenQA.Selenium.Keys.Enter);
CalculatorApp.ClickOnWindow();
}
/// <summary>
/// Select value in Units2 ComboBox
/// </summary>
/// <param name="value">Value in ComboBox Units2</param>
public void SelectUnits2(string value)
{
CalculatorApp.ClickOnWindow();
UnitConverterOperators.Units2.SendKeys(value);
UnitConverterOperators.Units2.SendKeys(OpenQA.Selenium.Keys.Enter);
CalculatorApp.ClickOnWindow();
}
} }
} }

View file

@ -8,5 +8,7 @@
</DataCollectionRunSettings> </DataCollectionRunSettings>
<TestRunParameters> <TestRunParameters>
<Parameter Name="AppId" Value="Microsoft.WindowsCalculator.Dev_8wekyb3d8bbwe!App" /> <Parameter Name="AppId" Value="Microsoft.WindowsCalculator.Dev_8wekyb3d8bbwe!App" />
<Parameter Name="CurrencyWith3FractionalDigits" Value="Test Fractional Digits - Test Fractional Digits" />
<Parameter Name="CurrencyWithoutFractionalDigits" Value="Test No Fractional Digits - Test No Fractional Digits" />
</TestRunParameters> </TestRunParameters>
</RunSettings> </RunSettings>

View file

@ -8,5 +8,7 @@
</DataCollectionRunSettings> </DataCollectionRunSettings>
<TestRunParameters> <TestRunParameters>
<Parameter Name="AppId" Value="Microsoft.WindowsCalculator_8wekyb3d8bbwe!App" /> <Parameter Name="AppId" Value="Microsoft.WindowsCalculator_8wekyb3d8bbwe!App" />
<Parameter Name="CurrencyWith3FractionalDigits" Value="Jordan - Dinar" />
<Parameter Name="CurrencyWithoutFractionalDigits" Value="Japan - Yen" />
</TestRunParameters> </TestRunParameters>
</RunSettings> </RunSettings>

View file

@ -12,6 +12,8 @@ namespace CalculatorUITests
{ {
private static UnitConverterPage page = new UnitConverterPage(); private static UnitConverterPage page = new UnitConverterPage();
public TestContext TestContext { get; set; }
/// <summary> /// <summary>
/// Initializes the WinAppDriver web driver session. /// Initializes the WinAppDriver web driver session.
/// </summary> /// </summary>
@ -42,6 +44,7 @@ namespace CalculatorUITests
CalculatorApp.EnsureCalculatorHasFocus(); CalculatorApp.EnsureCalculatorHasFocus();
page.EnsureCalculatorIsCurrencyMode(); page.EnsureCalculatorIsCurrencyMode();
page.EnsureCalculatorResultTextIsZero(); page.EnsureCalculatorResultTextIsZero();
page.EnsureSameUnitsAreSelected();
} }
[TestCleanup] [TestCleanup]
@ -50,6 +53,23 @@ namespace CalculatorUITests
page.ClearAll(); page.ClearAll();
} }
private string NormalizeCurrencyText(string realValue, int fractionDigits)
{
if (!realValue.Contains('.')) return realValue;
var parts = realValue.Split('.');
if (parts[1].Length < fractionDigits)
{
parts[1] += new string('0', fractionDigits - parts[1].Length);
}
else
{
parts[1] = parts[1].Substring(0, fractionDigits);
}
return $"{parts[0]}.{parts[1]}".TrimEnd('.');
}
#region Basic UI Functionality via Mouse Input Tests #region Basic UI Functionality via Mouse Input Tests
/// <summary> /// <summary>
/// These automated tests verify clicking each of the buttons in the Calculator UI and getting an expected result /// These automated tests verify clicking each of the buttons in the Calculator UI and getting an expected result
@ -129,6 +149,113 @@ namespace CalculatorUITests
Assert.AreEqual("0", page.UnitConverterResults.GetCalculationResult2Text()); //verifies Backspace button clicks Assert.AreEqual("0", page.UnitConverterResults.GetCalculationResult2Text()); //verifies Backspace button clicks
} }
/// <summary>
/// These automated tests verify the currency has been formatted to 3 fractional digits
/// Via mouse input, all basic UI functionality is checked
/// </summary>
[TestMethod]
[Priority(1)]
public void MouseInput_SelectCurrencyWith3FractionalDigitsEnterInputAndCheckTheFormat()
{
var currency = (string)TestContext.Properties["CurrencyWith3FractionalDigits"];
var fractionDigits = 3;
//Verifies fraction digits in given currency
page.SelectUnits1(currency);
Assert.AreEqual(currency.Replace(" - ", " "), page.UnitConverterOperators.Units1.Text); // Text is the AccessibleName of Unit
page.UnitConverterOperators.NumberPad.Num2Button.Click();
Assert.AreEqual(NormalizeCurrencyText("2", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies 2 button
page.UnitConverterOperators.NumberPad.DecimalButton.Click();
Assert.AreEqual(NormalizeCurrencyText("2.", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies decimal button
page.UnitConverterOperators.NumberPad.Num4Button.Click();
Assert.AreEqual(NormalizeCurrencyText("2.4", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies 4 button
page.UnitConverterOperators.NumberPad.Num3Button.Click();
Assert.AreEqual(NormalizeCurrencyText("2.43", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies 3 button
page.UnitConverterOperators.NumberPad.Num5Button.Click();
Assert.AreEqual(NormalizeCurrencyText("2.435", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies 5 button
page.UnitConverterOperators.NumberPad.Num6Button.Click();
Assert.AreEqual(NormalizeCurrencyText("2.4356", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies 6 button
}
/// <summary>
/// These automated tests verify the currency has been formatted to no fractional digit
/// Via mouse input, all basic UI functionality is checked
/// </summary>
[TestMethod]
[Priority(1)]
public void MouseInput_SelectCurrencyWithoutFractionalDigitEnterInputAndCheckTheFormat()
{
var currency = (string)TestContext.Properties["CurrencyWithoutFractionalDigits"];
var fractionDigits = 0;
//Verifies fraction digits in given currency
page.SelectUnits1(currency);
Assert.AreEqual(currency.Replace(" - ", " "), page.UnitConverterOperators.Units1.Text); // Text is the AccessibleName of Unit
page.UnitConverterOperators.NumberPad.Num2Button.Click();
Assert.AreEqual(NormalizeCurrencyText("2", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies 2 button
page.UnitConverterOperators.NumberPad.DecimalButton.Click(); // It should be disabled, so no decimal will be displayed
Assert.AreEqual(NormalizeCurrencyText("2", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies decimal button
page.UnitConverterOperators.NumberPad.Num4Button.Click(); // As decimal is disabled, 4 won't be part of fraction digits
Assert.AreEqual(NormalizeCurrencyText("24", fractionDigits), page.UnitConverterResults.GetCalculationResult1Text()); //verifies 4 button
}
/// <summary>
/// These automated tests verify the currency format is updated after switching
/// Via mouse input, all basic UI functionality is checked
/// </summary>
[TestMethod]
[Priority(1)]
public void MouseInput_SwitchCurrencyWithDifferentFractionalDigitsAndCheckTheFormat()
{
var currencyWith3FractionalDigits = (string)TestContext.Properties["CurrencyWith3FractionalDigits"];
var currencyWithoutFractionalDigits = (string)TestContext.Properties["CurrencyWithoutFractionalDigits"];
//Verifies fraction digits in given currency
page.SelectUnits1(currencyWith3FractionalDigits);
page.UnitConverterOperators.NumberPad.Num2Button.Click();
page.UnitConverterOperators.NumberPad.DecimalButton.Click();
page.UnitConverterOperators.NumberPad.Num4Button.Click();
page.UnitConverterOperators.NumberPad.Num3Button.Click();
page.UnitConverterOperators.NumberPad.Num5Button.Click();
Assert.AreEqual("2.435", page.UnitConverterResults.GetCalculationResult1Text());
page.SelectUnits1(currencyWithoutFractionalDigits);
Assert.AreEqual("2", page.UnitConverterResults.GetCalculationResult1Text());
page.SelectUnits1(currencyWith3FractionalDigits);
Assert.AreEqual("2.435", page.UnitConverterResults.GetCalculationResult1Text());
}
/// <summary>
/// These automated tests verify if input is not blocked after swiching to currency with less fractional digits
/// Via mouse input, all basic UI functionality is checked
/// </summary>
[TestMethod]
[Priority(1)]
public void MouseInput_SwitchCurrencyWithLessFractionalDigitsAndEnterInput()
{
var currencyWith3FractionalDigits = (string)TestContext.Properties["CurrencyWith3FractionalDigits"];
var currencyWithoutFractionalDigits = (string)TestContext.Properties["CurrencyWithoutFractionalDigits"];
//Verifies fraction digits in given currency
page.SelectUnits1(currencyWith3FractionalDigits);
page.UnitConverterOperators.NumberPad.Num2Button.Click();
page.UnitConverterOperators.NumberPad.DecimalButton.Click();
page.UnitConverterOperators.NumberPad.Num4Button.Click();
page.UnitConverterOperators.NumberPad.Num3Button.Click();
page.UnitConverterOperators.NumberPad.Num5Button.Click();
Assert.AreEqual("2.435", page.UnitConverterResults.GetCalculationResult1Text());
page.SelectUnits1(currencyWithoutFractionalDigits);
Assert.AreEqual("2", page.UnitConverterResults.GetCalculationResult1Text());
page.UnitConverterOperators.NumberPad.Num4Button.Click(); // Enter new number will replace the previous value
Assert.AreEqual("4", page.UnitConverterResults.GetCalculationResult1Text());
page.SelectUnits1(currencyWith3FractionalDigits);
Assert.AreEqual("4", page.UnitConverterResults.GetCalculationResult1Text());
}
#endregion #endregion
} }
} }