From 227b5dba0a3760886d2cfd5c715679e70fa94c55 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 20 Nov 2021 21:52:59 +0100 Subject: [PATCH 1/4] Get rid of CppUnit boilerplate in wxSize unit test No real changes. --- tests/geometry/size.cpp | 63 +++++++++++++---------------------------- 1 file changed, 19 insertions(+), 44 deletions(-) diff --git a/tests/geometry/size.cpp b/tests/geometry/size.cpp index fb102da679..d29b4b19b9 100644 --- a/tests/geometry/size.cpp +++ b/tests/geometry/size.cpp @@ -17,65 +17,40 @@ #include "wx/gdicmn.h" #endif // WX_PRECOMP -// ---------------------------------------------------------------------------- -// test class -// ---------------------------------------------------------------------------- - -class SizeTestCase : public CppUnit::TestCase -{ -public: - SizeTestCase() { } - -private: - CPPUNIT_TEST_SUITE( SizeTestCase ); - CPPUNIT_TEST( Operators ); - CPPUNIT_TEST_SUITE_END(); - - void Operators(); - - wxDECLARE_NO_COPY_CLASS(SizeTestCase); -}; - -// register in the unnamed registry so that these tests are run by default -CPPUNIT_TEST_SUITE_REGISTRATION( SizeTestCase ); - -// also include in its own registry so that these tests can be run alone -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( SizeTestCase, "SizeTestCase" ); - -void SizeTestCase::Operators() +TEST_CASE("wxSize::Operators", "[size]") { wxSize s1(1,2); wxSize s2(3,4); wxSize s3; s3 = s1 + s2; - CPPUNIT_ASSERT( s3.GetWidth()==4 ); - CPPUNIT_ASSERT( s3.GetHeight()==6 ); + CHECK( s3.GetWidth()==4 ); + CHECK( s3.GetHeight()==6 ); s3 = s2 - s1; - CPPUNIT_ASSERT( s3.GetWidth()==2 ); - CPPUNIT_ASSERT( s3.GetHeight()==2 ); + CHECK( s3.GetWidth()==2 ); + CHECK( s3.GetHeight()==2 ); s3 = s1 * 2; - CPPUNIT_ASSERT( s3.GetWidth()==2 ); - CPPUNIT_ASSERT( s3.GetHeight()==4 ); + CHECK( s3.GetWidth()==2 ); + CHECK( s3.GetHeight()==4 ); s3 = 2 * s1; - CPPUNIT_ASSERT( s3.GetWidth()==2 ); - CPPUNIT_ASSERT( s3.GetHeight()==4 ); + CHECK( s3.GetWidth()==2 ); + CHECK( s3.GetHeight()==4 ); s3 = s3 / 2; - CPPUNIT_ASSERT( s3.GetWidth()==1 ); - CPPUNIT_ASSERT( s3.GetHeight()==2 ); + CHECK( s3.GetWidth()==1 ); + CHECK( s3.GetHeight()==2 ); s3 = s2; - CPPUNIT_ASSERT( s3 != s1 ); + CHECK( s3 != s1 ); s3 = s1; - CPPUNIT_ASSERT( s3 == s1 ); + CHECK( s3 == s1 ); s3 += s2; - CPPUNIT_ASSERT( s3.GetWidth()==4 ); - CPPUNIT_ASSERT( s3.GetHeight()==6 ); + CHECK( s3.GetWidth()==4 ); + CHECK( s3.GetHeight()==6 ); s3 -= s2; - CPPUNIT_ASSERT( s3 == s1 ); + CHECK( s3 == s1 ); s3 *= 2; - CPPUNIT_ASSERT( s3.GetWidth()==2 ); - CPPUNIT_ASSERT( s3.GetHeight()==4 ); + CHECK( s3.GetWidth()==2 ); + CHECK( s3.GetHeight()==4 ); s3 /= 2; - CPPUNIT_ASSERT( s3 == s1 ); + CHECK( s3 == s1 ); } From a18e00379ee313ccbead341ab02307aa888de138 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 20 Nov 2021 21:57:35 +0100 Subject: [PATCH 2/4] Get rid of CppUnit boilerplate in wxPoint and wxRealPoint tests Similar to the previous commit, this doesn't really change anything, but simplifies things. --- tests/geometry/point.cpp | 91 ++++++++++------------------------------ 1 file changed, 22 insertions(+), 69 deletions(-) diff --git a/tests/geometry/point.cpp b/tests/geometry/point.cpp index 30ca4181c0..aaf2867bd2 100644 --- a/tests/geometry/point.cpp +++ b/tests/geometry/point.cpp @@ -19,49 +19,7 @@ #include "wx/math.h" -// ---------------------------------------------------------------------------- -// test class -// ---------------------------------------------------------------------------- - -class PointTestCase : public CppUnit::TestCase -{ -public: - PointTestCase() { } - -private: - CPPUNIT_TEST_SUITE( PointTestCase ); - CPPUNIT_TEST( Operators ); - CPPUNIT_TEST_SUITE_END(); - - void Operators(); - - wxDECLARE_NO_COPY_CLASS(PointTestCase); -}; - -class RealPointTestCase : public CppUnit::TestCase -{ -public: - RealPointTestCase() { } - -private: - CPPUNIT_TEST_SUITE( RealPointTestCase ); - CPPUNIT_TEST( Operators ); - CPPUNIT_TEST_SUITE_END(); - - void Operators(); - - wxDECLARE_NO_COPY_CLASS(RealPointTestCase); -}; - -// register in the unnamed registry so that these tests are run by default -CPPUNIT_TEST_SUITE_REGISTRATION( PointTestCase ); -CPPUNIT_TEST_SUITE_REGISTRATION( RealPointTestCase ); - -// also include in its own registry so that these tests can be run alone -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( PointTestCase, "PointTestCase" ); -CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( RealPointTestCase, "RealPointTestCase" ); - -void PointTestCase::Operators() +TEST_CASE("wxPoint::Operators", "[point]") { wxPoint p1(1,2); wxPoint p2(6,3); @@ -69,48 +27,43 @@ void PointTestCase::Operators() wxPoint p4(5,1); wxPoint p5 = p2 + p1; wxPoint p6 = p2 - p1; - CPPUNIT_ASSERT( p3.x == p5.x ); - CPPUNIT_ASSERT( p3.y == p5.y ); - CPPUNIT_ASSERT( p4.x == p6.x ); - CPPUNIT_ASSERT( p4.y == p6.y ); - CPPUNIT_ASSERT( p3 == p5 ); - CPPUNIT_ASSERT( p4 == p6 ); - CPPUNIT_ASSERT( p3 != p4 ); + CHECK( p3.x == p5.x ); + CHECK( p3.y == p5.y ); + CHECK( p4.x == p6.x ); + CHECK( p4.y == p6.y ); + CHECK( p3 == p5 ); + CHECK( p4 == p6 ); + CHECK( p3 != p4 ); p5 = p2; p5 += p1; p6 = p2; p6 -= p1; - CPPUNIT_ASSERT( p3 == p5 ); - CPPUNIT_ASSERT( p4 == p6 ); + CHECK( p3 == p5 ); + CHECK( p4 == p6 ); wxSize s(p1.x,p1.y); p5 = p2; p5 = p2 + s; p6 = p2; p6 = p2 - s; - CPPUNIT_ASSERT( p3 == p5 ); - CPPUNIT_ASSERT( p4 == p6 ); + CHECK( p3 == p5 ); + CHECK( p4 == p6 ); p5 = p2; p5 = s + p2; p6 = p2; p6 = s - p2; - CPPUNIT_ASSERT( p3 == p5 ); - CPPUNIT_ASSERT( p4 == -p6 ); + CHECK( p3 == p5 ); + CHECK( p4 == -p6 ); p5 = p2; p5 += s; p6 = p2; p6 -= s; - CPPUNIT_ASSERT( p3 == p5 ); - CPPUNIT_ASSERT( p4 == p6 ); + CHECK( p3 == p5 ); + CHECK( p4 == p6 ); } -void RealPointTestCase::Operators() +TEST_CASE("wxRealPoint::Operators", "[point]") { - const double EPSILON = 0.00001; wxRealPoint p1(1.2,3.4); wxRealPoint p2(8.7,5.4); wxRealPoint p3(9.9,8.8); wxRealPoint p4(7.5,2.0); wxRealPoint p5 = p2 + p1; wxRealPoint p6 = p2 - p1; - /* - CPPUNIT_ASSERT( p3 == p5 ); - CPPUNIT_ASSERT( p4 == p6 ); - CPPUNIT_ASSERT( p3 != p4 ); - */ - CPPUNIT_ASSERT( fabs( p3.x - p5.x ) < EPSILON ); - CPPUNIT_ASSERT( fabs( p3.y - p5.y ) < EPSILON ); - CPPUNIT_ASSERT( fabs( p4.x - p6.x ) < EPSILON ); - CPPUNIT_ASSERT( fabs( p4.y - p6.y ) < EPSILON ); + CHECK( p3.x == Approx(p5.x) ); + CHECK( p3.y == Approx(p5.y) ); + CHECK( p4.x == Approx(p6.x) ); + CHECK( p4.y == Approx(p6.y) ); + CHECK( p3.x != Approx(p4.x) ); } From 9941531efcf20477bbd4ccf6f82bf9a377b8171e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 20 Nov 2021 22:01:31 +0100 Subject: [PATCH 3/4] Simplify wxSize unit test further by comparing wxSizes directly This is shorter and more clear than comparing width and height independently and results in just as informative messages in case of test failure if asserthelper.h is included. --- tests/geometry/size.cpp | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/tests/geometry/size.cpp b/tests/geometry/size.cpp index d29b4b19b9..a84514bb2c 100644 --- a/tests/geometry/size.cpp +++ b/tests/geometry/size.cpp @@ -17,6 +17,8 @@ #include "wx/gdicmn.h" #endif // WX_PRECOMP +#include "asserthelper.h" + TEST_CASE("wxSize::Operators", "[size]") { wxSize s1(1,2); @@ -24,33 +26,26 @@ TEST_CASE("wxSize::Operators", "[size]") wxSize s3; s3 = s1 + s2; - CHECK( s3.GetWidth()==4 ); - CHECK( s3.GetHeight()==6 ); + CHECK( s3 == wxSize(4, 6) ); s3 = s2 - s1; - CHECK( s3.GetWidth()==2 ); - CHECK( s3.GetHeight()==2 ); + CHECK( s3 == wxSize(2, 2) ); s3 = s1 * 2; - CHECK( s3.GetWidth()==2 ); - CHECK( s3.GetHeight()==4 ); + CHECK( s3 == wxSize(2, 4) ); s3 = 2 * s1; - CHECK( s3.GetWidth()==2 ); - CHECK( s3.GetHeight()==4 ); + CHECK( s3 == wxSize(2, 4) ); s3 = s3 / 2; - CHECK( s3.GetWidth()==1 ); - CHECK( s3.GetHeight()==2 ); + CHECK( s3 == wxSize(1, 2) ); s3 = s2; CHECK( s3 != s1 ); s3 = s1; CHECK( s3 == s1 ); s3 += s2; - CHECK( s3.GetWidth()==4 ); - CHECK( s3.GetHeight()==6 ); + CHECK( s3 == wxSize(4, 6) ); s3 -= s2; CHECK( s3 == s1 ); s3 *= 2; - CHECK( s3.GetWidth()==2 ); - CHECK( s3.GetHeight()==4 ); + CHECK( s3 == wxSize(2, 4) ); s3 /= 2; CHECK( s3 == s1 ); } From 2bbe126dcae477ae30432b49397c616143d57751 Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Sat, 20 Nov 2021 22:06:28 +0100 Subject: [PATCH 4/4] Add operator/(wxSize, double) For some reason, while both operator*(wxSize, double) and wxSize::operator/=(double) existed, this one did not, which was unexpected, so add it too. --- include/wx/gdicmn.h | 5 +++++ interface/wx/gdicmn.h | 12 ++++++++++++ tests/geometry/size.cpp | 2 ++ 3 files changed, 19 insertions(+) diff --git a/include/wx/gdicmn.h b/include/wx/gdicmn.h index 6a0ad01e88..2f5f8ee99f 100644 --- a/include/wx/gdicmn.h +++ b/include/wx/gdicmn.h @@ -435,6 +435,11 @@ inline wxSize operator*(unsigned long i, const wxSize& s) return wxSize(int(s.x * i), int(s.y * i)); } +inline wxSize operator/(const wxSize& s, double i) +{ + return wxSize(wxRound(s.x / i), wxRound(s.y / i)); +} + inline wxSize operator*(const wxSize& s, double i) { return wxSize(wxRound(s.x * i), wxRound(s.y * i)); diff --git a/interface/wx/gdicmn.h b/interface/wx/gdicmn.h index bccaa6888f..d3932fcf20 100644 --- a/interface/wx/gdicmn.h +++ b/interface/wx/gdicmn.h @@ -1064,12 +1064,19 @@ public: /** @name Miscellaneous operators + Sizes can be added to or subtracted from each other or divided or + multiplied by a number. + Note that these operators are documented as class members (to make them easier to find) but, as their prototype shows, they are implemented as global operators; note that this is transparent to the user but it helps to understand why the following functions are documented to take the wxSize they operate on as an explicit argument. + + Also note that using @c double factor may result in rounding errors, + as wxSize always stores @c int coordinates and the result is always + rounded. */ //@{ wxSize& operator=(const wxSize& sz); @@ -1083,10 +1090,15 @@ public: wxSize& operator -=(const wxSize& sz); wxSize operator /(const wxSize& sz, int factor); + wxSize operator /(const wxSize& sz, double factor); wxSize operator *(const wxSize& sz, int factor); + wxSize operator *(const wxSize& sz, double factor); wxSize operator *(int factor, const wxSize& sz); + wxSize operator *(double factor, const wxSize& sz); wxSize& operator /=(int factor); + wxSize& operator /=(double factor); wxSize& operator *=(int factor); + wxSize& operator *=(double factor); //@} }; diff --git a/tests/geometry/size.cpp b/tests/geometry/size.cpp index a84514bb2c..15ede6e524 100644 --- a/tests/geometry/size.cpp +++ b/tests/geometry/size.cpp @@ -48,4 +48,6 @@ TEST_CASE("wxSize::Operators", "[size]") CHECK( s3 == wxSize(2, 4) ); s3 /= 2; CHECK( s3 == s1 ); + + CHECK( wxSize(6, 9) / 1.5 == wxSize(4, 6) ); }