Revision 38:944898c2e14e

View differences:

Makefile.inc
18 18
OBJECTS := $(SOURCES:.cpp=.o)
19 19
OBJECTS := $(OBJECTS:.c=.o)
20 20

  
21
all: $(PLUGIN)
22

  
21 23
$(PLUGIN):	$(OBJECTS)
22 24
		$(CXX) -o $@ $^ $(LDFLAGS)
23 25

  
test/Makefile
1
CXX	?= g++
2
CC	?= gcc
3

  
4
CFLAGS		:= $(CFLAGS) 
5
CXXFLAGS	:= $(CXXFLAGS) -I..
6
LDFLAGS		:= $(LDFLAGS) -lvamp-sdk -lboost_unit_test_framework
7

  
8
SUPER_OBJECTS	:= ../NoteHypothesis.o
9

  
10
tests:	TestNoteHypothesis.o
11
	$(CXX) -o $@ $^ $(SUPER_OBJECTS) $(LDFLAGS)
test/TestNoteHypothesis.cpp
22 22
    WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 23
*/
24 24

  
25
#ifndef TEST_NOTE_HYPOTHESIS_H
26
#define TEST_NOTE_HYPOTHESIS_H
25
#include "NoteHypothesis.h"
27 26

  
28
#include "base/NoteHypothesis.h"
29

  
30
#include <QObject>
31
#include <QtTest>
32

  
33
namespace Turbot {
34

  
35
class TestNoteHypothesis : public QObject
27
std::ostream &operator<<(std::ostream &out, const NoteHypothesis::Estimate &n)
36 28
{
37
    Q_OBJECT
38

  
39
private slots:
40
    void emptyAccept() {
41
	NoteHypothesis h;
42
	NoteHypothesis::Estimate e;
43
	QCOMPARE(h.getState(), NoteHypothesis::New);
44
	QVERIFY(h.accept(e));
45
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
46
    }
47

  
48
    void simpleSatisfy() {
49
	NoteHypothesis h;
50
	NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 1);
51
	NoteHypothesis::Estimate e2(500, RealTime::fromMilliseconds(10), 1);
52
	NoteHypothesis::Estimate e3(500, RealTime::fromMilliseconds(20), 1);
53
	NoteHypothesis::Estimate e4(500, RealTime::fromMilliseconds(30), 1);
54
	NoteHypothesis::Estimate e5(500, RealTime::fromMilliseconds(80), 1);
55
	NoteHypothesis::Estimate e6(500, RealTime::fromMilliseconds(90), 1);
56
	QCOMPARE(h.getState(), NoteHypothesis::New);
57
	QVERIFY(h.accept(e1));
58
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
59
	QVERIFY(h.accept(e2));
60
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
61
	QVERIFY(h.accept(e3));
62
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
63
	QVERIFY(h.accept(e4));
64
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
65
	QVERIFY(!h.accept(e5));
66
	QCOMPARE(h.getState(), NoteHypothesis::Expired);
67
	QVERIFY(!h.accept(e6));
68
	QCOMPARE(h.getState(), NoteHypothesis::Expired);
69
    }
70
	
71
    void strayReject() {
72
	NoteHypothesis h;
73
	NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 1);
74
	NoteHypothesis::Estimate e2(1000, RealTime::fromMilliseconds(10), 1);
75
	NoteHypothesis::Estimate e3(500, RealTime::fromMilliseconds(20), 1);
76
	NoteHypothesis::Estimate e4(500, RealTime::fromMilliseconds(30), 1);
77
	QCOMPARE(h.getState(), NoteHypothesis::New);
78
	QVERIFY(h.accept(e1));
79
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
80
	QVERIFY(!h.accept(e2));
81
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
82
	QVERIFY(h.accept(e3));
83
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
84
	QVERIFY(h.accept(e4));
85
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
86
    }
87
		
88
    void tooSlow() {
89
	NoteHypothesis h;
90
	NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 1);
91
	NoteHypothesis::Estimate e2(500, RealTime::fromMilliseconds(50), 1);
92
	QCOMPARE(h.getState(), NoteHypothesis::New);
93
	QVERIFY(h.accept(e1));
94
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
95
	QVERIFY(!h.accept(e2));
96
	QCOMPARE(h.getState(), NoteHypothesis::Rejected);
