1 #include "tests/utils.h"
3 #include "audiographer/general/threader.h"
5 using namespace AudioGrapher;
7 class ThreaderTest : public CppUnit::TestFixture
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 ();
20 random_data = TestUtils::init_random_data (frames, 1.0);
22 zero_data = new float[frames];
23 memset (zero_data, 0, frames * sizeof(float));
25 thread_pool = new Glib::ThreadPool (3);
26 threader.reset (new Threader<float> (*thread_pool));
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>());
35 throwing_sink.reset (new ThrowingSink<float>());
40 delete [] random_data;
43 thread_pool->shutdown();
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);
56 ProcessContext<float> c (random_data, frames, 1);
57 threader->process (c);
59 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
60 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
61 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_c->get_array(), frames));
62 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_d->get_array(), frames));
63 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_e->get_array(), frames));
64 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_f->get_array(), frames));
67 void testRemoveOutput()
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);
76 ProcessContext<float> c (random_data, frames, 1);
77 threader->process (c);
80 threader->remove_output (sink_a);
81 threader->remove_output (sink_b);
82 threader->remove_output (sink_f);
84 ProcessContext<float> zc (zero_data, frames, 1);
85 threader->process (zc);
87 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
88 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
89 CPPUNIT_ASSERT (TestUtils::array_equals(zero_data, sink_c->get_array(), frames));
90 CPPUNIT_ASSERT (TestUtils::array_equals(zero_data, sink_d->get_array(), frames));
91 CPPUNIT_ASSERT (TestUtils::array_equals(zero_data, sink_e->get_array(), frames));
92 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_f->get_array(), frames));
95 void testClearOutputs()
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);
104 ProcessContext<float> c (random_data, frames, 1);
105 threader->process (c);
107 threader->clear_outputs();
108 ProcessContext<float> zc (zero_data, frames, 1);
109 threader->process (zc);
111 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
112 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
113 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_c->get_array(), frames));
114 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_d->get_array(), frames));
115 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_e->get_array(), frames));
116 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_f->get_array(), frames));
119 void testExceptions()
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);
128 ProcessContext<float> c (random_data, frames, 1);
129 CPPUNIT_ASSERT_THROW (threader->process (c), Exception);
131 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_a->get_array(), frames));
132 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_b->get_array(), frames));
133 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_c->get_array(), frames));
134 CPPUNIT_ASSERT (TestUtils::array_equals(random_data, sink_e->get_array(), frames));
138 Glib::ThreadPool * thread_pool;
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;
148 boost::shared_ptr<ThrowingSink<float> > throwing_sink;
155 CPPUNIT_TEST_SUITE_REGISTRATION (ThreaderTest);