Extend Ogg related tests
* Test writing trailing zero lacing value if required * Test adding cover
This commit is contained in:
parent
ee9aeb00b4
commit
dd787e2f2a
|
@ -10,7 +10,7 @@ set(META_APP_URL "https://github.com/${META_APP_AUTHOR}/${META_PROJECT_NAME}")
|
|||
set(META_APP_DESCRIPTION "C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags")
|
||||
set(META_VERSION_MAJOR 10)
|
||||
set(META_VERSION_MINOR 1)
|
||||
set(META_VERSION_PATCH 0)
|
||||
set(META_VERSION_PATCH 1)
|
||||
set(META_REQUIRED_CPP_UNIT_VERSION 1.14.0)
|
||||
set(META_ADD_DEFAULT_CPP_UNIT_TEST_APPLICATION ON)
|
||||
|
||||
|
|
|
@ -66,6 +66,9 @@ testfiles=(
|
|||
'mtx-test-data/ogg/qt4dance_medium.ogg'
|
||||
'mtx-test-data/opus/v-opus.ogg'
|
||||
'misc/multiple_id3v2_4_values.mp3'
|
||||
'ogg/noise-without-cover.opus'
|
||||
'ogg/noise-broken-segment-termination.opus'
|
||||
'ogg/example-cover.png'
|
||||
)
|
||||
|
||||
# download the files
|
||||
|
|
|
@ -92,7 +92,9 @@ private:
|
|||
|
||||
void checkOggTestfile1();
|
||||
void checkOggTestfile2();
|
||||
void checkOggTestfile3();
|
||||
void checkOggTestMetaData();
|
||||
void checkOggTestMetaDataCover();
|
||||
|
||||
void checkFlacTestfile1();
|
||||
void checkFlacTestfile2();
|
||||
|
@ -102,6 +104,7 @@ private:
|
|||
void setMp3TestMetaData1();
|
||||
void setMp3TestMetaData2();
|
||||
void setOggTestMetaData();
|
||||
void setOggTestMetaDataCover();
|
||||
void removeAllTags();
|
||||
void noop();
|
||||
void alterMp4Tracks();
|
||||
|
|
|
@ -5,6 +5,12 @@
|
|||
#include "../tag.h"
|
||||
#include "../vorbis/vorbiscomment.h"
|
||||
|
||||
#include <c++utilities/io/misc.h>
|
||||
|
||||
#include <functional>
|
||||
|
||||
using namespace CppUtilities;
|
||||
|
||||
/*!
|
||||
* \brief Checks "mtx-test-data/ogg/qt4dance_medium.ogg"
|
||||
*/
|
||||
|
@ -87,6 +93,56 @@ void OverallTests::checkOggTestfile2()
|
|||
CPPUNIT_ASSERT(m_diag.level() <= DiagLevel::Information);
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Checks "ogg/noise-*.opus".
|
||||
*/
|
||||
void OverallTests::checkOggTestfile3()
|
||||
{
|
||||
CPPUNIT_ASSERT_EQUAL(ContainerFormat::Ogg, m_fileInfo.containerFormat());
|
||||
const auto tracks = m_fileInfo.tracks();
|
||||
CPPUNIT_ASSERT_EQUAL(1_st, tracks.size());
|
||||
for (const auto &track : tracks) {
|
||||
switch (track->id()) {
|
||||
case 1843569915:
|
||||
CPPUNIT_ASSERT_EQUAL(MediaType::Audio, track->mediaType());
|
||||
CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::Opus, track->format().general);
|
||||
CPPUNIT_ASSERT_EQUAL(static_cast<std::uint16_t>(2), track->channelCount());
|
||||
CPPUNIT_ASSERT_EQUAL(48000u, track->samplingFrequency());
|
||||
CPPUNIT_ASSERT_EQUAL(TimeSpan::fromSeconds(19.461), track->duration());
|
||||
break;
|
||||
default:
|
||||
CPPUNIT_FAIL("unknown track ID");
|
||||
}
|
||||
}
|
||||
const auto tags = m_fileInfo.tags();
|
||||
switch (m_tagStatus) {
|
||||
case TagStatus::Original:
|
||||
CPPUNIT_ASSERT(m_fileInfo.hasAnyTag());
|
||||
CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
|
||||
CPPUNIT_ASSERT_EQUAL("Lavf58.76.100"s, tags.front()->value(KnownField::Encoder).toString());
|
||||
CPPUNIT_ASSERT_EQUAL("eng"s, tags.front()->value(KnownField::Language).toString());
|
||||
[[fallthrough]];
|
||||
case TagStatus::TestMetaDataPresent:
|
||||
checkOggTestMetaDataCover();
|
||||
break;
|
||||
case TagStatus::Removed:
|
||||
CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
|
||||
}
|
||||
|
||||
if (m_tagStatus != TagStatus::Original) {
|
||||
CPPUNIT_ASSERT_MESSAGE("no warnings for non-broken file", m_diag.level() <= DiagLevel::Information);
|
||||
return;
|
||||
}
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("warning present", DiagLevel::Warning, m_diag.level());
|
||||
for (const auto &msg : m_diag) {
|
||||
if (msg.level() == DiagLevel::Warning) {
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("warning due to broken segment termination", "3 bytes left in last segment."s, msg.message());
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("warning relates to Vorbis comment", "parsing Vorbis comment"s, msg.context());
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Checks whether test meta data for OGG files has been applied correctly.
|
||||
*/
|
||||
|
@ -109,6 +165,18 @@ void OverallTests::checkOggTestMetaData()
|
|||
m_preservedMetaData.pop();
|
||||
}
|
||||
|
||||
void OverallTests::checkOggTestMetaDataCover()
|
||||
{
|
||||
// check whether a tag is assigned
|
||||
const auto tags = m_fileInfo.tags();
|
||||
const auto *const tag = m_fileInfo.vorbisComment();
|
||||
CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
|
||||
CPPUNIT_ASSERT(tag != nullptr);
|
||||
|
||||
const auto expectedCoverData = readFile(testFilePath("ogg/example-cover.png"));
|
||||
CPPUNIT_ASSERT_EQUAL_MESSAGE("expected cover assigned", std::string_view(expectedCoverData), tag->value(KnownField::Cover).data());
|
||||
}
|
||||
|
||||
void OverallTests::setOggTestMetaData()
|
||||
{
|
||||
// ensure a tag exists
|
||||
|
@ -124,6 +192,13 @@ void OverallTests::setOggTestMetaData()
|
|||
// TODO: set more fields
|
||||
}
|
||||
|
||||
void OverallTests::setOggTestMetaDataCover()
|
||||
{
|
||||
auto *const tag = m_fileInfo.createVorbisComment();
|
||||
const auto cover = readFile(testFilePath("ogg/example-cover.png"));
|
||||
tag->setValue(KnownField::Cover, TagValue(cover.data(), cover.size(), TagDataType::Picture));
|
||||
}
|
||||
|
||||
/*!
|
||||
* \brief Tests the Ogg parser via MediaFileInfo.
|
||||
* \remarks FLAC in Ogg is tested in testFlacParsing().
|
||||
|
@ -135,6 +210,7 @@ void OverallTests::testOggParsing()
|
|||
m_tagStatus = TagStatus::Original;
|
||||
parseFile(testFilePath("mtx-test-data/ogg/qt4dance_medium.ogg"), &OverallTests::checkOggTestfile1);
|
||||
parseFile(testFilePath("mtx-test-data/opus/v-opus.ogg"), &OverallTests::checkOggTestfile2);
|
||||
parseFile(testFilePath("ogg/noise-broken-segment-termination.opus"), &OverallTests::checkOggTestfile3);
|
||||
}
|
||||
|
||||
/*!
|
||||
|
@ -166,8 +242,10 @@ void OverallTests::testOggMaking()
|
|||
|
||||
// do actual tests
|
||||
m_tagStatus = (m_mode & RemoveTag) ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
|
||||
void (OverallTests::*modifyRoutine)(void) = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
|
||||
const auto modifyRoutine = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
|
||||
const auto modifyRoutineCover = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaDataCover;
|
||||
makeFile(workingCopyPath("mtx-test-data/ogg/qt4dance_medium.ogg"), modifyRoutine, &OverallTests::checkOggTestfile1);
|
||||
makeFile(workingCopyPath("mtx-test-data/opus/v-opus.ogg"), modifyRoutine, &OverallTests::checkOggTestfile2);
|
||||
makeFile(workingCopyPath("ogg/noise-without-cover.opus"), modifyRoutineCover, &OverallTests::checkOggTestfile3);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -76,6 +76,9 @@ struct TestFile {
|
|||
{ "mtx-test-data/ogg/qt4dance_medium.ogg", { "0b5429da9713be171c6ae0da69621261e8d5ddc9db3da872e5ade1a1c883decd" } },
|
||||
{ "mtx-test-data/opus/v-opus.ogg", { "e12adece4dbcccf2471b61c3ebd7c6576dee351d85809ab6f01d6f324d65b417" } },
|
||||
{ "misc/multiple_id3v2_4_values.mp3", { "da012a41213cdc49b2afe1457625d8baced1a64e2351f17b520bf82c6bfe4e03" } },
|
||||
{ "ogg/noise-without-cover.opus", { "ff578894c0c47aed4cc41ae94dee2886fe2c556593e44f731135f47bca870464" } },
|
||||
{ "ogg/noise-broken-segment-termination.opus", { "12835cf12b5b9fa70c239ae05e9d5bb768e715a2d61ef6301ed4af673088de45" } },
|
||||
{ "ogg/example-cover.png", { "897e1a2d0cfb79c1fe5068108bb34610c3758bd0b9a7e90c1702c4e6972e0801" } },
|
||||
};
|
||||
|
||||
/*!
|
||||
|
|
Loading…
Reference in New Issue