97
    }
98
	
99
    void weakSatisfy() {
100
	NoteHypothesis h;
101
	NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 0.5);
102
	NoteHypothesis::Estimate e2(502, RealTime::fromMilliseconds(10), 0.5);
103
	NoteHypothesis::Estimate e3(504, RealTime::fromMilliseconds(20), 0.5);
104
	NoteHypothesis::Estimate e4(506, RealTime::fromMilliseconds(30), 0.5);
105
	NoteHypothesis::Estimate e5(508, RealTime::fromMilliseconds(40), 0.5);
106
	NoteHypothesis::Estimate e6(510, RealTime::fromMilliseconds(90), 0.5);
107
	QCOMPARE(h.getState(), NoteHypothesis::New);
108
	QVERIFY(h.accept(e1));
109
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
110
	QVERIFY(h.accept(e2));
111
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
112
	QVERIFY(h.accept(e3));
113
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
114
	QVERIFY(h.accept(e4));
115
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
116
	QVERIFY(h.accept(e5));
117
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
118
	QVERIFY(!h.accept(e6));
119
	QCOMPARE(h.getState(), NoteHypothesis::Expired);
120
    }
121
	
122
    void frequencyRange() {
123
	NoteHypothesis h;
124
	NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(0), 1);
125
	NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(10), 1);
126
	NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(20), 1);
127
	NoteHypothesis::Estimate e4(470, RealTime::fromMilliseconds(30), 1);
128
	QCOMPARE(h.getState(), NoteHypothesis::New);
129
	QVERIFY(h.accept(e1));
130
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
131
	QVERIFY(h.accept(e2));
132
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
133
	QVERIFY(h.accept(e3));
134
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
135
	QVERIFY(!h.accept(e4));
136
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
137
    }
138

  
139
    void acceptedEstimates() {
140
	NoteHypothesis h;
141
	NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(0), 1);
142
	NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(10), 1);
143
	NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(20), 1);
144
	NoteHypothesis::Estimate e4(470, RealTime::fromMilliseconds(30), 1);
145
	NoteHypothesis::Estimate e5(444, RealTime::fromMilliseconds(90), 1);
146
	NoteHypothesis::Estimates es;
147
	es.push_back(e1);
148
	es.push_back(e2);
149
	es.push_back(e3);
150
	QCOMPARE(h.getState(), NoteHypothesis::New);
151
	QCOMPARE(h.getAcceptedEstimates(), NoteHypothesis::Estimates());
152
	QVERIFY(h.accept(e1));
153
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
154
	QCOMPARE(h.getAcceptedEstimates(), NoteHypothesis::Estimates());
155
	QVERIFY(h.accept(e2));
156
	QCOMPARE(h.getState(), NoteHypothesis::Provisional);
157
	QCOMPARE(h.getAcceptedEstimates(), NoteHypothesis::Estimates());
158
	QVERIFY(h.accept(e3));
159
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
160
	QCOMPARE(h.getAcceptedEstimates(), es);
161
	QVERIFY(!h.accept(e4));
162
	QCOMPARE(h.getState(), NoteHypothesis::Satisfied);
163
	QCOMPARE(h.getAcceptedEstimates(), es);
164
	QVERIFY(!h.accept(e5));
165
	QCOMPARE(h.getState(), NoteHypothesis::Expired);
166
	QCOMPARE(h.getAcceptedEstimates(), es);
167
    }
168
	
169
    void meanFrequency() {
170
	NoteHypothesis h;
171
	NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(0), 1);
172
	NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(10), 1);
173
	NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(20), 1);
174
	QVERIFY(h.accept(e1));
175
	QVERIFY(h.accept(e2));
176
	QVERIFY(h.accept(e3));
177
	QCOMPARE(h.getMeanFrequency(), 444.0);
178
    }
179

  
180
    void averagedNote() {
181
	NoteHypothesis h;
182
	NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(10), 1);
183
	NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(20), 1);
184
	NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(30), 1);
185
	QVERIFY(h.accept(e1));
186
	QVERIFY(h.accept(e2));
187
	QVERIFY(h.accept(e3));
188
	QCOMPARE(h.getAveragedNote(), NoteHypothesis::Note
189
		 (444,
190
		  RealTime::fromMilliseconds(10),
191
		  RealTime::fromMilliseconds(20)));
