b82aac74bb5b6a822cd9aae9d428f9197441204e
[ardour.git] / libs / audiographer / tests / general / interleaver_test.cc
1 #include "tests/utils.h"
2
3 #include "audiographer/general/interleaver.h"
4
5 using namespace AudioGrapher;
6
7 class InterleaverTest : public CppUnit::TestFixture
8 {
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 ();
17
18   public:
19         void setUp()
20         {
21                 channels = 3;
22                 frames = 128;
23                 random_data = TestUtils::init_random_data (frames, 1.0);
24
25                 interleaver.reset (new Interleaver<float>());
26                 sink.reset (new VectorSink<float>());
27                 
28                 interleaver->init (channels, frames);
29         }
30
31         void tearDown()
32         {
33                 delete [] random_data;
34         }
35
36         void testUninitialized()
37         {
38                 interleaver.reset (new Interleaver<float>());
39                 ProcessContext<float> c (random_data, frames, 1);
40                 CPPUNIT_ASSERT_THROW (interleaver->input(0)->process (c), Exception);
41         }
42
43         void testInvalidInputIndex()
44         {
45                 ProcessContext<float> c (random_data, frames, 1);
46                 CPPUNIT_ASSERT_THROW (interleaver->input (3)->process (c), Exception);
47         }
48
49         void testInvalidInputSize()
50         {
51                 ProcessContext<float> c (random_data, frames + 1, 1);
52                 CPPUNIT_ASSERT_THROW (interleaver->input (0)->process (c), Exception);
53                 
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);
57
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);
61         }
62
63         void testOutputSize()
64         {
65                 interleaver->add_output (sink);
66
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);
71
72                 framecnt_t expected_frames = frames * channels;
73                 framecnt_t generated_frames = sink->get_data().size();
74                 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
75
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));
80
81                 expected_frames = less_frames * channels;
82                 generated_frames = sink->get_data().size();
83                 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
84         }
85
86         void testZeroInput()
87         {
88                 interleaver->add_output (sink);
89
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));
95                 
96                 // NOTE zero input is allowed to be a NOP
97                 
98                 // ...now test regular input
99                 interleaver->input (0)->process (c);
100                 interleaver->input (1)->process (c);
101                 interleaver->input (2)->process (c);
102
103                 framecnt_t expected_frames = frames * channels;
104                 framecnt_t generated_frames = sink->get_data().size();
105                 CPPUNIT_ASSERT_EQUAL (expected_frames, generated_frames);
106         }
107
108         void testChannelSync()
109         {
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);          
114         }
115
116
117   private:
118         boost::shared_ptr<Interleaver<float> > interleaver;
119
120         boost::shared_ptr<VectorSink<float> > sink;
121
122         framecnt_t channels;
123         float * random_data;
124         framecnt_t frames;
125 };
126
127 CPPUNIT_TEST_SUITE_REGISTRATION (InterleaverTest);
128