00001
00008
00009
00010
00011
00012 #include <gtest/gtest.h>
00013 #include "../../include/ecl/utilities/function_objects.hpp"
00014
00019
00020
00021
00022
00023 namespace ecl {
00024 namespace utilities {
00025 namespace tests {
00026
00027 class FunctionObject {
00028 public:
00029 FunctionObject() : result(-1) {}
00030 typedef void result_type;
00031 void operator()() {
00032 result = 0;
00033
00034 }
00035 int result;
00036 };
00037
00038 class MemberFunctions {
00039 public:
00040 void e() {
00041 result = 0;
00042
00043 }
00044 void f(const int &i) {
00045 result = 1;
00046
00047 }
00048 void g() {
00049 result = 2;
00050
00051 }
00052 void h(const int& i) {
00053 result = 3;
00054
00055 }
00056 int result;
00057 };
00058
00059
00060
00061
00062
00063 static int free_result = -1;
00064
00065 void rnf1() {
00066 free_result = 0;
00067
00068 }
00069
00070 int rnf2() {
00071 free_result = 1;
00072
00073 return 3;
00074 }
00075
00076 void ruf1(const int &i) {
00077 free_result = 2;
00078
00079 }
00080
00081 int ruf2(const int &i) {
00082 free_result = 3;
00083
00084 return i;
00085 }
00086
00087 }}}
00088
00089
00090
00091
00092
00093 using namespace ecl;
00094 using namespace ecl::utilities::tests;
00095
00096
00097
00098
00099
00100 TEST(FunctionObjects,freeFunctions) {
00101 NullaryFreeFunction<void> rnfo1(rnf1);
00102 rnfo1();
00103 EXPECT_EQ(0,free_result);
00104
00105 NullaryFreeFunction<int> rnfo2(rnf2);
00106 NullaryFreeFunction<int>::result_type i1 = rnfo2();
00107 EXPECT_EQ(3,i1);
00108
00109 UnaryFreeFunction<const int&,void> rufo1(ruf1);
00110 rufo1(2);
00111 EXPECT_EQ(2,free_result);
00112
00113 UnaryFreeFunction<const int&,int> rufo2(ruf2);
00114 UnaryFreeFunction<int,int>::result_type i2 = rufo2(4);
00115 EXPECT_EQ(4,i2);
00116 }
00117
00118 TEST(FunctionObjects,boundFreeFunctions) {
00119
00120 BoundUnaryFreeFunction<const int&,void> brufo1(ruf1,5);
00121 brufo1();
00122 EXPECT_EQ(2,free_result);
00123 }
00124
00125 TEST(FunctionObjects,memberFunctions) {
00126
00127 MemberFunctions a;
00128 NullaryMemberFunction<MemberFunctions,void> mufo1(&MemberFunctions::e);
00129 mufo1(a);
00130 EXPECT_EQ(0,a.result);
00131
00132 UnaryMemberFunction<MemberFunctions,const int&,void> mbfo1(&MemberFunctions::f);
00133 mbfo1(a,2);
00134 EXPECT_EQ(1,a.result);
00135 }
00136
00137 TEST(FunctionObjects,boundMemberFunctions) {
00138
00139 MemberFunctions a;
00140 BoundNullaryMemberFunction<MemberFunctions,void> bmufo1(&MemberFunctions::e, a);
00141 bmufo1();
00142 EXPECT_EQ(0,a.result);
00143
00144 BoundUnaryMemberFunction<MemberFunctions,const int&,void> bmbfo1(&MemberFunctions::f, a, 3);
00145 bmbfo1();
00146 EXPECT_EQ(1,a.result);
00147 }
00148
00149 TEST(FunctionObjects,wrappers) {
00150
00151 FunctionObject function_object;
00152 NullaryFunctionCopy<FunctionObject> nfcopy(function_object);
00153 nfcopy();
00154
00155
00156
00157 NullaryFunctionReference<FunctionObject> nfref(ref(function_object));
00158 nfref();
00159
00160 }
00161
00162 TEST(FunctionObjects,generators) {
00163
00164 MemberFunctions a;
00165 generateFunctionObject(rnf1)();
00166 EXPECT_EQ(0,free_result);
00167 generateFunctionObject(ruf1)(3);
00168 EXPECT_EQ(2,free_result);
00169 generateFunctionObject(ruf1,3)();
00170 EXPECT_EQ(2,free_result);
00171 generateFunctionObject(&MemberFunctions::e)(a);
00172 EXPECT_EQ(0,a.result);
00173 generateFunctionObject(&MemberFunctions::e, a)();
00174 EXPECT_EQ(0,a.result);
00175 generateFunctionObject(&MemberFunctions::f)(a,1);
00176 EXPECT_EQ(1,a.result);
00177 generateFunctionObject(&MemberFunctions::h)(a,1);
00178 EXPECT_EQ(3,a.result);
00179 generateFunctionObject(&MemberFunctions::h,a,1)();
00180 EXPECT_EQ(3,a.result);
00181 int j = 3;
00182 generateFunctionObject(&MemberFunctions::h,a,j)();
00183 EXPECT_EQ(3,a.result);
00184 }
00185
00186
00187
00188
00189
00190 int main(int argc, char **argv) {
00191 testing::InitGoogleTest(&argc,argv);
00192 return RUN_ALL_TESTS();
00193 }