192
    }
193

  
194
	
195
    
196
};
197

  
29
    return out << "[" << n.freq << "@" << n.time << ":" << n.confidence << "]" << std::endl;
198 30
}
199 31

  
200
#endif
32
std::ostream &operator<<(std::ostream &out, const NoteHypothesis::Estimates &e)
33
{
34
    out << "( ";
35
    for (int i = 0; i < (int)e.size(); ++i) out << e[i] << "; ";
36
    out << " )";
37
    return out;
38
}
39

  
40
std::ostream &operator<<(std::ostream &out, const NoteHypothesis::Note &n)
41
{
42
    return out << "[" << n.freq << "@" << n.time << ":" << n.duration << "]" << std::endl;
43
}
44

  
45
#define BOOST_TEST_DYN_LINK
46
#define BOOST_TEST_MAIN
47

  
48
#include <boost/test/unit_test.hpp>
49

  
50
using Vamp::RealTime;
51

  
52
BOOST_AUTO_TEST_SUITE(TestNoteHypothesis)
53

  
54
BOOST_AUTO_TEST_CASE(emptyAccept)
55
{
56
    NoteHypothesis h;
57
    NoteHypothesis::Estimate e;
58
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::New);
59
    BOOST_CHECK(h.accept(e));
60
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
61
}
62

  
63
BOOST_AUTO_TEST_CASE(simpleSatisfy)
64
{
65
    NoteHypothesis h;
66
    NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 1);
67
    NoteHypothesis::Estimate e2(500, RealTime::fromMilliseconds(10), 1);
68
    NoteHypothesis::Estimate e3(500, RealTime::fromMilliseconds(20), 1);
69
    NoteHypothesis::Estimate e4(500, RealTime::fromMilliseconds(30), 1);
70
    NoteHypothesis::Estimate e5(500, RealTime::fromMilliseconds(80), 1);
71
    NoteHypothesis::Estimate e6(500, RealTime::fromMilliseconds(90), 1);
72
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::New);
73
    BOOST_CHECK(h.accept(e1));
74
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
75
    BOOST_CHECK(h.accept(e2));
76
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
77
    BOOST_CHECK(h.accept(e3));
78
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
79
    BOOST_CHECK(h.accept(e4));
80
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
81
    BOOST_CHECK(!h.accept(e5));
82
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Expired);
83
    BOOST_CHECK(!h.accept(e6));
84
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Expired);
85
}
86
	
87
BOOST_AUTO_TEST_CASE(strayReject)
88
{
89
    NoteHypothesis h;
90
    NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 1);
91
    NoteHypothesis::Estimate e2(1000, RealTime::fromMilliseconds(10), 1);
92
    NoteHypothesis::Estimate e3(500, RealTime::fromMilliseconds(20), 1);
93
    NoteHypothesis::Estimate e4(500, RealTime::fromMilliseconds(30), 1);
94
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::New);
95
    BOOST_CHECK(h.accept(e1));
96
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
97
    BOOST_CHECK(!h.accept(e2));
98
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
99
    BOOST_CHECK(h.accept(e3));
100
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
101
    BOOST_CHECK(h.accept(e4));
102
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
103
}
104
		
105
BOOST_AUTO_TEST_CASE(tooSlow)
106
{
107
    NoteHypothesis h;
108
    NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 1);
109
    NoteHypothesis::Estimate e2(500, RealTime::fromMilliseconds(50), 1);
110
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::New);
111
    BOOST_CHECK(h.accept(e1));
112
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
113
    BOOST_CHECK(!h.accept(e2));
114
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Rejected);
115
}
116
	
117
BOOST_AUTO_TEST_CASE(weakSatisfy)
118
{
119
    NoteHypothesis h;
120
    NoteHypothesis::Estimate e1(500, RealTime::fromMilliseconds(0), 0.5);
121
    NoteHypothesis::Estimate e2(502, RealTime::fromMilliseconds(10), 0.5);
122
    NoteHypothesis::Estimate e3(504, RealTime::fromMilliseconds(20), 0.5);
123
    NoteHypothesis::Estimate e4(506, RealTime::fromMilliseconds(30), 0.5);
124
    NoteHypothesis::Estimate e5(508, RealTime::fromMilliseconds(40), 0.5);
125
    NoteHypothesis::Estimate e6(510, RealTime::fromMilliseconds(90), 0.5);
126
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::New);
127
    BOOST_CHECK(h.accept(e1));
