From 96af003e36d96e3516aeb1fb5d21ad01d01edaf2 Mon Sep 17 00:00:00 2001 From: Hongxu Xu Date: Tue, 24 Nov 2020 11:33:31 +0800 Subject: [PATCH] Add functional UI Tests for currency converter Reset currency before tests Fix: input is blocked after switching to currency with less fractional digits --- src/CalcManager/UnitConverter.cpp | 7 +- .../CalculatorApp.cs | 8 ++ .../UnitConverterOperatorsPanel.cs | 2 + .../UnitConverterPage.cs | 39 ++++++ .../CalculatorUITests.ci.runsettings | 2 + .../CalculatorUITests.release.runsettings | 2 + .../CurrencyConverterFunctionalTests.cs | 127 ++++++++++++++++++ 7 files changed, 186 insertions(+), 1 deletion(-) diff --git a/src/CalcManager/UnitConverter.cpp b/src/CalcManager/UnitConverter.cpp index 0cd043f0..3d4b1865 100644 --- a/src/CalcManager/UnitConverter.cpp +++ b/src/CalcManager/UnitConverter.cpp @@ -24,7 +24,7 @@ static constexpr uint32_t OPTIMALDIGITSALLOWED = 7U; static constexpr wchar_t LEFTESCAPECHAR = 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)); unordered_map quoteConversions; @@ -149,6 +149,11 @@ void UnitConverter::SetCurrentUnitTypes(const Unit& fromType, const Unit& toType return; } + if (m_fromType != fromType) + { + m_switchedActive = true; + } + m_fromType = fromType; m_toType = toType; Calculate(); diff --git a/src/CalculatorUITestFramework/CalculatorApp.cs b/src/CalculatorUITestFramework/CalculatorApp.cs index f1495a0c..4112b1e0 100644 --- a/src/CalculatorUITestFramework/CalculatorApp.cs +++ b/src/CalculatorUITestFramework/CalculatorApp.cs @@ -35,6 +35,14 @@ namespace CalculatorUITestFramework AppName.Click(); } + /// + /// Click the window (to lose focus on components) + /// + public static void ClickOnWindow() + { + Window.Click(); + } + /// /// 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 diff --git a/src/CalculatorUITestFramework/UnitConverterOperatorsPanel.cs b/src/CalculatorUITestFramework/UnitConverterOperatorsPanel.cs index f2be9bdc..83d83224 100644 --- a/src/CalculatorUITestFramework/UnitConverterOperatorsPanel.cs +++ b/src/CalculatorUITestFramework/UnitConverterOperatorsPanel.cs @@ -13,5 +13,7 @@ namespace CalculatorUITestFramework public NumberPad NumberPad = new NumberPad(); public WindowsElement ClearButton => this.session.TryFindElementByAccessibilityId("ClearEntryButtonPos0"); public WindowsElement BackSpaceButton => this.session.TryFindElementByAccessibilityId("BackSpaceButtonSmall"); + public WindowsElement Units1 => this.session.TryFindElementByAccessibilityId("Units1"); + public WindowsElement Units2 => this.session.TryFindElementByAccessibilityId("Units2"); } } diff --git a/src/CalculatorUITestFramework/UnitConverterPage.cs b/src/CalculatorUITestFramework/UnitConverterPage.cs index e3984cf9..516cf898 100644 --- a/src/CalculatorUITestFramework/UnitConverterPage.cs +++ b/src/CalculatorUITestFramework/UnitConverterPage.cs @@ -64,5 +64,44 @@ namespace CalculatorUITestFramework } } + /// + /// Ensure Units1 and Units2 are the same + /// + 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(); + } + + /// + /// Select value in Units1 ComboBox + /// + /// Value in ComboBox Units1 + public void SelectUnits1(string value) + { + CalculatorApp.ClickOnWindow(); + UnitConverterOperators.Units1.SendKeys(value); + UnitConverterOperators.Units1.SendKeys(OpenQA.Selenium.Keys.Enter); + CalculatorApp.ClickOnWindow(); + } + + /// + /// Select value in Units2 ComboBox + /// + /// Value in ComboBox Units2 + public void SelectUnits2(string value) + { + CalculatorApp.ClickOnWindow(); + UnitConverterOperators.Units2.SendKeys(value); + UnitConverterOperators.Units2.SendKeys(OpenQA.Selenium.Keys.Enter); + CalculatorApp.ClickOnWindow(); + } } } diff --git a/src/CalculatorUITests/CalculatorUITests.ci.runsettings b/src/CalculatorUITests/CalculatorUITests.ci.runsettings index 8f2810d2..bc6aa51f 100644 --- a/src/CalculatorUITests/CalculatorUITests.ci.runsettings +++ b/src/CalculatorUITests/CalculatorUITests.ci.runsettings @@ -8,5 +8,7 @@ + + diff --git a/src/CalculatorUITests/CalculatorUITests.release.runsettings b/src/CalculatorUITests/CalculatorUITests.release.runsettings index 7ad3d4f7..e13fca63 100644 --- a/src/CalculatorUITests/CalculatorUITests.release.runsettings +++ b/src/CalculatorUITests/CalculatorUITests.release.runsettings @@ -8,5 +8,7 @@ + + diff --git a/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs b/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs index fc8d669e..6e0fd09d 100644 --- a/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs +++ b/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs @@ -12,6 +12,8 @@ namespace CalculatorUITests { private static UnitConverterPage page = new UnitConverterPage(); + public TestContext TestContext { get; set; } + /// /// Initializes the WinAppDriver web driver session. /// @@ -42,6 +44,7 @@ namespace CalculatorUITests CalculatorApp.EnsureCalculatorHasFocus(); page.EnsureCalculatorIsCurrencyMode(); page.EnsureCalculatorResultTextIsZero(); + page.EnsureSameUnitsAreSelected(); } [TestCleanup] @@ -50,6 +53,23 @@ namespace CalculatorUITests 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 /// /// 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 } + /// + /// These automated tests verify the currency has been formatted to 3 fractional digits + /// Via mouse input, all basic UI functionality is checked + /// + [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 + } + + /// + /// These automated tests verify the currency has been formatted to no fractional digit + /// Via mouse input, all basic UI functionality is checked + /// + [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 + } + + /// + /// These automated tests verify the currency format is updated after switching + /// Via mouse input, all basic UI functionality is checked + /// + [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()); + } + + /// + /// 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 + /// + [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 } }