9ca1bf536bb3d8ffe6c9bbd2c4d7aaac573ed71b
[ardour.git] / libs / pbd / test / signals_test.cc
1 #include "signals_test.h"
2 #include "pbd/signals.h"
3
4 using namespace std;
5
6 CPPUNIT_TEST_SUITE_REGISTRATION (SignalsTest);
7
8 class Emitter {
9 public:
10         void emit () {
11                 Fred ();
12         }
13         
14         PBD::Signal0<void> Fred;
15 };
16
17 static int N = 0;
18
19 void
20 receiver ()
21 {
22         ++N;
23 }
24
25 void
26 SignalsTest::testEmission ()
27 {
28         Emitter* e = new Emitter;
29         PBD::ScopedConnection c;
30         e->Fred.connect_same_thread (c, boost::bind (&receiver));
31
32         N = 0;
33         e->emit ();
34         e->emit ();
35         CPPUNIT_ASSERT_EQUAL (2, N);
36
37         e->Fred.connect_same_thread (c, boost::bind (&receiver));
38         N = 0;
39         e->emit ();
40         CPPUNIT_ASSERT_EQUAL (2, N);
41 }
42
43 void
44 SignalsTest::testDestruction ()
45 {
46         Emitter* e = new Emitter;
47         PBD::ScopedConnection c;
48         e->Fred.connect_same_thread (c, boost::bind (&receiver));
49         e->emit ();
50         delete e;
51         c.disconnect ();
52
53         CPPUNIT_ASSERT (true);
54 }
55
56 class Receiver : public PBD::ScopedConnectionList
57 {
58 public:
59         Receiver (Emitter* e) {
60                 e->Fred.connect_same_thread (*this, boost::bind (&Receiver::receiver, this));
61         }
62
63         void receiver () {
64                 cout << "Receiver::receiver\n";
65                 ++N;
66         }
67 };
68
69 void
70 SignalsTest::testScopedConnectionList ()
71 {
72         Emitter* e = new Emitter;
73         Receiver* r = new Receiver (e);
74
75         N = 0;
76         e->emit ();
77         delete r;
78         e->emit ();
79         
80         CPPUNIT_ASSERT_EQUAL (1, N);
81 }