128
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
129
    BOOST_CHECK(h.accept(e2));
130
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
131
    BOOST_CHECK(h.accept(e3));
132
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
133
    BOOST_CHECK(h.accept(e4));
134
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
135
    BOOST_CHECK(h.accept(e5));
136
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
137
    BOOST_CHECK(!h.accept(e6));
138
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Expired);
139
}
140
	
141
BOOST_AUTO_TEST_CASE(frequencyRange)
142
{
143
    NoteHypothesis h;
144
    NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(0), 1);
145
    NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(10), 1);
146
    NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(20), 1);
147
    NoteHypothesis::Estimate e4(470, RealTime::fromMilliseconds(30), 1);
148
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::New);
149
    BOOST_CHECK(h.accept(e1));
150
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
151
    BOOST_CHECK(h.accept(e2));
152
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
153
    BOOST_CHECK(h.accept(e3));
154
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
155
    BOOST_CHECK(!h.accept(e4));
156
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
157
}
158

  
159
BOOST_AUTO_TEST_CASE(acceptedEstimates)
160
{
161
    NoteHypothesis h;
162
    NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(0), 1);
163
    NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(10), 1);
164
    NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(20), 1);
165
    NoteHypothesis::Estimate e4(470, RealTime::fromMilliseconds(30), 1);
166
    NoteHypothesis::Estimate e5(444, RealTime::fromMilliseconds(90), 1);
167
    NoteHypothesis::Estimates es;
168
    es.push_back(e1);
169
    es.push_back(e2);
170
    es.push_back(e3);
171
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::New);
172
    BOOST_CHECK_EQUAL(h.getAcceptedEstimates(), NoteHypothesis::Estimates());
173
    BOOST_CHECK(h.accept(e1));
174
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
175
    BOOST_CHECK_EQUAL(h.getAcceptedEstimates(), NoteHypothesis::Estimates());
176
    BOOST_CHECK(h.accept(e2));
177
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Provisional);
178
    BOOST_CHECK_EQUAL(h.getAcceptedEstimates(), NoteHypothesis::Estimates());
179
    BOOST_CHECK(h.accept(e3));
180
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
181
    BOOST_CHECK_EQUAL(h.getAcceptedEstimates(), es);
182
    BOOST_CHECK(!h.accept(e4));
183
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Satisfied);
184
    BOOST_CHECK_EQUAL(h.getAcceptedEstimates(), es);
185
    BOOST_CHECK(!h.accept(e5));
186
    BOOST_CHECK_EQUAL(h.getState(), NoteHypothesis::Expired);
187
    BOOST_CHECK_EQUAL(h.getAcceptedEstimates(), es);
188
}
189
	
190
BOOST_AUTO_TEST_CASE(meanFrequency)
191
{
192
    NoteHypothesis h;
193
    NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(0), 1);
194
    NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(10), 1);
195
    NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(20), 1);
196
    BOOST_CHECK(h.accept(e1));
197
    BOOST_CHECK(h.accept(e2));
198
    BOOST_CHECK(h.accept(e3));
199
    BOOST_CHECK_EQUAL(h.getMeanFrequency(), 444.0);
200
}
201

  
202
BOOST_AUTO_TEST_CASE(averagedNote)
203
{
204
    NoteHypothesis h;
205
    NoteHypothesis::Estimate e1(440, RealTime::fromMilliseconds(10), 1);
206
    NoteHypothesis::Estimate e2(448, RealTime::fromMilliseconds(20), 1);
207
    NoteHypothesis::Estimate e3(444, RealTime::fromMilliseconds(30), 1);
208
    BOOST_CHECK(h.accept(e1));
209
    BOOST_CHECK(h.accept(e2));
210
    BOOST_CHECK(h.accept(e3));
211
    BOOST_CHECK_EQUAL(h.getAveragedNote(), NoteHypothesis::Note
212
                      (444,
213
                       RealTime::fromMilliseconds(10),
214
                       RealTime::fromMilliseconds(20)));
215
}
216

  
217
BOOST_AUTO_TEST_SUITE_END()
218

  

Also available in: Unified diff