// Copyright (C) 2010 Davis E. King (davis@dlib.net) // License: Boost Software License See LICENSE.txt for the full license. #include "tester.h" #include #include #include namespace { using namespace test; using namespace dlib; using namespace std; dlib::logger dlog("test.is_same_object"); DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_booya_template, void, template booya, (std::string)const); DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_booya2_template, void, template booya2, (int)const); DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_funct_int, void, funct, (int)); DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_funct_double, void, funct, (double)); DLIB_MAKE_HAS_MEMBER_FUNCTION_TEST(has_funct_f, float, funct_f, (int)); class htest { public: template void booya(std::string) const {} template void booya2(EXP) const {} void funct(double) {} }; class htest2 { public: void funct(int) {} float funct_f(int) { return 0;} }; void test_metaprog() { DLIB_TEST(has_booya2_template::value == true); DLIB_TEST(has_booya2_template::value == false); #if _MSC_VER > 1600 // there is a bug in visual studio 2010 and older that prevents this test from working DLIB_TEST(has_booya_template::value == true); #endif DLIB_TEST(has_booya_template::value == false); DLIB_TEST(has_funct_int::value == false); DLIB_TEST(has_funct_int::value == true); DLIB_TEST(has_funct_double::value == true); DLIB_TEST(has_funct_double::value == false); DLIB_TEST(has_funct_f::value == false); DLIB_TEST(has_funct_f::value == true); } class is_same_object_tester : public tester { /*! WHAT THIS OBJECT REPRESENTS This object represents a unit test. When it is constructed it adds itself into the testing framework. !*/ public: is_same_object_tester ( ) : tester ( "test_is_same_object", // the command line argument name for this test "Run tests on the is_same_object function.", // the command line argument description 0 // the number of command line arguments for this test ) { } struct base {}; struct derived : public base {}; template void go(const base& a, const base& b) { DLIB_TEST( is_same_object(a,b) == truth) ; DLIB_TEST( is_same_object(b,a) == truth) ; } template void go2(const base& a, const derived& b) { DLIB_TEST( is_same_object(a,b) == truth) ; DLIB_TEST( is_same_object(b,a) == truth) ; } void perform_test ( ) { print_spinner(); int a, b; double d; DLIB_TEST( is_same_object(a,a) == true) ; DLIB_TEST( is_same_object(a,b) == false) ; DLIB_TEST( is_same_object(d,b) == false) ; DLIB_TEST( is_same_object(d,d) == true) ; base sb; derived sd, sd2; DLIB_TEST( is_same_object(sb,sd) == false) ; DLIB_TEST( is_same_object(sd,sb) == false) ; go(sd, sd); go(sd, sd2); go(sb, sb); go(sd, sb); go2(sd, sd); go2(sd2, sd); go2(sd, sd2); go2(sb, sd); test_metaprog(); } }; // Create an instance of this object. Doing this causes this test // to be automatically inserted into the testing framework whenever this cpp file // is linked into the project. Note that since we are inside an unnamed-namespace // we won't get any linker errors about the symbol a being defined multiple times. is_same_object_tester a; }