1#include "../SignalSlot.h" 2#include "../SignalSlotTrivial.h" 3 4#include <boost/bind.hpp> 5 6#define BOOST_TEST_MAIN 7#ifdef BOOST_TEST_DYN_LINK 8#include <boost/test/unit_test.hpp> 9#else 10#include <boost/test/included/unit_test.hpp> 11#endif 12 13class String 14{ 15 public: 16 String(const char* str) 17 { 18 printf("String ctor this %p\n", this); 19 } 20 21 String(const String& rhs) 22 { 23 printf("String copy ctor this %p, rhs %p\n", this, &rhs); 24 } 25 26 String(String&& rhs) 27 { 28 printf("String move ctor this %p, rhs %p\n", this, &rhs); 29 } 30}; 31 32class Foo : boost::noncopyable 33{ 34 public: 35 void zero(); 36 void zeroc() const; 37 void one(int); 38 void oner(int&); 39 void onec(int) const; 40 void oneString(const String& str); 41 // void oneStringRR(String&& str); 42 static void szero(); 43 static void sone(int); 44 static void soneString(const String& str); 45}; 46 47void Foo::zero() 48{ 49 printf("Foo::zero()\n"); 50} 51 52void Foo::zeroc() const 53{ 54 printf("Foo::zeroc()\n"); 55} 56 57void Foo::szero() 58{ 59 printf("Foo::szero()\n"); 60} 61 62void Foo::one(int x) 63{ 64 printf("Foo::one() x=%d\n", x); 65} 66 67void Foo::onec(int x) const 68{ 69 printf("Foo::onec() x=%d\n", x); 70} 71 72void Foo::sone(int x) 73{ 74 printf("Foo::sone() x=%d\n", x); 75} 76 77void Foo::oneString(const String& str) 78{ 79 printf("Foo::oneString\n"); 80} 81 82void Foo::soneString(const String& str) 83{ 84 printf("Foo::soneString\n"); 85} 86 87BOOST_AUTO_TEST_CASE(testSignalSlotTrivialZero) 88{ 89 SignalTrivial<void()> signal; 90 91 printf("========\n"); 92 signal.call(); 93 94 signal.connect(&Foo::szero); 95 96 printf("========\n"); 97 signal.call(); 98 99 Foo f; 100 signal.connect(boost::bind(&Foo::zero, &f)); 101 102 printf("========\n"); 103 signal.call(); 104 105 signal.connect(boost::bind(&Foo::one, &f, 42)); 106 107 printf("========\n"); 108 signal.call(); 109 110 const Foo cf; 111 signal.connect(boost::bind(&Foo::zeroc, &cf)); 112 113 printf("========\n"); 114 signal.call(); 115 116 signal.connect(boost::bind(&Foo::onec, &cf, 128)); 117 118 printf("========\n"); 119 signal.call(); 120 121 printf("========\n"); 122 signal.call(); 123} 124 125BOOST_AUTO_TEST_CASE(testSignalSlotTrivialOne) 126{ 127 SignalTrivial<void(int)> signal; 128 129 printf("========\n"); 130 signal.call(50); 131 132 signal.connect(&Foo::sone); 133 134 printf("========\n"); 135 signal.call(51); 136 137 Foo f; 138 signal.connect(boost::bind(&Foo::one, &f, _1)); 139 140 printf("========\n"); 141 signal.call(52); 142 143 const Foo cf; 144 signal.connect(boost::bind(&Foo::onec, &cf, _1)); 145 146 printf("========\n"); 147 signal.call(53); 148} 149 150BOOST_AUTO_TEST_CASE(testSignalSlotTrivialString) 151{ 152 SignalTrivial<void(const String&)> signal; 153 signal.call("hello"); 154 155 signal.connect(&Foo::soneString); 156 157 printf("========\n"); 158 signal.call("hello"); 159 160 Foo f; 161 signal.connect(boost::bind(&Foo::oneString, &f, _1)); 162 163 printf("========\n"); 164 signal.call("hello"); 165} 166 167BOOST_AUTO_TEST_CASE(testSignalSlotZero) 168{ 169 muduo::Signal<void()> signal; 170 171 printf("==== testSignalSlotZero ====\n"); 172 signal.call(); 173 174 muduo::Slot s1 = signal.connect(&Foo::szero); 175 176 printf("========\n"); 177 signal.call(); 178 179 Foo f; 180 muduo::Slot s2 = signal.connect(boost::bind(&Foo::zero, &f)); 181 182 printf("========\n"); 183 signal.call(); 184 185 muduo::Slot s3 = signal.connect(boost::bind(&Foo::one, &f, 42)); 186 187 printf("========\n"); 188 signal.call(); 189 190 const Foo cf; 191 muduo::Slot s4 = signal.connect(boost::bind(&Foo::zeroc, &cf)); 192 193 printf("========\n"); 194 signal.call(); 195 196 muduo::Slot s5 = signal.connect(boost::bind(&Foo::onec, &cf, 128)); 197 198 printf("========\n"); 199 signal.call(); 200 201 s1 = muduo::Slot(); 202 printf("========\n"); 203 signal.call(); 204 205 206 s4 = s3 = s2 = muduo::Slot(); 207 printf("========\n"); 208 signal.call(); 209 210} 211 212BOOST_AUTO_TEST_CASE(testSignalSlotOne) 213{ 214 muduo::Signal<void(int)> signal; 215 216 printf("========\n"); 217 signal.call(50); 218 219 muduo::Slot s4; 220 { 221 muduo::Slot s1 = signal.connect(&Foo::sone); 222 223 printf("========\n"); 224 signal.call(51); 225 226 Foo f; 227 muduo::Slot s2 = signal.connect(boost::bind(&Foo::one, &f, _1)); 228 229 printf("========\n"); 230 signal.call(52); 231 232 const Foo cf; 233 muduo::Slot s3 = signal.connect(boost::bind(&Foo::onec, &cf, _1)); 234 235 printf("========\n"); 236 signal.call(53); 237 238 s4 = s3; 239 } 240 241 printf("========\n"); 242 signal.call(54); 243} 244 245BOOST_AUTO_TEST_CASE(testSignalSlotLife) 246{ 247 muduo::Slot s1; 248 249 { 250 muduo::Signal<void()> signal; 251 s1 = signal.connect(&Foo::szero); 252 253 printf("========\n"); 254 signal.call(); 255 256 Foo f; 257 boost::function<void()> func = boost::bind(&Foo::zero, &f); 258 259 s1 = signal.connect(func); 260 261 printf("========\n"); 262 signal.call(); 263 } 264 265} 266 267