finalize PROGRAM_NAME change for ardour3
[ardour.git] / libs / audiographer / tests / threader_test.cc
1 #include "utils.h"
2 #include "audiographer/threader.h"
3
4 using namespace AudioGrapher;
5
6 class ThreaderTest : public CppUnit::TestFixture
7 {
8   CPPUNIT_TEST_SUITE (ThreaderTest);
9   CPPUNIT_TEST (testProcess);
10   CPPUNIT_TEST (testRemoveOutput);
11   CPPUNIT_TEST (testClearOutputs);
12   CPPUNIT_TEST (testExceptions);
13   CPPUNIT_TEST_SUITE_END ();
14
15   public:
16         void setUp()
17         {
18                 frames = 128;
19                 random_data = TestUtils::init_random_data (frames, 1.0);
20                 
21                 zero_data = new float[frames];
22                 memset (zero_data, 0, frames * sizeof(float));
23                 
24                 thread_pool = new Glib::ThreadPool (3);
25                 threader.reset (new Threader<float> (*thread_pool));
26                 
27                 sink_a.reset (new VectorSink<float>());
28                 sink_b.reset (new VectorSink<float>());
29                 sink_c.reset (new VectorSink<float>());
30                 sink_d.reset (new VectorSink<float>());
31                 sink_e.reset (new VectorSink<float>());
32                 sink_f.reset (new VectorSink<float>());
33                 
34                 throwing_sink.reset (new ThrowingSink<float>());
35         }
36
37         void tearDown()
38         {
39                 delete [] random_data;
40                 delete [] zero_data;
41                 
42                 thread_pool->shutdown();
43                 delete thread_pool;
44         }
45
46         void testProcess()
47         {
48                 threader->add_output (sink_a);
49                 threader->add_output (sink_b);
50                 threader->add_output (sink_c);
51                 threader->add_output (sink_d);
52                 threader->add_output (sink_e);
53                 threader->add_output (sink_f);
54                 
55                 ProcessContext<float> c (random_data, frames, 1);
56                 threader->process (c);
57                 
58                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
59                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
60                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_c->get_array(), frames));
61                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_d->get_array(), frames));
62                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_e->get_array(), frames));
63                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_f->get_array(), frames));
64         }
65         
66         void testRemoveOutput()
67         {
68                 threader->add_output (sink_a);
69                 threader->add_output (sink_b);
70                 threader->add_output (sink_c);
71                 threader->add_output (sink_d);
72                 threader->add_output (sink_e);
73                 threader->add_output (sink_f);
74                 
75                 ProcessContext<float> c (random_data, frames, 1);
76                 threader->process (c);
77                 
78                 // Remove a, b and f
79                 threader->remove_output (sink_a);
80                 threader->remove_output (sink_b);
81                 threader->remove_output (sink_f);
82                 
83                 ProcessContext<float> zc (zero_data, frames, 1);
84                 threader->process (zc);
85                 
86                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
87                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
88                 CPPUNIT_ASSERT (TestUtils::array_equals(zero_data, sink_c->get_array(), frames));
89                 CPPUNIT_ASSERT (TestUtils::array_equals(zero_data, sink_d->get_array(), frames));
90                 CPPUNIT_ASSERT (TestUtils::array_equals(zero_data, sink_e->get_array(), frames));
91                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_f->get_array(), frames));
92         }
93         
94         void testClearOutputs()
95         {
96                 threader->add_output (sink_a);
97                 threader->add_output (sink_b);
98                 threader->add_output (sink_c);
99                 threader->add_output (sink_d);
100                 threader->add_output (sink_e);
101                 threader->add_output (sink_f);
102                 
103                 ProcessContext<float> c (random_data, frames, 1);
104                 threader->process (c);
105                 
106                 threader->clear_outputs();
107                 ProcessContext<float> zc (zero_data, frames, 1);
108                 threader->process (zc);
109                 
110                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
111                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
112                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_c->get_array(), frames));
113                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_d->get_array(), frames));
114                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_e->get_array(), frames));
115                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_f->get_array(), frames));
116         }
117         
118         void testExceptions()
119         {
120                 threader->add_output (sink_a);
121                 threader->add_output (sink_b);
122                 threader->add_output (sink_c);
123                 threader->add_output (throwing_sink);
124                 threader->add_output (sink_e);
125                 threader->add_output (throwing_sink);
126                 
127                 ProcessContext<float> c (random_data, frames, 1);
128                 CPPUNIT_ASSERT_THROW (threader->process (c), Exception);
129                 
130                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
131                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
132                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_c->get_array(), frames));
133                 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_e->get_array(), frames));
134         }
135
136   private:
137         Glib::ThreadPool * thread_pool;
138         
139         boost::shared_ptr<Threader<float> > threader;
140         boost::shared_ptr<VectorSink<float> > sink_a;
141         boost::shared_ptr<VectorSink<float> > sink_b;
142         boost::shared_ptr<VectorSink<float> > sink_c;
143         boost::shared_ptr<VectorSink<float> > sink_d;
144         boost::shared_ptr<VectorSink<float> > sink_e;
145         boost::shared_ptr<VectorSink<float> > sink_f;
146         
147         boost::shared_ptr<ThrowingSink<float> > throwing_sink;
148
149         float * random_data;
150         float * zero_data;
151         nframes_t frames;
152 };
153
154 CPPUNIT_TEST_SUITE_REGISTRATION (ThreaderTest);
155