// Copyright (C) 2011 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #include #include #include #include #include #include #include "../rand.h" #include "tester.h" namespace { using namespace test; using namespace dlib; using namespace std; logger dlog("test.any_function"); // ---------------------------------------------------------------------------------------- int add ( int a, int b) { return a + b; } string cat ( string a, string b) { return a + b; } // ---------------------------------------------------------------------------------------- void set_vals1( int& a) { a = 1; } void set_vals2( int& a, int& b) { a = 1; b = 2; } void set_vals3( int& a, int& b, int& c) { a = 1; b = 2; c = 3; } void set_vals4( int& a, int& b, int& c, int& d) { a = 1; b = 2; c = 3; d = 4; } void set_vals5( int& a, int& b, int& c, int& d, int& e) { a = 1; b = 2; c = 3; d = 4; e = 5; } void set_vals6( int& a, int& b, int& c, int& d, int& e, int& f) { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; } void set_vals7( int& a, int& b, int& c, int& d, int& e, int& f, int& g) { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; } void set_vals8( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h) { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; } void set_vals9( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h, int& i) { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; i = 9;} void set_vals10( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h, int& i, int& j) { a = 1; b = 2; c = 3; d = 4; e = 5; f = 6; g = 7; h = 8; i = 9; j = 10;} void zero_vals( int& a, int& b, int& c, int& d, int& e, int& f, int& g, int& h, int& i, int& j) { a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; g = 0; h = 0; i = 0; j = 0;} // ---------------------------------------------------------------------------------------- struct test { int operator()() const { return 4; } }; struct test2 { int v; test2() : v(0) {} test2(int val) : v(val) {} int operator()() const { return v; } }; // ---------------------------------------------------------------------------------------- void test_contains_4( const any_function a ) { DLIB_TEST(a.is_empty() == false); DLIB_TEST(a.is_set() == true); DLIB_TEST(a.contains() == true); DLIB_TEST(a.contains() == false); DLIB_TEST(any_cast(a)() == 4); DLIB_TEST(a() == 4); } // ---------------------------------------------------------------------------------------- void run_test() { any_function a, b, c; DLIB_TEST(a.is_empty()); DLIB_TEST(a.is_set()==false); DLIB_TEST(a.contains() == false); DLIB_TEST(a.contains() == false); DLIB_TEST(a.is_empty()); a = b; swap(a,b); a.swap(b); a = test(); test_contains_4(a); bool error = false; try { any_cast(a); } catch (bad_any_cast&) { error = true; } DLIB_TEST(error); swap(a,b); test_contains_4(b); DLIB_TEST(a.is_empty()); a = b; test_contains_4(a); c.get() = test2(10); DLIB_TEST(c.get().v == 10); a = c; DLIB_TEST(a.cast_to().v == 10); a.clear(); DLIB_TEST(a.is_empty()); error = false; try { any_cast(a); } catch (bad_any_cast&) { error = true; } DLIB_TEST(error); } // ---------------------------------------------------------------------------------------- void run_test2() { any_function f = &add; DLIB_TEST(f(1,3) == 4); any_function g(&cat); DLIB_TEST(g("one", "two") == "onetwo"); } // ---------------------------------------------------------------------------------------- void run_test3() { any_function f1; any_function f2; any_function f3; any_function f4; any_function f5; any_function f6; any_function f7; any_function f8; any_function f9; any_function f10; f1 = set_vals1; f2 = set_vals2; f3 = set_vals3; f4 = set_vals4; f5 = set_vals5; f6 = set_vals6; f7 = set_vals7; f8 = set_vals8; f9 = set_vals9; f10 = set_vals10; int a,b,c,d,e,f,g,h,i,j; zero_vals(a,b,c,d,e,f,g,h,i,j); f1(a); DLIB_TEST(a==1); zero_vals(a,b,c,d,e,f,g,h,i,j); f2(a,b); DLIB_TEST(a==1 && b==2); zero_vals(a,b,c,d,e,f,g,h,i,j); f3(a,b,c); DLIB_TEST(a==1 && b==2 && c==3); zero_vals(a,b,c,d,e,f,g,h,i,j); f4(a,b,c,d); DLIB_TEST(a==1 && b==2 && c==3 && d==4); zero_vals(a,b,c,d,e,f,g,h,i,j); f5(a,b,c,d,e); DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5); zero_vals(a,b,c,d,e,f,g,h,i,j); f6(a,b,c,d,e,f); DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6); zero_vals(a,b,c,d,e,f,g,h,i,j); f7(a,b,c,d,e,f,g); DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7); zero_vals(a,b,c,d,e,f,g,h,i,j); f8(a,b,c,d,e,f,g,h); DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7 && h==8); zero_vals(a,b,c,d,e,f,g,h,i,j); f9(a,b,c,d,e,f,g,h,i); DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7 && h==8 && i==9); zero_vals(a,b,c,d,e,f,g,h,i,j); f10(a,b,c,d,e,f,g,h,i,j); DLIB_TEST(a==1 && b==2 && c==3 && d==4 && e==5 && f==6 && g==7 && h==8 && i==9 && j==10); zero_vals(a,b,c,d,e,f,g,h,i,j); } // ---------------------------------------------------------------------------------------- class test_any_function : public tester { public: test_any_function ( ) : tester ("test_any_function", "Runs tests on the any_function component.") {} void perform_test ( ) { print_spinner(); run_test(); print_spinner(); run_test2(); print_spinner(); run_test3(); } } a; }