2017-05-20 21:15:48 +02:00
|
|
|
#include "./overall.h"
|
|
|
|
|
|
|
|
#include "../abstracttrack.h"
|
2018-03-07 01:17:50 +01:00
|
|
|
#include "../tag.h"
|
2017-05-20 21:15:48 +02:00
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Checks "flac/test.flac" (converted from "mtx-test-data/alac/othertest-itunes.m4a" via ffmpeg).
|
|
|
|
* \remarks Raw FLAC stream.
|
|
|
|
*/
|
|
|
|
void OverallTests::checkFlacTestfile1()
|
|
|
|
{
|
|
|
|
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Flac);
|
|
|
|
const auto tracks = m_fileInfo.tracks();
|
|
|
|
CPPUNIT_ASSERT(tracks.size() == 1);
|
2018-03-07 01:17:50 +01:00
|
|
|
for (const auto &track : tracks) {
|
2017-05-20 21:15:48 +02:00
|
|
|
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
|
|
|
|
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Flac);
|
|
|
|
CPPUNIT_ASSERT(track->channelCount() == 2);
|
|
|
|
CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
|
|
|
|
CPPUNIT_ASSERT(track->bitsPerSample() == 16);
|
|
|
|
CPPUNIT_ASSERT(track->duration().minutes() == 4);
|
|
|
|
}
|
|
|
|
const auto tags = m_fileInfo.tags();
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (m_tagStatus) {
|
2017-05-20 21:15:48 +02:00
|
|
|
case TagStatus::Original:
|
|
|
|
// ffmpeg is able to set some tags from the original file (mtx-test-data/alac/othertest-itunes.m4a)
|
|
|
|
CPPUNIT_ASSERT(tags.size() == 1);
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::Title).toString() == "Sad Song");
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::Artist).toString() == "Oasis");
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::Album).toString() == "Don't Go Away (Apple Lossless)");
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::Genre).toString() == "Alternative & Punk");
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "Lavf57.25.100");
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::Year).toString() == "1998");
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).isEmpty());
|
|
|
|
//CPPUNIT_ASSERT(tags.front()->value(KnownField::Cover).dataSize() == 0x58f3);
|
|
|
|
//CPPUNIT_ASSERT(BE::toUInt64(tags.front()->value(KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::TrackPosition).toPositionInSet() == PositionInSet(3, 4));
|
|
|
|
CPPUNIT_ASSERT(tags.front()->value(KnownField::DiskPosition).toPositionInSet() == PositionInSet(1, 1));
|
|
|
|
break;
|
|
|
|
case TagStatus::TestMetaDataPresent:
|
|
|
|
checkOggTestMetaData();
|
|
|
|
break;
|
|
|
|
case TagStatus::Removed:
|
2017-06-19 13:54:23 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
|
2017-05-20 21:15:48 +02:00
|
|
|
}
|
2017-09-14 18:16:00 +02:00
|
|
|
|
2018-03-05 17:49:29 +01:00
|
|
|
CPPUNIT_ASSERT(m_diag.level() <= DiagLevel::Information);
|
2017-05-20 21:15:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Checks "flac/test.ogg" (converted from "flac/test.flac" via ffmpeg).
|
|
|
|
* \remarks FLAC in Ogg.
|
|
|
|
*/
|
|
|
|
void OverallTests::checkFlacTestfile2()
|
|
|
|
{
|
|
|
|
CPPUNIT_ASSERT(m_fileInfo.containerFormat() == ContainerFormat::Ogg);
|
|
|
|
const auto tracks = m_fileInfo.tracks();
|
|
|
|
CPPUNIT_ASSERT(tracks.size() == 1);
|
2018-03-07 01:17:50 +01:00
|
|
|
for (const auto &track : tracks) {
|
2017-05-20 21:15:48 +02:00
|
|
|
CPPUNIT_ASSERT(track->mediaType() == MediaType::Audio);
|
|
|
|
CPPUNIT_ASSERT(track->format() == GeneralMediaFormat::Flac);
|
|
|
|
CPPUNIT_ASSERT(track->channelCount() == 2);
|
|
|
|
CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
|
|
|
|
CPPUNIT_ASSERT(track->bitsPerSample() == 16);
|
|
|
|
CPPUNIT_ASSERT(track->duration().minutes() == 4);
|
|
|
|
}
|
|
|
|
const auto tags = m_fileInfo.tags();
|
2018-03-07 01:17:50 +01:00
|
|
|
switch (m_tagStatus) {
|
2017-05-20 21:15:48 +02:00
|
|
|
case TagStatus::Original:
|
|
|
|
CPPUNIT_ASSERT(tags.size() == 1);
|
|
|
|
break;
|
|
|
|
case TagStatus::TestMetaDataPresent:
|
|
|
|
checkOggTestMetaData();
|
|
|
|
break;
|
|
|
|
case TagStatus::Removed:
|
2017-06-19 13:54:23 +02:00
|
|
|
CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
|
2017-05-20 21:15:48 +02:00
|
|
|
}
|
2017-09-14 18:16:00 +02:00
|
|
|
|
|
|
|
// check for unexpected critical notifications or warnings
|
2018-03-07 01:17:50 +01:00
|
|
|
if (m_tagStatus == TagStatus::Removed) {
|
2017-09-14 18:16:00 +02:00
|
|
|
bool gotMessageAboutMissingVorbisComment = false;
|
2018-03-07 01:17:50 +01:00
|
|
|
for (const auto &msg : m_diag) {
|
|
|
|
if (msg.level() == DiagLevel::Critical) {
|
2018-03-05 17:49:29 +01:00
|
|
|
CPPUNIT_ASSERT_EQUAL("OGG page after FLAC-to-Ogg mapping header doesn't contain Vorbis comment."s, msg.message());
|
2017-09-14 18:16:00 +02:00
|
|
|
gotMessageAboutMissingVorbisComment = true;
|
|
|
|
continue;
|
|
|
|
}
|
2018-03-05 17:49:29 +01:00
|
|
|
CPPUNIT_ASSERT(msg.level() <= DiagLevel::Information);
|
2017-09-14 18:16:00 +02:00
|
|
|
}
|
|
|
|
CPPUNIT_ASSERT(gotMessageAboutMissingVorbisComment);
|
|
|
|
} else {
|
2018-03-05 17:49:29 +01:00
|
|
|
CPPUNIT_ASSERT(m_diag.level() <= DiagLevel::Information);
|
2017-09-14 18:16:00 +02:00
|
|
|
}
|
2017-05-20 21:15:48 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
* \brief Tests the FLAC parser via MediaFileInfo.
|
|
|
|
*/
|
|
|
|
void OverallTests::testFlacParsing()
|
|
|
|
{
|
|
|
|
cerr << endl << "FLAC parser" << endl;
|
|
|
|
m_fileInfo.setForceFullParse(false);
|
|
|
|
m_tagStatus = TagStatus::Original;
|
|
|
|
parseFile(TestUtilities::testFilePath("flac/test.flac"), &OverallTests::checkFlacTestfile1);
|
|
|
|
parseFile(TestUtilities::testFilePath("flac/test.ogg"), &OverallTests::checkFlacTestfile2);
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef PLATFORM_UNIX
|
|
|
|
/*!
|
|
|
|
* \brief Tests the FLAC maker via MediaFileInfo.
|
|
|
|
* \remarks Relies on the parser to check results.
|
|
|
|
*/
|
|
|
|
void OverallTests::testFlacMaking()
|
|
|
|
{
|
|
|
|
// full parse is required to determine padding
|
|
|
|
m_fileInfo.setForceFullParse(true);
|
|
|
|
|
|
|
|
// do the test under different conditions
|
2018-03-07 01:17:50 +01:00
|
|
|
for (m_mode = 0; m_mode != 0x2; ++m_mode) {
|
2017-05-20 21:15:48 +02:00
|
|
|
using namespace SimpleTestFlags;
|
|
|
|
|
|
|
|
// TODO: setup test conditions
|
|
|
|
|
|
|
|
// print test conditions
|
|
|
|
list<string> testConditions;
|
2018-03-07 01:17:50 +01:00
|
|
|
if (m_mode & RemoveTag) {
|
2017-05-20 21:15:48 +02:00
|
|
|
testConditions.emplace_back("removing tag");
|
|
|
|
} else {
|
|
|
|
testConditions.emplace_back("modifying tag");
|
|
|
|
}
|
|
|
|
cerr << endl << "FLAC maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
|
|
|
|
|
|
|
|
// do actual tests
|
|
|
|
m_tagStatus = (m_mode & RemoveTag) ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
|
|
|
|
void (OverallTests::*modifyRoutine)(void) = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
|
|
|
|
makeFile(TestUtilities::workingCopyPath("flac/test.flac"), modifyRoutine, &OverallTests::checkFlacTestfile1);
|
|
|
|
makeFile(TestUtilities::workingCopyPath("flac/test.ogg"), modifyRoutine, &OverallTests::checkFlacTestfile2);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
#endif
|