annotate tests/Test_BTrack.cpp @ 112:33be76921da9

Move unit tests to doctest and use CMake
author Adam Stark <adamstark.uk@gmail.com>
date Thu, 17 Aug 2023 10:57:35 +0200
parents
children
rev   line source
adamstark@112 1 #include "doctest.h"
adamstark@112 2 #include <BTrack.h>
adamstark@112 3
adamstark@112 4 //======================================================================
adamstark@112 5 //==================== CHECKING INITIALISATION =========================
adamstark@112 6 //======================================================================
adamstark@112 7 TEST_SUITE ("checkingInitialisation")
adamstark@112 8 {
adamstark@112 9 //======================================================================
adamstark@112 10 TEST_CASE ("constructorWithNoArguments")
adamstark@112 11 {
adamstark@112 12 BTrack b;
adamstark@112 13
adamstark@112 14 CHECK_EQ (b.getHopSize(), 512);
adamstark@112 15 }
adamstark@112 16
adamstark@112 17 //======================================================================
adamstark@112 18 TEST_CASE("constructorWithHopSize")
adamstark@112 19 {
adamstark@112 20 BTrack b(1024);
adamstark@112 21
adamstark@112 22 CHECK_EQ (b.getHopSize(), 1024);
adamstark@112 23 }
adamstark@112 24
adamstark@112 25 //======================================================================
adamstark@112 26 TEST_CASE("constructorWithHopSizeAndFrameSize")
adamstark@112 27 {
adamstark@112 28 BTrack b(256,512);
adamstark@112 29
adamstark@112 30 CHECK_EQ (b.getHopSize(), 256);
adamstark@112 31 }
adamstark@112 32
adamstark@112 33 }
adamstark@112 34
adamstark@112 35 //======================================================================
adamstark@112 36 //=================== PROCESSING SIMPLE VALUES =========================
adamstark@112 37 //======================================================================
adamstark@112 38
adamstark@112 39 TEST_SUITE("processingSimpleValues")
adamstark@112 40 {
adamstark@112 41 //======================================================================
adamstark@112 42 TEST_CASE ("processZeroValuedOnsetDetectionFunctionSamples")
adamstark@112 43 {
adamstark@112 44 BTrack b(512);
adamstark@112 45
adamstark@112 46 long numSamples = 20000;
adamstark@112 47
adamstark@112 48 std::vector<double> odfSamples;
adamstark@112 49
adamstark@112 50 int maxInterval = 0;
adamstark@112 51 int currentInterval = 0;
adamstark@112 52 int numBeats = 0;
adamstark@112 53
adamstark@112 54 for (int i = 0;i < numSamples;i++)
adamstark@112 55 {
adamstark@112 56 b.processOnsetDetectionFunctionSample(0.0);
adamstark@112 57
adamstark@112 58 currentInterval++;
adamstark@112 59
adamstark@112 60 if (b.beatDueInCurrentFrame())
adamstark@112 61 {
adamstark@112 62 numBeats++;
adamstark@112 63
adamstark@112 64 if (currentInterval > maxInterval)
adamstark@112 65 {
adamstark@112 66 maxInterval = currentInterval;
adamstark@112 67 }
adamstark@112 68
adamstark@112 69 currentInterval = 0;
adamstark@112 70 }
adamstark@112 71 }
adamstark@112 72
adamstark@112 73 // check that the maximum interval between beats does not
adamstark@112 74 // exceed 100 onset detection function samples (~ 1.3 seconds)
adamstark@112 75 CHECK (maxInterval < 100);
adamstark@112 76
adamstark@112 77 // check that we have at least a beat for every 100 samples
adamstark@112 78 CHECK (numBeats > (numSamples/100));
adamstark@112 79
adamstark@112 80 }
adamstark@112 81
adamstark@112 82 //======================================================================
adamstark@112 83 TEST_CASE ("processRandomOnsetDetectionFunctionSamples")
adamstark@112 84 {
adamstark@112 85 BTrack b(512);
adamstark@112 86
adamstark@112 87 long numSamples = 20000;
adamstark@112 88
adamstark@112 89 std::vector<double> odfSamples;
adamstark@112 90
adamstark@112 91 int maxInterval = 0;
adamstark@112 92 int currentInterval = 0;
adamstark@112 93 int numBeats = 0;
adamstark@112 94
adamstark@112 95 for (int i = 0;i < numSamples;i++)
adamstark@112 96 {
adamstark@112 97 odfSamples.push_back(random() % 1000);
adamstark@112 98 }
adamstark@112 99
adamstark@112 100 for (int i = 0;i < numSamples;i++)
adamstark@112 101 {
adamstark@112 102 b.processOnsetDetectionFunctionSample(odfSamples[i]);
adamstark@112 103
adamstark@112 104 currentInterval++;
adamstark@112 105
adamstark@112 106 if (b.beatDueInCurrentFrame())
adamstark@112 107 {
adamstark@112 108 numBeats++;
adamstark@112 109
adamstark@112 110 if (currentInterval > maxInterval)
adamstark@112 111 {
adamstark@112 112 maxInterval = currentInterval;
adamstark@112 113 }
adamstark@112 114
adamstark@112 115 currentInterval = 0;
adamstark@112 116 }
adamstark@112 117 }
adamstark@112 118
adamstark@112 119 // check that the maximum interval between beats does not
adamstark@112 120 // exceed 100 onset detection function samples (~ 1.3 seconds)
adamstark@112 121 CHECK(maxInterval < 100);
adamstark@112 122
adamstark@112 123 // check that we have at least a beat for every 100 samples
adamstark@112 124 CHECK(numBeats > (numSamples/100));
adamstark@112 125
adamstark@112 126 }
adamstark@112 127
adamstark@112 128 //======================================================================
adamstark@112 129 TEST_CASE ("processNegativeOnsetDetectionFunctionSamples")
adamstark@112 130 {
adamstark@112 131 BTrack b(512);
adamstark@112 132
adamstark@112 133 long numSamples = 20000;
adamstark@112 134
adamstark@112 135 std::vector<double> odfSamples;
adamstark@112 136
adamstark@112 137 int maxInterval = 0;
adamstark@112 138 int currentInterval = 0;
adamstark@112 139 int numBeats = 0;
adamstark@112 140
adamstark@112 141 for (int i = 0;i < numSamples;i++)
adamstark@112 142 {
adamstark@112 143 odfSamples.push_back(-1.0*(random() % 1000));
adamstark@112 144 }
adamstark@112 145
adamstark@112 146 for (int i = 0;i < numSamples;i++)
adamstark@112 147 {
adamstark@112 148 b.processOnsetDetectionFunctionSample(odfSamples[i]);
adamstark@112 149
adamstark@112 150 currentInterval++;
adamstark@112 151
adamstark@112 152 if (b.beatDueInCurrentFrame())
adamstark@112 153 {
adamstark@112 154 numBeats++;
adamstark@112 155
adamstark@112 156 if (currentInterval > maxInterval)
adamstark@112 157 {
adamstark@112 158 maxInterval = currentInterval;
adamstark@112 159 }
adamstark@112 160
adamstark@112 161 currentInterval = 0;
adamstark@112 162 }
adamstark@112 163 }
adamstark@112 164
adamstark@112 165 // check that the maximum interval between beats does not
adamstark@112 166 // exceed 100 onset detection function samples (~ 1.3 seconds)
adamstark@112 167 CHECK (maxInterval < 100);
adamstark@112 168
adamstark@112 169 // check that we have at least a beat for every 100 samples
adamstark@112 170 CHECK (numBeats > (numSamples/100));
adamstark@112 171
adamstark@112 172 }
adamstark@112 173
adamstark@112 174 //======================================================================
adamstark@112 175 TEST_CASE ("processSeriesOfDeltaFunctions")
adamstark@112 176 {
adamstark@112 177 BTrack b(512);
adamstark@112 178
adamstark@112 179 long numSamples = 20000;
adamstark@112 180 int beatPeriod = 43;
adamstark@112 181
adamstark@112 182 std::vector<double> odfSamples;
adamstark@112 183
adamstark@112 184 int maxInterval = 0;
adamstark@112 185 int currentInterval = 0;
adamstark@112 186 int numBeats = 0;
adamstark@112 187 int correct = 0;
adamstark@112 188
adamstark@112 189 for (int i = 0;i < numSamples;i++)
adamstark@112 190 {
adamstark@112 191 if (i % beatPeriod == 0)
adamstark@112 192 {
adamstark@112 193 odfSamples.push_back(1000);
adamstark@112 194 }
adamstark@112 195 else
adamstark@112 196 {
adamstark@112 197 odfSamples.push_back(0.0);
adamstark@112 198 }
adamstark@112 199 }
adamstark@112 200
adamstark@112 201 for (int i = 0;i < numSamples;i++)
adamstark@112 202 {
adamstark@112 203 b.processOnsetDetectionFunctionSample(odfSamples[i]);
adamstark@112 204
adamstark@112 205 currentInterval++;
adamstark@112 206
adamstark@112 207 if (b.beatDueInCurrentFrame())
adamstark@112 208 {
adamstark@112 209 numBeats++;
adamstark@112 210
adamstark@112 211 if (currentInterval > maxInterval)
adamstark@112 212 {
adamstark@112 213 maxInterval = currentInterval;
adamstark@112 214 }
adamstark@112 215
adamstark@112 216 if (currentInterval == beatPeriod)
adamstark@112 217 {
adamstark@112 218 correct++;
adamstark@112 219 }
adamstark@112 220
adamstark@112 221 currentInterval = 0;
adamstark@112 222 }
adamstark@112 223 }
adamstark@112 224
adamstark@112 225 // check that the maximum interval between beats does not
adamstark@112 226 // exceed 100 onset detection function samples (~ 1.3 seconds)
adamstark@112 227 CHECK (maxInterval < 100);
adamstark@112 228
adamstark@112 229 // check that we have at least a beat for every 100 samples
adamstark@112 230 CHECK (numBeats > (numSamples/100));
adamstark@112 231
adamstark@112 232 // check that the number of correct beats is larger than 99%
adamstark@112 233 // of the total number of beats
adamstark@112 234 CHECK (((double)correct) > (((double)numBeats)*0.99));
adamstark@112 235 }
adamstark@112 236 }