1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
|
#include "Sound.h"
#include "SoundIO.h"
#include "SoundUtils.h"
#include "TestConfig.h"
#include "TestUtils.h"
#include <QBuffer>
#include <QMetaProperty>
#include <QTemporaryDir>
#include <QUrl>
#include <catch2/catch_test_macros.hpp>
#include <catch2/matchers/catch_matchers_all.hpp>
using Catch::Matchers::Equals;
using Catch::Matchers::WithinAbs;
static constexpr double PRECISION = 0.00001;
static auto Within(float value) {
return WithinAbs(value, PRECISION);
}
static bool fuzzyEq(const Sound& s1, const Sound& s2) {
QMetaObject mo = BaseSound::staticMetaObject;
for (int i = 0; i < mo.propertyCount(); ++i) {
QMetaProperty property = mo.property(i);
QVariant v1 = property.read(&s1);
QVariant v2 = property.read(&s2);
if (property.type() == QVariant::Double) {
if (qAbs(v1.toDouble() - v2.toDouble()) > PRECISION) {
return false;
}
} else {
if (v1 != v2) {
return false;
}
}
}
return true;
}
TEST_CASE("Sound") {
WaveForm::registerType();
SECTION("load sfxr") {
Sound sound;
auto path = QUrl::fromLocalFile(QString(TEST_FIXTURES_DIR) + "/pickup.sfxr");
REQUIRE(sound.load(path));
CHECK(sound.waveForm() == WaveForm::Enum::Square);
CHECK_THAT(sound.sustainTime(), Within(0.05916));
CHECK_THAT(sound.sustainTime(), Within(0.05916));
CHECK_THAT(sound.sustainTime(), Within(0.05916));
CHECK_THAT(sound.baseFrequency(), Within(0.5019));
CHECK_THAT(sound.changeSpeed(), Within(0.54938));
CHECK(sound.phaserOffset() == 0);
}
SECTION("load sfxj") {
Sound sound;
auto path = QUrl::fromLocalFile(QString(TEST_FIXTURES_DIR) + "/pickup.sfxj");
REQUIRE(sound.load(path));
CHECK(sound.waveForm() == WaveForm::Enum::Square);
CHECK_THAT(sound.sustainTime(), Within(0.05916));
CHECK_THAT(sound.baseFrequency(), Within(0.5019));
CHECK_THAT(sound.changeSpeed(), Within(0.54938));
CHECK(sound.phaserOffset() == 0);
}
SECTION("load/save sfxj") {
QTemporaryDir tempDir;
auto path = tempDir.filePath("test.sfxj");
Sound sound1;
SoundUtils::mutate(&sound1);
REQUIRE(sound1.save(path));
Sound sound2;
REQUIRE(sound2.load(path));
REQUIRE(fuzzyEq(sound1, sound2));
}
SECTION("loading an sfxj with a version too recent fails") {
Sound sound;
QByteArray json = "{ \"version\": 2000000 }";
QBuffer buffer(&json);
REQUIRE(buffer.open(QIODevice::ReadOnly));
{
QtDebugSilencer silencer;
REQUIRE(!SoundIO::loadSfxj(&sound, &buffer));
}
}
}
|