Mercurial > hg > svcore
diff data/model/test/TestSparseModels.h @ 1611:b2f32c554199 single-point
Pull out the Point class, plus start testing NoteModel, plus actually add the tests...
author | Chris Cannam |
---|---|
date | Tue, 05 Mar 2019 15:15:11 +0000 |
parents | |
children | 2e14a7876945 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/data/model/test/TestSparseModels.h Tue Mar 05 15:15:11 2019 +0000 @@ -0,0 +1,225 @@ +/* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */ + +/* + Sonic Visualiser + An audio file viewer and annotation editor. + Centre for Digital Music, Queen Mary, University of London. + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License as + published by the Free Software Foundation; either version 2 of the + License, or (at your option) any later version. See the file + COPYING included with this distribution for more information. +*/ + +#ifndef TEST_SPARSE_MODELS_H +#define TEST_SPARSE_MODELS_H + +#include "../SparseOneDimensionalModel.h" +#include "../NoteModel.h" + +#include <QObject> +#include <QtTest> + +#include <iostream> + +using namespace std; + +class TestSparseModels : public QObject +{ + Q_OBJECT + +private slots: + void s1d_empty() { + SparseOneDimensionalModel m(100, 10, false); + QCOMPARE(m.isEmpty(), true); + QCOMPARE(m.getPointCount(), 0); + QCOMPARE(m.getPoints().begin(), m.getPoints().end()); + QCOMPARE(m.getStartFrame(), 0); + QCOMPARE(m.getEndFrame(), 0); + QCOMPARE(m.getSampleRate(), 100); + QCOMPARE(m.getResolution(), 10); + QCOMPARE(m.isSparse(), true); + + SparseOneDimensionalModel::Point p(10); + m.addPoint(p); + m.clear(); + QCOMPARE(m.isEmpty(), true); + QCOMPARE(m.getPointCount(), 0); + QCOMPARE(m.getPoints().begin(), m.getPoints().end()); + QCOMPARE(m.getStartFrame(), 0); + QCOMPARE(m.getEndFrame(), 0); + + m.addPoint(p); + m.deletePoint(p); + QCOMPARE(m.isEmpty(), true); + QCOMPARE(m.getPointCount(), 0); + QCOMPARE(m.getPoints().begin(), m.getPoints().end()); + QCOMPARE(m.getStartFrame(), 0); + QCOMPARE(m.getEndFrame(), 0); + } + + void s1d_extents() { + SparseOneDimensionalModel m(100, 10, false); + SparseOneDimensionalModel::Point p1(20); + m.addPoint(p1); + QCOMPARE(m.isEmpty(), false); + QCOMPARE(m.getPointCount(), 1); + SparseOneDimensionalModel::Point p2(50); + m.addPoint(p2); + QCOMPARE(m.isEmpty(), false); + QCOMPARE(m.getPointCount(), 2); + QCOMPARE(m.getPoints().size(), 2); + QCOMPARE(*m.getPoints().begin(), p1); + QCOMPARE(*m.getPoints().rbegin(), p2); + QCOMPARE(m.getStartFrame(), 20); + QCOMPARE(m.getEndFrame(), 60); + QCOMPARE(m.containsPoint(p1), true); + m.deletePoint(p1); + QCOMPARE(m.getPointCount(), 1); + QCOMPARE(m.getPoints().size(), 1); + QCOMPARE(*m.getPoints().begin(), p2); + QCOMPARE(m.getStartFrame(), 50); + QCOMPARE(m.getEndFrame(), 60); + QCOMPARE(m.containsPoint(p1), false); + } + + void s1d_sample() { + SparseOneDimensionalModel m(100, 10, false); + SparseOneDimensionalModel::Point p1(20), p2(20), p3(50); + m.addPoint(p1); + m.addPoint(p2); + m.addPoint(p3); + QCOMPARE(m.getPoints().size(), 3); + QCOMPARE(*m.getPoints().begin(), p1); + QCOMPARE(*m.getPoints().rbegin(), p3); + + auto pp = m.getPoints(20, 30); + QCOMPARE(pp.size(), 2); + QCOMPARE(*pp.begin(), p1); + QCOMPARE(*pp.rbegin(), p2); + + pp = m.getPoints(40, 50); + QCOMPARE(pp.size(), 0); + + pp = m.getPoints(50, 50); + QCOMPARE(pp.size(), 1); + QCOMPARE(*pp.begin(), p3); + } + + void s1d_xml() { + SparseOneDimensionalModel m(100, 10, false); + m.setObjectName("This \"&\" that"); + SparseOneDimensionalModel::Point p1(20), p2(20), p3(50); + p2.label = "Label &'\">"; + m.addPoint(p1); + m.addPoint(p2); + m.addPoint(p3); + QString xml; + QTextStream str(&xml, QIODevice::WriteOnly); + m.toXml(str); + str.flush(); + QString expected = + "<model id='1' name='This "&" that' sampleRate='100' start='20' end='60' type='sparse' dimensions='1' resolution='10' notifyOnAdd='false' dataset='0' />\n" + "<dataset id='0' dimensions='1'>\n" + " <point frame='20' label='' />\n" + " <point frame='20' label='Label &'">' />\n" + " <point frame='50' label='' />\n" + "</dataset>\n"; + expected.replace("\'", "\""); + if (xml != expected) { + cerr << "Obtained xml:\n" << xml + << "\nExpected:\n" << expected << endl; + } + QCOMPARE(xml, expected); + } + + void note_extents() { + NoteModel m(100, 10, false); + NoteModel::Point p1(20, 123.4, 40, 0.8, "note 1"); + m.addPoint(p1); + QCOMPARE(m.isEmpty(), false); + QCOMPARE(m.getPointCount(), 1); + NoteModel::Point p2(50, 124.3, 30, 0.9, "note 2"); + m.addPoint(p2); + QCOMPARE(m.isEmpty(), false); + QCOMPARE(m.getPointCount(), 2); + QCOMPARE(m.getPoints().size(), 2); + QCOMPARE(*m.getPoints().begin(), p1); + QCOMPARE(*m.getPoints().rbegin(), p2); + QCOMPARE(m.getStartFrame(), 20); + QCOMPARE(m.getEndFrame(), 80); + QCOMPARE(m.containsPoint(p1), true); + QCOMPARE(m.getValueMinimum(), 123.4); + QCOMPARE(m.getValueMaximum(), 124.3); + m.deletePoint(p1); + QCOMPARE(m.getPointCount(), 1); + QCOMPARE(m.getPoints().size(), 1); + QCOMPARE(*m.getPoints().begin(), p2); + QCOMPARE(m.getStartFrame(), 50); + QCOMPARE(m.getEndFrame(), 80); + QCOMPARE(m.containsPoint(p1), false); + } + + void note_sample() { + NoteModel m(100, 10, false); + NoteModel::Point p1(20, 123.4, 20, 0.8, "note 1"); + NoteModel::Point p2(20, 124.3, 10, 0.9, "note 2"); + NoteModel::Point p3(50, 126.3, 30, 0.9, "note 3"); + m.addPoint(p1); + m.addPoint(p2); + m.addPoint(p3); + + QCOMPARE(m.getPoints().size(), 3); + QCOMPARE(*m.getPoints().begin(), p1); + QCOMPARE(*m.getPoints().rbegin(), p3); + + auto pp = m.getPoints(20, 30); + QCOMPARE(pp.size(), 2); + QCOMPARE(*pp.begin(), p1); + QCOMPARE(*pp.rbegin(), p2); + + pp = m.getPoints(30, 50); + QCOMPARE(pp.size(), 1); + QCOMPARE(*pp.begin(), p1); + + pp = m.getPoints(40, 50); + QCOMPARE(pp.size(), 0); + + pp = m.getPoints(50, 50); + QCOMPARE(pp.size(), 1); + QCOMPARE(*pp.begin(), p3); + } + + void note_xml() { + NoteModel m(100, 10, false); + NoteModel::Point p1(20, 123.4, 20, 0.8, "note 1"); + NoteModel::Point p2(20, 124.3, 10, 0.9, "note 2"); + NoteModel::Point p3(50, 126.3, 30, 0.9, "note 3"); + m.setScaleUnits("Hz"); + m.addPoint(p1); + m.addPoint(p2); + m.addPoint(p3); + QString xml; + QTextStream str(&xml, QIODevice::WriteOnly); + m.toXml(str); + str.flush(); + QString expected = + "<model id='3' name='' sampleRate='100' start='20' end='60' type='sparse' dimensions='3' resolution='10' notifyOnAdd='false' dataset='2' subtype='note' valueQuantization='0' minimum='123.4' maximum='126.3' units='Hz'/>\n" + "<dataset id='2' dimensions='3'>\n" + " <point frame='20' value='123.4' duration='20' level='0.8' label='note 1' />\n" + " <point frame='20' value='124.3' duration='10' level='0.9' label='note 2' />\n" + " <point frame='50' value='126.3' duration='30' level='0.9' label='note 3' />\n" + "</dataset>\n"; + expected.replace("\'", "\""); + if (xml != expected) { + cerr << "Obtained xml:\n" << xml + << "\nExpected:\n" << expected << endl; + } + QCOMPARE(xml, expected); + } + + +}; + +#endif