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 (samples, 1.0);
25 interleaver.reset (new Interleaver<float>());
26 sink.reset (new VectorSink<float>());
28 interleaver->init (channels, samples);
33 delete [] random_data;
36 void testUninitialized()
38 interleaver.reset (new Interleaver<float>());
39 ProcessContext<float> c (random_data, samples, 1);
40 CPPUNIT_ASSERT_THROW (interleaver->input(0)->process (c), Exception);
43 void testInvalidInputIndex()
45 ProcessContext<float> c (random_data, samples, 1);
46 CPPUNIT_ASSERT_THROW (interleaver->input (3)->process (c), Exception);
49 void testInvalidInputSize()
51 ProcessContext<float> c (random_data, samples + 1, 1);
52 CPPUNIT_ASSERT_THROW (interleaver->input (0)->process (c), Exception);
54 interleaver->input (0)->process (c.beginning (samples));
55 interleaver->input (1)->process (c.beginning (samples));
56 CPPUNIT_ASSERT_THROW (interleaver->input (2)->process (c.beginning (samples - 1)), Exception);
58 interleaver->input (0)->process (c.beginning (samples - 1));
59 interleaver->input (1)->process (c.beginning (samples - 1));
60 CPPUNIT_ASSERT_THROW (interleaver->input (2)->process (c.beginning (samples)), Exception);
65 interleaver->add_output (sink);
67 ProcessContext<float> c (random_data, samples, 1);
68 interleaver->input (0)->process (c);
69 interleaver->input (1)->process (c);
70 interleaver->input (2)->process (c);
72 samplecnt_t expected_samples = samples * channels;
73 samplecnt_t generated_samples = sink->get_data().size();
74 CPPUNIT_ASSERT_EQUAL (expected_samples, generated_samples);
76 samplecnt_t less_samples = samples / 2;
77 interleaver->input (0)->process (c.beginning (less_samples));
78 interleaver->input (1)->process (c.beginning (less_samples));
79 interleaver->input (2)->process (c.beginning (less_samples));
81 expected_samples = less_samples * channels;
82 generated_samples = sink->get_data().size();
83 CPPUNIT_ASSERT_EQUAL (expected_samples, generated_samples);
88 interleaver->add_output (sink);
90 // input zero samples to all inputs
91 ProcessContext<float> c (random_data, samples, 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 samplecnt_t expected_samples = samples * channels;
104 samplecnt_t generated_samples = sink->get_data().size();
105 CPPUNIT_ASSERT_EQUAL (expected_samples, generated_samples);
108 void testChannelSync()
110 interleaver->add_output (sink);
111 ProcessContext<float> c (random_data, samples, 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;
122 samplecnt_t channels;
127 CPPUNIT_TEST_SUITE_REGISTRATION (InterleaverTest);