Fix libpbd tests.
[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 void
9 SignalsTest::setUp ()
10 {
11         if (!Glib::thread_supported ()) {
12                 Glib::thread_init ();
13         }
14 }
15
16 class Emitter {
17 public:
18         void emit () {
19                 Fred ();
20         }
21         
22         PBD::Signal0<void> Fred;
23 };
24
25 static int N = 0;
26
27 void
28 receiver ()
29 {
30         ++N;
31 }
32
33 void
34 SignalsTest::testEmission ()
35 {
36         Emitter* e = new Emitter;
37         PBD::ScopedConnection c;
38         e->Fred.connect_same_thread (c, boost::bind (&receiver));
39
40         N = 0;
41         e->emit ();
42         e->emit ();
43         CPPUNIT_ASSERT_EQUAL (2, N);
44
45         e->Fred.connect_same_thread (c, boost::bind (&receiver));
46         N = 0;
47         e->emit ();
48         CPPUNIT_ASSERT_EQUAL (2, N);
49 }
50
51 void
52 SignalsTest::testDestruction ()
53 {
54         Emitter* e = new Emitter;
55         PBD::ScopedConnection c;
56         e->Fred.connect_same_thread (c, boost::bind (&receiver));
57         e->emit ();
58         delete e;
59         c.disconnect ();
60
61         CPPUNIT_ASSERT (true);
62 }
63
64 class Receiver : public PBD::ScopedConnectionList
65 {
66 public:
67         Receiver (Emitter* e) {
68                 e->Fred.connect_same_thread (*this, boost::bind (&Receiver::receiver, this));
69         }
70
71         void receiver () {
72                 cout << "Receiver::receiver\n";
73                 ++N;
74         }
75 };
76
77 void
78 SignalsTest::testScopedConnectionList ()
79 {
80         Emitter* e = new Emitter;
81         Receiver* r = new Receiver (e);
82
83         N = 0;
84         e->emit ();
85         delete r;
86         e->emit ();
87         
88         CPPUNIT_ASSERT_EQUAL (1, N);
89 }