1 #include "tests/utils.h"
3 #include "audiographer/general/silence_trimmer.h"
5 using namespace AudioGrapher;
7 class SilenceTrimmerTest : public CppUnit::TestFixture
9 CPPUNIT_TEST_SUITE (SilenceTrimmerTest);
10 CPPUNIT_TEST (testExceptions);
11 CPPUNIT_TEST (testFullBuffers);
12 CPPUNIT_TEST (testPartialBuffers);
13 CPPUNIT_TEST (testAddSilenceBeginning);
14 CPPUNIT_TEST (testAddSilenceEnd);
15 CPPUNIT_TEST_SUITE_END ();
22 random_data = TestUtils::init_random_data(samples);
24 random_data[samples - 1] = 0.5;
26 zero_data = new float[samples];
27 memset(zero_data, 0, samples * sizeof(float));
29 half_random_data = TestUtils::init_random_data(samples);
30 memset(half_random_data, 0, (samples / 2) * sizeof(float));
32 trimmer.reset (new SilenceTrimmer<float> (samples / 2));
33 sink.reset (new AppendingVectorSink<float>());
35 trimmer->set_trim_beginning (true);
36 trimmer->set_trim_end (true);
41 delete [] random_data;
43 delete [] half_random_data;
46 void testFullBuffers()
48 trimmer->add_output (sink);
51 ProcessContext<float> c (zero_data, samples, 1);
53 samplecnt_t samples_processed = sink->get_data().size();
54 CPPUNIT_ASSERT_EQUAL ((samplecnt_t) 0, samples_processed);
58 ProcessContext<float> c (random_data, samples, 1);
60 samplecnt_t samples_processed = sink->get_data().size();
61 CPPUNIT_ASSERT_EQUAL (samples, samples_processed);
62 CPPUNIT_ASSERT (TestUtils::array_equals (sink->get_array(), random_data, samples));
66 ProcessContext<float> c (zero_data, samples, 1);
68 samplecnt_t samples_processed = sink->get_data().size();
69 CPPUNIT_ASSERT_EQUAL (samples, samples_processed);
73 ProcessContext<float> c (random_data, samples, 1);
75 samplecnt_t samples_processed = sink->get_data().size();
76 CPPUNIT_ASSERT_EQUAL (3 * samples, samples_processed);
77 CPPUNIT_ASSERT (TestUtils::array_equals (sink->get_array(), random_data, samples));
78 CPPUNIT_ASSERT (TestUtils::array_equals (&sink->get_array()[samples], zero_data, samples));
79 CPPUNIT_ASSERT (TestUtils::array_equals (&sink->get_array()[2 * samples], random_data, samples));
83 ProcessContext<float> c (zero_data, samples, 1);
85 samplecnt_t samples_processed = sink->get_data().size();
86 CPPUNIT_ASSERT_EQUAL (3 * samples, samples_processed);
90 void testPartialBuffers()
92 trimmer->add_output (sink);
93 trimmer->reset (samples / 4);
94 trimmer->set_trim_beginning (true);
95 trimmer->set_trim_end (true);
98 ProcessContext<float> c (half_random_data, samples, 1);
100 samplecnt_t samples_processed = sink->get_data().size();
101 CPPUNIT_ASSERT_EQUAL (samples / 2, samples_processed);
102 CPPUNIT_ASSERT (TestUtils::array_equals (sink->get_array(), &half_random_data[samples / 2], samples / 2));
106 ProcessContext<float> c (zero_data, samples, 1);
107 trimmer->process (c);
108 samplecnt_t samples_processed = sink->get_data().size();
109 CPPUNIT_ASSERT_EQUAL (samples / 2, samples_processed);
113 ProcessContext<float> c (half_random_data, samples, 1);
114 trimmer->process (c);
115 samplecnt_t samples_processed = sink->get_data().size();
116 CPPUNIT_ASSERT_EQUAL (2 * samples + samples / 2, samples_processed);
117 CPPUNIT_ASSERT (TestUtils::array_equals (&sink->get_array()[samples + samples / 2], half_random_data, samples));
121 void testExceptions()
124 CPPUNIT_ASSERT_THROW (trimmer->reset (0), Exception);
128 void testAddSilenceBeginning()
130 trimmer->add_output (sink);
132 samplecnt_t silence = samples / 2;
133 trimmer->add_silence_to_beginning (silence);
136 ProcessContext<float> c (random_data, samples, 1);
137 trimmer->process (c);
140 CPPUNIT_ASSERT (TestUtils::array_equals (sink->get_array(), zero_data, silence));
141 CPPUNIT_ASSERT (TestUtils::array_equals (&sink->get_array()[silence], random_data, samples));
144 void testAddSilenceEnd()
146 trimmer->add_output (sink);
148 samplecnt_t silence = samples / 3;
149 trimmer->add_silence_to_end (silence);
152 ProcessContext<float> c (random_data, samples, 1);
153 trimmer->process (c);
157 ProcessContext<float> c (random_data, samples, 1);
158 c.set_flag (ProcessContext<float>::EndOfInput);
159 trimmer->process (c);
162 samplecnt_t samples_processed = sink->get_data().size();
163 samplecnt_t total_samples = 2 * samples + silence;
164 CPPUNIT_ASSERT_EQUAL (total_samples, samples_processed);
165 CPPUNIT_ASSERT (TestUtils::array_equals (sink->get_array(), random_data, samples));
166 CPPUNIT_ASSERT (TestUtils::array_equals (&sink->get_array()[samples], random_data, samples));
167 CPPUNIT_ASSERT (TestUtils::array_equals (&sink->get_array()[samples * 2], zero_data, silence));
171 boost::shared_ptr<SilenceTrimmer<float> > trimmer;
172 boost::shared_ptr<AppendingVectorSink<float> > sink;
176 float * half_random_data;
180 CPPUNIT_TEST_SUITE_REGISTRATION (SilenceTrimmerTest);