annotate data/fileio/test/EncodingTest.h @ 1346:75ad55315db4 3.0-integration

More work on getting tests (especially file encoding ones) running on Windows. Various problems here to do with interaction with test filenames in Hg repos
author Chris Cannam
date Fri, 06 Jan 2017 15:44:55 +0000
parents c0cdacc47f4e
children 281a8c9d4886
rev   line source
Chris@1345 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
Chris@1345 2
Chris@1345 3 /*
Chris@1345 4 Sonic Visualiser
Chris@1345 5 An audio file viewer and annotation editor.
Chris@1345 6 Centre for Digital Music, Queen Mary, University of London.
Chris@1345 7
Chris@1345 8 This program is free software; you can redistribute it and/or
Chris@1345 9 modify it under the terms of the GNU General Public License as
Chris@1345 10 published by the Free Software Foundation; either version 2 of the
Chris@1345 11 License, or (at your option) any later version. See the file
Chris@1345 12 COPYING included with this distribution for more information.
Chris@1345 13 */
Chris@1345 14
Chris@1345 15 #ifndef TEST_AUDIO_ENCODINGS_H
Chris@1345 16 #define TEST_AUDIO_ENCODINGS_H
Chris@1345 17
Chris@1345 18 // Quick tests for filename encodings and encoding of ID3 data. Not a
Chris@1345 19 // test of audio codecs.
Chris@1345 20
Chris@1345 21 #include "../AudioFileReaderFactory.h"
Chris@1345 22 #include "../AudioFileReader.h"
Chris@1345 23
Chris@1345 24 #include <cmath>
Chris@1345 25
Chris@1345 26 #include <QObject>
Chris@1345 27 #include <QtTest>
Chris@1345 28 #include <QDir>
Chris@1345 29
Chris@1345 30 #include <iostream>
Chris@1345 31
Chris@1345 32 using namespace std;
Chris@1345 33
Chris@1346 34 const char utf8_name_cdp_1[] = "Caf\303\251 de Paris";
Chris@1346 35 const char utf8_name_cdp_2[] = "Caf\303\251 de \351\207\215\345\272\206";
Chris@1346 36 const char utf8_name_tsprk[] = "T\303\253mple of Sp\303\253rks";
Chris@1346 37 const char utf8_name_sprkt[] = "\343\202\271\343\203\235\343\203\274\343\202\257\343\201\256\345\257\272\351\231\242";
Chris@1345 38
Chris@1345 39 static const char *mapping[][2] = {
Chris@1346 40 { "id3v2-iso-8859-1", utf8_name_cdp_1 },
Chris@1346 41 { "id3v2-ucs-2", utf8_name_cdp_2 },
Chris@1346 42 { utf8_name_tsprk, utf8_name_tsprk },
Chris@1346 43 { utf8_name_sprkt, utf8_name_sprkt },
Chris@1345 44 };
Chris@1345 45 static const int mappingCount = 4;
Chris@1345 46
Chris@1345 47 class EncodingTest : public QObject
Chris@1345 48 {
Chris@1345 49 Q_OBJECT
Chris@1345 50
Chris@1346 51 private:
Chris@1346 52 QString testDirBase;
Chris@1346 53 QString encodingDir;
Chris@1346 54
Chris@1346 55 public:
Chris@1346 56 EncodingTest(QString base) {
Chris@1346 57 if (base == "") {
Chris@1346 58 base = "svcore/data/fileio/test";
Chris@1346 59 }
Chris@1346 60 testDirBase = base;
Chris@1346 61 encodingDir = base + "/encodings";
Chris@1346 62 }
Chris@1346 63
Chris@1346 64 private:
Chris@1345 65 const char *strOf(QString s) {
Chris@1345 66 return strdup(s.toLocal8Bit().data());
Chris@1345 67 }
Chris@1345 68
Chris@1345 69 private slots:
Chris@1345 70 void init()
Chris@1345 71 {
Chris@1345 72 if (!QDir(encodingDir).exists()) {
Chris@1345 73 cerr << "ERROR: Audio encoding file directory \"" << encodingDir << "\" does not exist" << endl;
Chris@1345 74 QVERIFY2(QDir(encodingDir).exists(), "Audio encoding file directory not found");
Chris@1345 75 }
Chris@1345 76 }
Chris@1345 77
Chris@1345 78 void read_data()
Chris@1345 79 {
Chris@1345 80 QTest::addColumn<QString>("audiofile");
Chris@1345 81 QStringList files = QDir(encodingDir).entryList(QDir::Files);
Chris@1345 82 foreach (QString filename, files) {
Chris@1345 83 QTest::newRow(strOf(filename)) << filename;
Chris@1345 84 }
Chris@1345 85 }
Chris@1345 86
Chris@1345 87 void read()
Chris@1345 88 {
Chris@1345 89 QFETCH(QString, audiofile);
Chris@1345 90
Chris@1345 91 AudioFileReaderFactory::Parameters params;
Chris@1346 92 AudioFileReader *reader =
Chris@1346 93 AudioFileReaderFactory::createReader
Chris@1346 94 (encodingDir + "/" + audiofile, params);
Chris@1345 95
Chris@1345 96 QVERIFY(reader != nullptr);
Chris@1345 97
Chris@1345 98 QStringList fileAndExt = audiofile.split(".");
Chris@1345 99 QString file = fileAndExt[0];
Chris@1345 100 QString extension = fileAndExt[1];
Chris@1345 101
Chris@1345 102 if (extension == "mp3") {
Chris@1345 103
Chris@1345 104 QString title = reader->getTitle();
Chris@1345 105 QVERIFY(title != QString());
Chris@1345 106
Chris@1345 107 bool found = false;
Chris@1345 108 for (int m = 0; m < mappingCount; ++m) {
Chris@1345 109 if (file == QString::fromUtf8(mapping[m][0])) {
Chris@1345 110 found = true;
Chris@1346 111 QString expected = QString::fromUtf8(mapping[m][1]);
Chris@1346 112 if (title != expected) {
Chris@1346 113 cerr << "Title does not match expected: codepoints are" << endl;
Chris@1346 114 cerr << "Title (" << title.length() << "ch): ";
Chris@1346 115 for (int i = 0; i < title.length(); ++i) {
Chris@1346 116 cerr << title[i].unicode() << " ";
Chris@1346 117 }
Chris@1346 118 cerr << endl;
Chris@1346 119 cerr << "Expected (" << expected.length() << "ch): ";
Chris@1346 120 for (int i = 0; i < expected.length(); ++i) {
Chris@1346 121 cerr << expected[i].unicode() << " ";
Chris@1346 122 }
Chris@1346 123 cerr << endl;
Chris@1346 124 }
Chris@1346 125 QCOMPARE(title, expected);
Chris@1345 126 break;
Chris@1345 127 }
Chris@1345 128 }
Chris@1345 129
Chris@1345 130 if (!found) {
Chris@1346 131 cerr << "Couldn't find filename \""
Chris@1345 132 << file << "\" in title mapping array" << endl;
Chris@1346 133 QSKIP("Couldn't find filename in title mapping array");
Chris@1345 134 }
Chris@1345 135 }
Chris@1345 136 }
Chris@1345 137 };
Chris@1345 138
Chris@1345 139 #endif