// Copyright (C) 2006 Davis E. King (davisking@users.sourceforge.net) // License: Boost Software License See LICENSE.txt for the full license. #include <sstream> #include <string> #include <cstdlib> #include <ctime> #include <dlib/member_function_pointer.h> #include "tester.h" namespace { using namespace test; using namespace std; using namespace dlib; logger dlog("test.member_function_pointer"); class mfp_test_helper_other { public: mfp_test_helper_other ( ): i(-1) {} mutable int i; void go0 ( ) { i = 0; } void go1 ( int v1 ) { i = 1*v1; } void go2 ( int v1,int v2 ) { i = 2*v1*v2; } void go3 ( int v1,int v2,int v3 ) { i = 3*v1*v2*v3; } void go4 ( int v1,int v2,int v3,int v4 ) { i = 4*v1*v2*v3*v4; } }; class mfp_test_helper { public: mfp_test_helper ( ): i(-1) {} mutable int i; void go0 ( ) { i = 0; } void go1 ( int v1 ) { i = 1*v1; } void go2 ( int v1,int v2 ) { i = 2*v1*v2; } void go3 ( int v1,int v2,int v3 ) { i = 3*v1*v2*v3; } void go4 ( int v1,int v2,int v3,int v4 ) { i = 4*v1*v2*v3*v4; } }; class mfp_test_helper_const { public: mfp_test_helper_const ( ): i(-1) {} mutable int i; void go0 ( ) const { i = 0; } void go1 ( int v1 ) const { i = 1*v1; } void go2 ( int v1,int v2 ) const { i = 2*v1*v2; } void go3 ( int v1,int v2,int v3 ) const { i = 3*v1*v2*v3; } void go4 ( int v1,int v2,int v3,int v4 ) const { i = 4*v1*v2*v3*v4; } }; template < template <typename P1 = void, typename P2 = void, typename P3 = void, typename P4 = void> class mfp, typename test_helper > void member_function_pointer_kernel_test ( ) /*! requires - mfp is an implementation of member_function_pointer/member_function_pointer_kernel_abstract.h ensures - runs tests on mfp for compliance with the specs !*/ { test_helper helper; mfp<> a0, b0; mfp<int> a1, b1; mfp<int,int> a2, b2; mfp<int,int,int> a3, b3; mfp<int,int,int,int> a4, b4; mfpkc<mfp<> > a0c, b0c; mfpkc<mfp<int> > a1c, b1c; mfpkc<mfp<int,int> > a2c, b2c; mfpkc<mfp<int,int,int> > a3c, b3c; mfpkc<mfp<int,int,int,int> > a4c, b4c; DLIB_CASSERT(a0c == b0c, ""); DLIB_CASSERT(a1c == b1c, ""); DLIB_CASSERT(a2c == b2c, ""); DLIB_CASSERT(a3c == b3c, ""); DLIB_CASSERT(a4c == b4c, ""); DLIB_CASSERT((a0c != b0c) == false, ""); DLIB_CASSERT((a1c != b1c) == false, ""); DLIB_CASSERT((a2c != b2c) == false, ""); DLIB_CASSERT((a3c != b3c) == false, ""); DLIB_CASSERT((a4c != b4c) == false, ""); DLIB_CASSERT(a0.is_set() == false,""); DLIB_CASSERT(b0.is_set() == false,""); DLIB_CASSERT(a0c.is_set() == false,""); DLIB_CASSERT(b0c.is_set() == false,""); DLIB_CASSERT(!a0 ,""); DLIB_CASSERT(!b0 ,""); DLIB_CASSERT(!a0c,""); DLIB_CASSERT(!b0c,""); DLIB_CASSERT(a1.is_set() == false,""); DLIB_CASSERT(b1.is_set() == false,""); DLIB_CASSERT(a1c.is_set() == false,""); DLIB_CASSERT(b1c.is_set() == false,""); DLIB_CASSERT(!a1 ,""); DLIB_CASSERT(!b1 ,""); DLIB_CASSERT(!a1c,""); DLIB_CASSERT(!b1c,""); DLIB_CASSERT(a2.is_set() == false,""); DLIB_CASSERT(b2.is_set() == false,""); DLIB_CASSERT(a2c.is_set() == false,""); DLIB_CASSERT(b2c.is_set() == false,""); DLIB_CASSERT(!a2,""); DLIB_CASSERT(!b2,""); DLIB_CASSERT(!a2c,""); DLIB_CASSERT(!b2c,""); DLIB_CASSERT(a3.is_set() == false,""); DLIB_CASSERT(b3.is_set() == false,""); DLIB_CASSERT(a3c.is_set() == false,""); DLIB_CASSERT(b3c.is_set() == false,""); DLIB_CASSERT(!a3,""); DLIB_CASSERT(!b3,""); DLIB_CASSERT(!a3c,""); DLIB_CASSERT(!b3c,""); DLIB_CASSERT(a4.is_set() == false,""); DLIB_CASSERT(b4.is_set() == false,""); DLIB_CASSERT(a4c.is_set() == false,""); DLIB_CASSERT(b4c.is_set() == false,""); DLIB_CASSERT(!a4,""); DLIB_CASSERT(!b4,""); DLIB_CASSERT(!a4c,""); DLIB_CASSERT(!b4c,""); a0.set(helper,&test_helper::go0); a0c.set(helper,&test_helper::go0); DLIB_CASSERT(a0.is_set() == true,""); DLIB_CASSERT(a0c.is_set() == true,""); DLIB_CASSERT(b0.is_set() == false,""); DLIB_CASSERT(b0c.is_set() == false,""); DLIB_CASSERT(a0,""); DLIB_CASSERT(a0c,""); DLIB_CASSERT(!b0,""); DLIB_CASSERT(!b0c,""); a0 = a0; DLIB_CASSERT(a0 == a0, ""); DLIB_CASSERT(!(a0 != a0),""); DLIB_CASSERT(a0.is_set() == true,""); DLIB_CASSERT(a0c.is_set() == true,""); DLIB_CASSERT(b0.is_set() == false,""); DLIB_CASSERT(b0c.is_set() == false,""); DLIB_CASSERT(a0,""); DLIB_CASSERT(a0c,""); DLIB_CASSERT(!b0,""); DLIB_CASSERT(!b0c,""); swap(a0,b0); swap(a0c,b0c); DLIB_CASSERT(a0.is_set() == false,""); DLIB_CASSERT(a0c.is_set() == false,""); DLIB_CASSERT(b0.is_set() == true,""); DLIB_CASSERT(b0c.is_set() == true,""); DLIB_CASSERT(!a0,""); DLIB_CASSERT(!a0c,""); DLIB_CASSERT(b0,""); DLIB_CASSERT(b0c,""); a0 = b0; DLIB_CASSERT(a0 == a0, ""); DLIB_CASSERT(a0 == b0, ""); DLIB_CASSERT(!(a0 != b0),""); DLIB_CASSERT(a0.is_set() == true,""); DLIB_CASSERT(a0c.is_set() == false,""); DLIB_CASSERT(b0.is_set() == true,""); DLIB_CASSERT(b0c.is_set() == true,""); DLIB_CASSERT(a0 ,""); DLIB_CASSERT(!a0c,""); DLIB_CASSERT(b0,""); DLIB_CASSERT(b0c,""); a0.clear(); a0c.clear(); b0.clear(); b0c.clear(); DLIB_CASSERT(a0.is_set() == false,""); DLIB_CASSERT(a0c.is_set() == false,""); DLIB_CASSERT(b0.is_set() == false,""); DLIB_CASSERT(b0c.is_set() == false,""); a1.set(helper,&test_helper::go1); a1c.set(helper,&test_helper::go1); DLIB_CASSERT(a1.is_set() == true,""); DLIB_CASSERT(a1c.is_set() == true,""); DLIB_CASSERT(b1.is_set() == false,""); DLIB_CASSERT(b1c.is_set() == false,""); swap(a1,b1); swap(a1c,b1c); DLIB_CASSERT(a1.is_set() == false,""); DLIB_CASSERT(a1c.is_set() == false,""); DLIB_CASSERT(b1.is_set() == true,""); DLIB_CASSERT(b1c.is_set() == true,""); DLIB_CASSERT(!a1,""); DLIB_CASSERT(!a1c,""); DLIB_CASSERT(b1,""); DLIB_CASSERT(b1c,""); a1 = b1; DLIB_CASSERT(a1 == a1, ""); DLIB_CASSERT(a1 == b1, ""); DLIB_CASSERT(!(a1 != b1),""); DLIB_CASSERT(a1.is_set() == true,""); DLIB_CASSERT(a1c.is_set() == false,""); DLIB_CASSERT(b1.is_set() == true,""); DLIB_CASSERT(b1c.is_set() == true,""); a1.clear(); a1c.clear(); b1.clear(); b1c.clear(); DLIB_CASSERT(a1.is_set() == false,""); DLIB_CASSERT(a1c.is_set() == false,""); DLIB_CASSERT(b1.is_set() == false,""); DLIB_CASSERT(b1c.is_set() == false,""); a2.set(helper,&test_helper::go2); a2c.set(helper,&test_helper::go2); DLIB_CASSERT(a2.is_set() == true,""); DLIB_CASSERT(a2c.is_set() == true,""); DLIB_CASSERT(b2.is_set() == false,""); DLIB_CASSERT(b2c.is_set() == false,""); swap(a2,b2); swap(a2c,b2c); DLIB_CASSERT(a2.is_set() == false,""); DLIB_CASSERT(a2c.is_set() == false,""); DLIB_CASSERT(b2.is_set() == true,""); DLIB_CASSERT(b2c.is_set() == true,""); DLIB_CASSERT(!a2,""); DLIB_CASSERT(!a2c,""); DLIB_CASSERT(b2,""); DLIB_CASSERT(b2c,""); if (b2) { } else { DLIB_CASSERT(false,""); } if (a2c) { DLIB_CASSERT(false,""); } else { DLIB_CASSERT(true,""); } a2 = b2; DLIB_CASSERT(a2 == a2, ""); DLIB_CASSERT(a2 == b2, ""); DLIB_CASSERT(!(a2 != b2),""); DLIB_CASSERT(a2.is_set() == true,""); DLIB_CASSERT(a2c.is_set() == false,""); DLIB_CASSERT(b2.is_set() == true,""); DLIB_CASSERT(b2c.is_set() == true,""); a2.clear(); a2c.clear(); b2.clear(); b2c.clear(); DLIB_CASSERT(a2.is_set() == false,""); DLIB_CASSERT(a2c.is_set() == false,""); DLIB_CASSERT(b2.is_set() == false,""); DLIB_CASSERT(b2c.is_set() == false,""); a3.set(helper,&test_helper::go3); a3c.set(helper,&test_helper::go3); DLIB_CASSERT(a3.is_set() == true,""); DLIB_CASSERT(a3c.is_set() == true,""); DLIB_CASSERT(b3.is_set() == false,""); DLIB_CASSERT(b3c.is_set() == false,""); swap(a3,b3); swap(a3c,b3c); DLIB_CASSERT(a3.is_set() == false,""); DLIB_CASSERT(a3c.is_set() == false,""); DLIB_CASSERT(b3.is_set() == true,""); DLIB_CASSERT(b3c.is_set() == true,""); a3 = b3; DLIB_CASSERT(a3 == a3, ""); DLIB_CASSERT(a3 == b3, ""); DLIB_CASSERT(!(a3 != b3),""); DLIB_CASSERT(a3.is_set() == true,""); DLIB_CASSERT(a3c.is_set() == false,""); DLIB_CASSERT(b3.is_set() == true,""); DLIB_CASSERT(b3c.is_set() == true,""); a3.clear(); a3c.clear(); b3.clear(); b3c.clear(); DLIB_CASSERT(a3.is_set() == false,""); DLIB_CASSERT(a3c.is_set() == false,""); DLIB_CASSERT(b3.is_set() == false,""); DLIB_CASSERT(b3c.is_set() == false,""); a4.set(helper,&test_helper::go4); a4c.set(helper,&test_helper::go4); DLIB_CASSERT(a4.is_set() == true,""); DLIB_CASSERT(a4c.is_set() == true,""); DLIB_CASSERT(b4.is_set() == false,""); DLIB_CASSERT(b4c.is_set() == false,""); swap(a4,b4); swap(a4c,b4c); DLIB_CASSERT(a4.is_set() == false,""); DLIB_CASSERT(a4c.is_set() == false,""); DLIB_CASSERT(b4.is_set() == true,""); DLIB_CASSERT(b4c.is_set() == true,""); a4 = b4; a4 = b4; a4 = b4; a4 = b4; DLIB_CASSERT(a4 == a4, ""); DLIB_CASSERT(a4 == b4, ""); DLIB_CASSERT(!(a4 != b4),""); DLIB_CASSERT(a4.is_set() == true,""); DLIB_CASSERT(a4c.is_set() == false,""); DLIB_CASSERT(b4.is_set() == true,""); DLIB_CASSERT(b4c.is_set() == true,""); a4.clear(); a4c.clear(); b4.clear(); b4c.clear(); DLIB_CASSERT(a4.is_set() == false,""); DLIB_CASSERT(a4c.is_set() == false,""); DLIB_CASSERT(b4.is_set() == false,""); DLIB_CASSERT(b4c.is_set() == false,""); a0.set(helper,&test_helper::go0); a0c.set(helper,&test_helper::go0); b0 = a0; b0c = a0c; helper.i = -1; a0(); DLIB_CASSERT(helper.i == 0,""); helper.i = -1; b0(); DLIB_CASSERT(helper.i == 0,""); helper.i = -1; a0c(); DLIB_CASSERT(helper.i == 0,""); helper.i = -1; b0c(); DLIB_CASSERT(helper.i == 0,""); a1.set(helper,&test_helper::go1); a1c.set(helper,&test_helper::go1); b1 = a1; b1c = a1c; helper.i = -1; a1(1); DLIB_CASSERT(helper.i == 1,""); helper.i = -1; b1(10); DLIB_CASSERT(helper.i == 1*10,""); helper.i = -1; a1c(20); DLIB_CASSERT(helper.i == 1*20,""); helper.i = -1; b1c(30); DLIB_CASSERT(helper.i == 1*30,""); a2.set(helper,&test_helper::go2); a2c.set(helper,&test_helper::go2); b2 = a2; b2c = a2c; helper.i = -1; a2(1,2); DLIB_CASSERT(helper.i == 2*1*2,""); helper.i = -1; b2(3,4); DLIB_CASSERT(helper.i == 2*3*4,""); helper.i = -1; a2c(5,6); DLIB_CASSERT(helper.i == 2*5*6,""); helper.i = -1; b2c(7,8); DLIB_CASSERT(helper.i == 2*7*8,""); a3.set(helper,&test_helper::go3); a3c.set(helper,&test_helper::go3); b3 = a3; b3c = a3c; helper.i = -1; a3(1,2,3); DLIB_CASSERT(helper.i == 3*1*2*3,""); helper.i = -1; b3(4,5,6); DLIB_CASSERT(helper.i == 3*4*5*6,""); helper.i = -1; a3c(7,8,9); DLIB_CASSERT(helper.i == 3*7*8*9,""); helper.i = -1; b3c(1,2,3); DLIB_CASSERT(helper.i == 3*1*2*3,""); a4.set(helper,&test_helper::go4); a4c.set(helper,&test_helper::go4); DLIB_CASSERT(a4 == a4c,""); b4 = a4; b4c = a4c; helper.i = -1; a4(1,2,3,4); DLIB_CASSERT(helper.i == 4*1*2*3*4,""); helper.i = -1; b4(5,6,7,8); DLIB_CASSERT(helper.i == 4*5*6*7*8,""); helper.i = -1; a4c(9,1,2,3); DLIB_CASSERT(helper.i == 4*9*1*2*3,""); helper.i = -1; b4c(4,5,6,7); DLIB_CASSERT(helper.i == 4*4*5*6*7,""); DLIB_CASSERT(a4 == b4,""); DLIB_CASSERT(a4,""); DLIB_CASSERT(a4 == b4,""); a4.clear(); DLIB_CASSERT(a4 != b4,""); DLIB_CASSERT(!a4,""); DLIB_CASSERT(a4 == 0,""); DLIB_CASSERT(a4 == a4,""); a4 = a4; DLIB_CASSERT(a4 != b4,""); DLIB_CASSERT(!a4,""); DLIB_CASSERT(a4 == a4,""); mfp_test_helper_other other; a4.set(other,&mfp_test_helper_other::go4); DLIB_CASSERT(a4 != b4,""); DLIB_CASSERT(a4,""); DLIB_CASSERT(a4 == a4,""); a4.set(helper,&test_helper::go4); DLIB_CASSERT(a4 == b4,""); DLIB_CASSERT(a4,""); DLIB_CASSERT(a4 == a4,""); } class member_function_pointer_tester : public tester { public: member_function_pointer_tester ( ) : tester ("test_member_function_pointer", "Runs tests on the member_function_pointer component.") {} void perform_test ( ) { member_function_pointer_kernel_test<mfpk1,mfp_test_helper>(); member_function_pointer_kernel_test<mfpk1,mfp_test_helper_const>(); } } a; }