2 #include "audiographer/deinterleaver.h"
4 using namespace AudioGrapher;
6 class DeInterleaverTest : public CppUnit::TestFixture
8 CPPUNIT_TEST_SUITE (DeInterleaverTest);
9 CPPUNIT_TEST (testUninitialized);
10 CPPUNIT_TEST (testInvalidOutputIndex);
11 CPPUNIT_TEST (testInvalidInputSize);
12 CPPUNIT_TEST (testOutputSize);
13 CPPUNIT_TEST (testZeroInput);
14 CPPUNIT_TEST_SUITE_END ();
20 frames_per_channel = 128;
21 total_frames = channels * frames_per_channel;
22 random_data = TestUtils::init_random_data (total_frames, 1.0);
24 deinterleaver.reset (new DeInterleaver<float>());
25 sink_a.reset (new VectorSink<float>());
26 sink_b.reset (new VectorSink<float>());
27 sink_c.reset (new VectorSink<float>());
32 delete [] random_data;
35 void testUninitialized()
37 deinterleaver.reset (new DeInterleaver<float>());
38 CPPUNIT_ASSERT_THROW (deinterleaver->output(0)->add_output (sink_a), Exception);
41 void testInvalidOutputIndex()
43 deinterleaver->init (3, frames_per_channel);
44 CPPUNIT_ASSERT_THROW (deinterleaver->output(3)->add_output (sink_a), Exception);
47 void testInvalidInputSize()
49 deinterleaver->init (channels, frames_per_channel);
51 ProcessContext<float> c (random_data, 0, channels);
53 // Too many, frames % channels == 0
54 c.frames() = total_frames + channels;
55 CPPUNIT_ASSERT_THROW (deinterleaver->process (c), Exception);
57 // Too many, frames % channels != 0
58 c.frames() = total_frames + 1;
59 CPPUNIT_ASSERT_THROW (deinterleaver->process (c), Exception);
61 // Too few, frames % channels != 0
62 c.frames() = total_frames - 1;
63 CPPUNIT_ASSERT_THROW (deinterleaver->process (c), Exception);
66 void assert_outputs (nframes_t expected_frames)
68 nframes_t generated_frames = 0;
70 generated_frames = sink_a->get_data().size();
71 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
73 generated_frames = sink_b->get_data().size();
74 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
76 generated_frames = sink_c->get_data().size();
77 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
82 deinterleaver->init (channels, frames_per_channel);
84 deinterleaver->output (0)->add_output (sink_a);
85 deinterleaver->output (1)->add_output (sink_b);
86 deinterleaver->output (2)->add_output (sink_c);
88 // Test maximum frame input
89 ProcessContext<float> c (random_data, total_frames, channels);
90 deinterleaver->process (c);
91 assert_outputs (frames_per_channel);
93 // Now with less frames
94 nframes_t const less_frames = frames_per_channel / 4;
95 c.frames() = less_frames * channels;
96 deinterleaver->process (c);
97 assert_outputs (less_frames);
102 deinterleaver->init (channels, frames_per_channel);
104 deinterleaver->output (0)->add_output (sink_a);
105 deinterleaver->output (1)->add_output (sink_b);
106 deinterleaver->output (2)->add_output (sink_c);
109 ProcessContext<float> c (random_data, 0, channels);
110 deinterleaver->process (c);
112 // ...and now test regular input
113 c.frames() = total_frames;
114 deinterleaver->process (c);
115 assert_outputs (frames_per_channel);
120 boost::shared_ptr<DeInterleaver<float> > deinterleaver;
122 boost::shared_ptr<VectorSink<float> > sink_a;
123 boost::shared_ptr<VectorSink<float> > sink_b;
124 boost::shared_ptr<VectorSink<float> > sink_c;
127 nframes_t frames_per_channel;
128 nframes_t total_frames;
129 unsigned int channels;
132 CPPUNIT_TEST_SUITE_REGISTRATION (DeInterleaverTest);