From 68953eb7d8807c51e62fa3b9891a1bd5007b6003 Mon Sep 17 00:00:00 2001 From: Hongxu Xu Date: Thu, 26 Nov 2020 11:19:28 +0800 Subject: [PATCH] Truncate digits in display value after switcing To fix incorrect result after switching currency with less fractional digits --- src/CalcViewModel/UnitConverterViewModel.cpp | 11 +++++ .../CurrencyConverterFunctionalTests.cs | 44 ++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/src/CalcViewModel/UnitConverterViewModel.cpp b/src/CalcViewModel/UnitConverterViewModel.cpp index 2fa989e8..90960eb8 100644 --- a/src/CalcViewModel/UnitConverterViewModel.cpp +++ b/src/CalcViewModel/UnitConverterViewModel.cpp @@ -838,6 +838,15 @@ void UnitConverterViewModel::UpdateInputBlocked(_In_ const wstring& currencyInpu } } +std::wstring TruncateFractionDigits(const std::wstring& n, int digitCount) +{ + auto i = n.find('.'); + if (i == std::wstring::npos) + return n; + size_t actualDigitCount = n.size() - i - 1; + return n.substr(0, n.size() - (actualDigitCount - digitCount)); +} + void UnitConverterViewModel::UpdateCurrencyFormatter() { if (!IsCurrencyCurrentCategory || m_Unit1->Abbreviation->IsEmpty() || m_Unit2->Abbreviation->IsEmpty()) @@ -854,6 +863,8 @@ void UnitConverterViewModel::UpdateCurrencyFormatter() m_currencyFormatter2->ApplyRoundingForCurrency(RoundingAlgorithm::RoundHalfDown); UpdateIsDecimalEnabled(); + + OnPaste(ref new String(TruncateFractionDigits(m_valueFromUnlocalized, CurrencyFormatterFrom->FractionDigits).data())); } void UnitConverterViewModel::UpdateIsDecimalEnabled() diff --git a/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs b/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs index e6d9f720..e102c3c4 100644 --- a/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs +++ b/src/CalculatorUITests/CurrencyConverterFunctionalTests.cs @@ -222,12 +222,13 @@ namespace CalculatorUITests page.SelectUnits1(currencyWithoutFractionalDigits); Assert.AreEqual("2", page.UnitConverterResults.GetCalculationResult1Text()); + // The digits will be truncated forever, even if swiching back page.SelectUnits1(currencyWith3FractionalDigits); - Assert.AreEqual("2.435", page.UnitConverterResults.GetCalculationResult1Text()); + Assert.AreEqual("2", page.UnitConverterResults.GetCalculationResult1Text()); } /// - /// These automated tests verify if input is not blocked after swiching to currency with less fractional digits + /// These automated tests verify input is not blocked after swiching to currency with less fractional digits /// Via mouse input, all basic UI functionality is checked /// [TestMethod] @@ -256,6 +257,45 @@ namespace CalculatorUITests Assert.AreEqual("4", page.UnitConverterResults.GetCalculationResult1Text()); } + /// + /// These automated tests verify the result consists after swiching currency + /// Via mouse input, all basic UI functionality is checked + /// + [TestMethod] + [Priority(0)] + public void MouseInput_SwitchCurrencyWithLessFractionalDigitsAndCheckIfTheResultIsConsistent() + { + var currencyWith3FractionalDigits = (string)TestContext.Properties["CurrencyWith3FractionalDigits"]; + var currencyWithoutFractionalDigits = (string)TestContext.Properties["CurrencyWithoutFractionalDigits"]; + + page.SelectUnits1(currencyWith3FractionalDigits); + page.SelectUnits2(currencyWith3FractionalDigits); + + page.UnitConverterOperators.NumberPad.Num2Button.Click(); + page.UnitConverterOperators.NumberPad.Num0Button.Click(); + page.UnitConverterOperators.NumberPad.Num0Button.Click(); + page.UnitConverterOperators.NumberPad.DecimalButton.Click(); + page.UnitConverterOperators.NumberPad.Num9Button.Click(); + page.UnitConverterOperators.NumberPad.Num9Button.Click(); + page.UnitConverterOperators.NumberPad.Num9Button.Click(); + + Assert.AreEqual("200.999", page.UnitConverterResults.GetCalculationResult1Text()); + Assert.AreEqual("200.999", page.UnitConverterResults.GetCalculationResult2Text()); + + page.SelectUnits1(currencyWithoutFractionalDigits); + Assert.AreEqual("200", page.UnitConverterResults.GetCalculationResult1Text()); + var result = page.UnitConverterResults.GetCalculationResult2Text(); + + page.UnitConverterOperators.ClearButton.Click(); + + page.UnitConverterOperators.NumberPad.Num2Button.Click(); + page.UnitConverterOperators.NumberPad.Num0Button.Click(); + page.UnitConverterOperators.NumberPad.Num0Button.Click(); + + Assert.AreEqual("200", page.UnitConverterResults.GetCalculationResult1Text()); + Assert.AreEqual(result, page.UnitConverterResults.GetCalculationResult2Text()); + } + #endregion } }