1 #include "tests/utils.h"
3 #include "audiographer/general/interleaver.h"
5 using namespace AudioGrapher;
7 class InterleaverTest : public CppUnit::TestFixture
9 CPPUNIT_TEST_SUITE (InterleaverTest);
10 CPPUNIT_TEST (testUninitialized);
11 CPPUNIT_TEST (testInvalidInputIndex);
12 CPPUNIT_TEST (testInvalidInputSize);
13 CPPUNIT_TEST (testOutputSize);
14 CPPUNIT_TEST (testZeroInput);
15 CPPUNIT_TEST (testChannelSync);
16 CPPUNIT_TEST_SUITE_END ();
23 random_data = TestUtils::init_random_data (frames, 1.0);
25 interleaver.reset (new Interleaver<float>());
26 sink.reset (new VectorSink<float>());
28 interleaver->init (channels, frames);
33 delete [] random_data;
36 void testUninitialized()
38 interleaver.reset (new Interleaver<float>());
39 ProcessContext<float> c (random_data, frames, 1);
40 CPPUNIT_ASSERT_THROW (interleaver->input(0)->process (c), Exception);
43 void testInvalidInputIndex()
45 ProcessContext<float> c (random_data, frames, 1);
46 CPPUNIT_ASSERT_THROW (interleaver->input (3)->process (c), Exception);
49 void testInvalidInputSize()
51 ProcessContext<float> c (random_data, frames + 1, 1);
52 CPPUNIT_ASSERT_THROW (interleaver->input (0)->process (c), Exception);
54 interleaver->input (0)->process (c.beginning (frames));
55 interleaver->input (1)->process (c.beginning (frames));
56 CPPUNIT_ASSERT_THROW (interleaver->input (2)->process (c.beginning (frames - 1)), Exception);
58 interleaver->input (0)->process (c.beginning (frames - 1));
59 interleaver->input (1)->process (c.beginning (frames - 1));
60 CPPUNIT_ASSERT_THROW (interleaver->input (2)->process (c.beginning (frames)), Exception);
65 interleaver->add_output (sink);
67 ProcessContext<float> c (random_data, frames, 1);
68 interleaver->input (0)->process (c);
69 interleaver->input (1)->process (c);
70 interleaver->input (2)->process (c);
72 framecnt_t expected_frames = frames * channels;
73 framecnt_t generated_frames = sink->get_data().size();
74 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
76 framecnt_t less_frames = frames / 2;
77 interleaver->input (0)->process (c.beginning (less_frames));
78 interleaver->input (1)->process (c.beginning (less_frames));
79 interleaver->input (2)->process (c.beginning (less_frames));
81 expected_frames = less_frames * channels;
82 generated_frames = sink->get_data().size();
83 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
88 interleaver->add_output (sink);
90 // input zero frames to all inputs
91 ProcessContext<float> c (random_data, frames, 1);
92 interleaver->input (0)->process (c.beginning (0));
93 interleaver->input (1)->process (c.beginning (0));
94 interleaver->input (2)->process (c.beginning (0));
96 // NOTE zero input is allowed to be a NOP
98 // ...now test regular input
99 interleaver->input (0)->process (c);
100 interleaver->input (1)->process (c);
101 interleaver->input (2)->process (c);
103 framecnt_t expected_frames = frames * channels;
104 framecnt_t generated_frames = sink->get_data().size();
105 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
108 void testChannelSync()
110 interleaver->add_output (sink);
111 ProcessContext<float> c (random_data, frames, 1);
112 interleaver->input (0)->process (c);
113 CPPUNIT_ASSERT_THROW (interleaver->input (0)->process (c), Exception);
118 boost::shared_ptr<Interleaver<float> > interleaver;
120 boost::shared_ptr<VectorSink<float> > sink;
127 CPPUNIT_TEST_SUITE_REGISTRATION (InterleaverTest);