| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2012 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 }; | 29 }; |
| 30 | 30 |
| 31 template<class slot_policy = sigslot::single_threaded, | 31 template<class slot_policy = sigslot::single_threaded, |
| 32 class signal_policy = sigslot::single_threaded> | 32 class signal_policy = sigslot::single_threaded> |
| 33 class SigslotReceiver : public sigslot::has_slots<slot_policy> { | 33 class SigslotReceiver : public sigslot::has_slots<slot_policy> { |
| 34 public: | 34 public: |
| 35 SigslotReceiver() : signal_(nullptr), signal_count_(0) {} | 35 SigslotReceiver() : signal_(nullptr), signal_count_(0) {} |
| 36 ~SigslotReceiver() { | 36 ~SigslotReceiver() { |
| 37 } | 37 } |
| 38 | 38 |
| 39 // Provide copy constructor so that tests can exercise the has_slots copy |
| 40 // constructor. |
| 41 SigslotReceiver(const SigslotReceiver&) = default; |
| 42 |
| 39 void Connect(sigslot::signal0<signal_policy>* signal) { | 43 void Connect(sigslot::signal0<signal_policy>* signal) { |
| 40 if (!signal) return; | 44 if (!signal) return; |
| 41 Disconnect(); | 45 Disconnect(); |
| 42 signal_ = signal; | 46 signal_ = signal; |
| 43 signal->connect(this, | 47 signal->connect(this, |
| 44 &SigslotReceiver<slot_policy, signal_policy>::OnSignal); | 48 &SigslotReceiver<slot_policy, signal_policy>::OnSignal); |
| 45 } | 49 } |
| 46 void Disconnect() { | 50 void Disconnect() { |
| 47 if (!signal_) return; | 51 if (!signal_) return; |
| 48 signal_->disconnect(this); | 52 signal_->disconnect(this); |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 215 // Test that locks are acquired and released correctly. | 219 // Test that locks are acquired and released correctly. |
| 216 TEST_F(SigslotMTLockTest, LockSanity) { | 220 TEST_F(SigslotMTLockTest, LockSanity) { |
| 217 const int lock_count = SignalLockCount(); | 221 const int lock_count = SignalLockCount(); |
| 218 Signal(); | 222 Signal(); |
| 219 EXPECT_FALSE(InCriticalSection()); | 223 EXPECT_FALSE(InCriticalSection()); |
| 220 EXPECT_EQ(lock_count + 1, SignalLockCount()); | 224 EXPECT_EQ(lock_count + 1, SignalLockCount()); |
| 221 EXPECT_EQ(1, signal_count()); | 225 EXPECT_EQ(1, signal_count()); |
| 222 } | 226 } |
| 223 | 227 |
| 224 // Destroy signal and slot in different orders. | 228 // Destroy signal and slot in different orders. |
| 225 TEST(DestructionOrder, SignalFirst) { | 229 TEST(SigslotDestructionOrder, SignalFirst) { |
| 226 sigslot::signal0<>* signal = new sigslot::signal0<>; | 230 sigslot::signal0<>* signal = new sigslot::signal0<>; |
| 227 SigslotReceiver<>* receiver = new SigslotReceiver<>(); | 231 SigslotReceiver<>* receiver = new SigslotReceiver<>(); |
| 228 receiver->Connect(signal); | 232 receiver->Connect(signal); |
| 229 (*signal)(); | 233 (*signal)(); |
| 230 EXPECT_EQ(1, receiver->signal_count()); | 234 EXPECT_EQ(1, receiver->signal_count()); |
| 231 delete signal; | 235 delete signal; |
| 232 delete receiver; | 236 delete receiver; |
| 233 } | 237 } |
| 234 | 238 |
| 235 TEST(DestructionOrder, SlotFirst) { | 239 TEST(SigslotDestructionOrder, SlotFirst) { |
| 236 sigslot::signal0<>* signal = new sigslot::signal0<>; | 240 sigslot::signal0<>* signal = new sigslot::signal0<>; |
| 237 SigslotReceiver<>* receiver = new SigslotReceiver<>(); | 241 SigslotReceiver<>* receiver = new SigslotReceiver<>(); |
| 238 receiver->Connect(signal); | 242 receiver->Connect(signal); |
| 239 (*signal)(); | 243 (*signal)(); |
| 240 EXPECT_EQ(1, receiver->signal_count()); | 244 EXPECT_EQ(1, receiver->signal_count()); |
| 241 | 245 |
| 242 delete receiver; | 246 delete receiver; |
| 243 (*signal)(); | 247 (*signal)(); |
| 244 delete signal; | 248 delete signal; |
| 245 } | 249 } |
| 250 |
| 251 // Test that if a signal is copied, its slot connections are copied as well. |
| 252 TEST(SigslotTest, CopyConnectedSignal) { |
| 253 sigslot::signal<> signal; |
| 254 SigslotReceiver<> receiver; |
| 255 receiver.Connect(&signal); |
| 256 |
| 257 // Fire the copied signal, expecting the receiver to be notified. |
| 258 sigslot::signal<> copied_signal(signal); |
| 259 copied_signal(); |
| 260 EXPECT_EQ(1, receiver.signal_count()); |
| 261 } |
| 262 |
| 263 // Test that if a slot is copied, its signal connections are copied as well. |
| 264 TEST(SigslotTest, CopyConnectedSlot) { |
| 265 sigslot::signal<> signal; |
| 266 SigslotReceiver<> receiver; |
| 267 receiver.Connect(&signal); |
| 268 |
| 269 // Fire the signal after copying the receiver, expecting the copied receiver |
| 270 // to be notified. |
| 271 SigslotReceiver<> copied_receiver(receiver); |
| 272 signal(); |
| 273 EXPECT_EQ(1, copied_receiver.signal_count()); |
| 274 } |
| OLD | NEW |