Fix copy-pasting result computed by the calculator gives "Invalid input" (#1444)

* Remove exponent value from operand length

* Copy paste test with boundary exponential numbers.
This commit is contained in:
Chaitanya Mehta 2020-12-17 13:15:24 -05:00 committed by GitHub
parent 3172f7fea2
commit 7d8803dd1a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 18 additions and 5 deletions

View File

@ -502,23 +502,32 @@ ULONG32 CopyPasteManager::StandardScientificOperandLength(Platform::String ^ ope
{ {
auto operandWstring = wstring(operand->Data()); auto operandWstring = wstring(operand->Data());
const bool hasDecimal = operandWstring.find('.') != wstring::npos; const bool hasDecimal = operandWstring.find('.') != wstring::npos;
auto length = operandWstring.length();
if (hasDecimal) if (hasDecimal)
{ {
if (operandWstring.length() >= 2) if (length >= 2)
{ {
if ((operandWstring[0] == L'0') && (operandWstring[1] == L'.')) if ((operandWstring[0] == L'0') && (operandWstring[1] == L'.'))
{ {
return static_cast<ULONG32>(operandWstring.length() - 2); length -= 2;
} }
else else
{ {
return static_cast<ULONG32>(operandWstring.length() - 1); length -= 1;
} }
} }
} }
return static_cast<ULONG32>(operandWstring.length()); auto exponentPos = operandWstring.find('e');
const bool hasExponent = exponentPos != wstring::npos;
if (hasExponent)
{
auto expLength = operandWstring.substr(exponentPos).length();
length -= expLength;
}
return static_cast<ULONG32>(length);
} }
ULONG32 CopyPasteManager::ProgrammerOperandLength(Platform::String ^ operand, NumberBase numberBase) ULONG32 CopyPasteManager::ProgrammerOperandLength(Platform::String ^ operand, NumberBase numberBase)

View File

@ -825,9 +825,13 @@ namespace CalculatorUnitTests
L"12^2", L"12^2",
L"-12.12^-2", L"-12.12^-2",
L"61%99" L"61%99"
L"-6.1%99" }; L"-6.1%99",
L"1.1111111111111111111111111111111e+1142" };
String String
^ negativeInput[] = { L"abcdef", L"xyz", L"ABab", L"e+234", L"123456789123456781234567890123456" /*boundary condition: greater than 32 digits*/, ^ negativeInput[] = { L"abcdef", L"xyz", L"ABab", L"e+234", L"123456789123456781234567890123456" /*boundary condition: greater than 32 digits*/,
L"11.1111111111111111111111111111111e+1142",
L"1.1e+10001", /*boundary condition: exponent greater than 5 digits*/
L"0.11111111111111111111111111111111111e+111111" /*boundary condition: both exponent and non exponent exceed limits*/
L"SIN(2)", L"2+2==", L"2=+2" }; L"SIN(2)", L"2+2==", L"2=+2" };
ASSERT_POSITIVE_TESTCASES(ValidateScientificPasteExpression, positiveInput); ASSERT_POSITIVE_TESTCASES(ValidateScientificPasteExpression, positiveInput);