2 #include "audiographer/threader.h"
4 using namespace AudioGrapher;
6 class ThreaderTest : public CppUnit::TestFixture
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 ();
19 random_data = TestUtils::init_random_data (frames, 1.0);
21 zero_data = new float[frames];
22 memset (zero_data, 0, frames * sizeof(float));
24 thread_pool = new Glib::ThreadPool (3);
25 threader.reset (new Threader<float> (*thread_pool));
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>());
34 throwing_sink.reset (new ThrowingSink<float>());
39 delete [] random_data;
42 thread_pool->shutdown();
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);
55 ProcessContext<float> c (random_data, frames, 1);
56 threader->process (c);
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));
66 void testRemoveOutput()
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);
75 ProcessContext<float> c (random_data, frames, 1);
76 threader->process (c);
79 threader->remove_output (sink_a);
80 threader->remove_output (sink_b);
81 threader->remove_output (sink_f);
83 ProcessContext<float> zc (zero_data, frames, 1);
84 threader->process (zc);
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));
94 void testClearOutputs()
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);
103 ProcessContext<float> c (random_data, frames, 1);
104 threader->process (c);
106 threader->clear_outputs();
107 ProcessContext<float> zc (zero_data, frames, 1);
108 threader->process (zc);
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));
118 void testExceptions()
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);
127 ProcessContext<float> c (random_data, frames, 1);
128 CPPUNIT_ASSERT_THROW (threader->process (c), Exception);
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));
137 Glib::ThreadPool * thread_pool;
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;
147 boost::shared_ptr<ThrowingSink<float> > throwing_sink;
154 CPPUNIT_TEST_SUITE_REGISTRATION (ThreaderTest);