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