globally change all use of "frame" to refer to audio into "sample".
[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                 samples = 128;
23                 random_data = TestUtils::init_random_data (samples, 1.0);
24
25                 interleaver.reset (new Interleaver<float>());
26                 sink.reset (new VectorSink<float>());
27
28                 interleaver->init (channels, samples);
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, samples, 1);
40                 CPPUNIT_ASSERT_THROW (interleaver->input(0)->process (c), Exception);
41         }
42
43         void testInvalidInputIndex()
44         {
45                 ProcessContext<float> c (random_data, samples, 1);
46                 CPPUNIT_ASSERT_THROW (interleaver->input (3)->process (c), Exception);
47         }
48
49         void testInvalidInputSize()
50         {
51                 ProcessContext<float> c (random_data, samples + 1, 1);
52                 CPPUNIT_ASSERT_THROW (interleaver->input (0)->process (c), Exception);
53
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);
57
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);
61         }
62
63         void testOutputSize()
64         {
65                 interleaver->add_output (sink);
66
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);
71
72                 samplecnt_t expected_samples = samples * channels;
73                 samplecnt_t generated_samples = sink->get_data().size();
74                 CPPUNIT_ASSERT_EQUAL (expected_samples, generated_samples);
75
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));
80
81                 expected_samples = less_samples * channels;
82                 generated_samples = sink->get_data().size();
83                 CPPUNIT_ASSERT_EQUAL (expected_samples, generated_samples);
84         }
85
86         void testZeroInput()
87         {
88                 interleaver->add_output (sink);
89
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));
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                 samplecnt_t expected_samples = samples * channels;
104                 samplecnt_t generated_samples = sink->get_data().size();
105                 CPPUNIT_ASSERT_EQUAL (expected_samples, generated_samples);
106         }
107
108         void testChannelSync()
109         {
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);
114         }
115
116
117   private:
118         boost::shared_ptr<Interleaver<float> > interleaver;
119
120         boost::shared_ptr<VectorSink<float> > sink;
121
122         samplecnt_t channels;
123         float * random_data;
124         samplecnt_t samples;
125 };
126
127 CPPUNIT_TEST_SUITE_REGISTRATION (InterleaverTest);
128