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