From bdaca389045f5d67ad36b7626f6f7c584bfac0a6 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Mon, 22 Feb 2021 12:52:25 +0100 Subject: [PATCH] Fix transferring unsigned values to the window too In addition to not accepting "-1" as a valid unsigned value, we also must not format unsigned values as signed ones, i.e. we need to use wxNumberFormatter::ToString() overload taking unsigned for them. Do it in wxIntegerValidatorBase::ToString(), used by TransferToWindow(), and add more tests for the latter. Also reorganize the tests in sections and use REQUIRE() for the checks that should prevent the rest of the section from running if they fail. --- src/common/valnum.cpp | 10 ++++++++- tests/validators/valnum.cpp | 45 ++++++++++++++++++++++++++++--------- 2 files changed, 43 insertions(+), 12 deletions(-) diff --git a/src/common/valnum.cpp b/src/common/valnum.cpp index b0735393b0..563701aadb 100644 --- a/src/common/valnum.cpp +++ b/src/common/valnum.cpp @@ -230,7 +230,15 @@ void wxNumValidatorBase::OnKillFocus(wxFocusEvent& event) wxString wxIntegerValidatorBase::ToString(LongestValueType value) const { - return wxNumberFormatter::ToString(value, GetFormatFlags()); + if ( CanBeNegative() ) + { + return wxNumberFormatter::ToString(value, GetFormatFlags()); + } + else + { + ULongestValueType uvalue = static_cast(value); + return wxNumberFormatter::ToString(uvalue, GetFormatFlags()); + } } bool diff --git a/tests/validators/valnum.cpp b/tests/validators/valnum.cpp index 8af177f3c9..b4fb2ae277 100644 --- a/tests/validators/valnum.cpp +++ b/tests/validators/valnum.cpp @@ -99,6 +99,8 @@ TEST_CASE_METHOD(NumValidatorTestCase, "ValNum::TransferUnsigned", "[valnum]") m_text->ChangeValue("4294967295"); // == ULONG_MAX in 32 bits CHECK( valUnsigned.TransferFromWindow() ); CHECK( value == wxUINT32_MAX ); + CHECK( valUnsigned.TransferToWindow() ); + CHECK( m_text->GetValue() == "4294967295" ); m_text->ChangeValue("4294967296"); // == ULONG_MAX + 1 CHECK( !valUnsigned.TransferFromWindow() ); @@ -116,20 +118,41 @@ TEST_CASE_METHOD(NumValidatorTestCase, "ValNum::TransferULL", "[valnum]") wxIntegerValidator valULL(&value); valULL.SetWindow(m_text); - m_text->ChangeValue("9223372036854775807"); // == LLONG_MAX - CHECK( valULL.TransferFromWindow() ); - CHECK( value == static_cast(wxINT64_MAX) ); + SECTION("LLONG_MAX") + { + m_text->ChangeValue("9223372036854775807"); // == LLONG_MAX + REQUIRE( valULL.TransferFromWindow() ); + CHECK( value == static_cast(wxINT64_MAX) ); - m_text->ChangeValue("9223372036854775808"); // == LLONG_MAX + 1 - CHECK( valULL.TransferFromWindow() ); - CHECK( value == static_cast(wxINT64_MAX) + 1 ); + REQUIRE( valULL.TransferToWindow() ); + CHECK( m_text->GetValue() == "9223372036854775807" ); + } - m_text->ChangeValue("18446744073709551615"); // == ULLONG_MAX - CHECK( valULL.TransferFromWindow() ); - CHECK( value == wxUINT64_MAX ); + SECTION("LLONG_MAX+1") + { + m_text->ChangeValue("9223372036854775808"); // == LLONG_MAX + 1 + REQUIRE( valULL.TransferFromWindow() ); + CHECK( value == static_cast(wxINT64_MAX) + 1 ); - m_text->ChangeValue("18446744073709551616"); // == ULLONG_MAX + 1 - CHECK( !valULL.TransferFromWindow() ); + REQUIRE( valULL.TransferToWindow() ); + CHECK( m_text->GetValue() == "9223372036854775808" ); + } + + SECTION("ULLONG_MAX") + { + m_text->ChangeValue("18446744073709551615"); // == ULLONG_MAX + REQUIRE( valULL.TransferFromWindow() ); + CHECK( value == wxUINT64_MAX ); + + REQUIRE( valULL.TransferToWindow() ); + CHECK( m_text->GetValue() == "18446744073709551615" ); + } + + SECTION("ULLONG_MAX+1") + { + m_text->ChangeValue("18446744073709551616"); // == ULLONG_MAX + 1 + CHECK( !valULL.TransferFromWindow() ); + } } TEST_CASE_METHOD(NumValidatorTestCase, "ValNum::TransferFloat", "[valnum]")