4 #include "../abstracttrack.h" 5 #include "../mpegaudio/mpegaudioframe.h" 6 #include "../id3/id3v1tag.h" 7 #include "../id3/id3v2tag.h" 24 void OverallTests::checkMp3Testfile1()
27 const auto tracks = m_fileInfo.tracks();
28 CPPUNIT_ASSERT(tracks.size() == 1);
29 for(
const auto &track : tracks) {
33 CPPUNIT_ASSERT(track->channelCount() == 2);
34 CPPUNIT_ASSERT(track->channelConfig() ==
static_cast<byte
>(MpegChannelMode::JointStereo));
35 CPPUNIT_ASSERT(track->samplingFrequency() == 44100);
36 CPPUNIT_ASSERT(track->duration().seconds() == 3);
38 const auto tags = m_fileInfo.tags();
41 CPPUNIT_ASSERT(m_fileInfo.id3v1Tag());
42 CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().size() == 1);
43 CPPUNIT_ASSERT(tags.size() == 2);
44 for(
const auto &tag : tags) {
48 case TagType::Id3v1Tag:
51 CPPUNIT_ASSERT(tag->value(
KnownField::Album).toString() ==
"Double Nickels On The Dime");
55 case TagType::Id3v2Tag:
56 CPPUNIT_ASSERT(tag->value(
KnownField::Title).dataEncoding() == TagTextEncoding::Utf16LittleEndian);
61 CPPUNIT_ASSERT(tag->value(
KnownField::Album).toWString() == u
"Double Nickels On The Dime");
68 CPPUNIT_ASSERT(tag->value(KnownField::Length).toTimeSpan().isNull());
77 checkMp3TestMetaData();
80 CPPUNIT_ASSERT_EQUAL(0_st, tracks.size());
83 CPPUNIT_ASSERT(m_fileInfo.worstNotificationTypeIncludingRelatedObjects() <= NotificationType::Information);
89 void OverallTests::checkMp3TestMetaData()
97 CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
98 CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
100 CPPUNIT_ASSERT(id3v1Tag = m_fileInfo.id3v1Tag());
101 CPPUNIT_ASSERT(m_fileInfo.id3v2Tags().empty());
103 CPPUNIT_ASSERT(!m_fileInfo.id3v1Tag());
104 CPPUNIT_ASSERT(id3v2Tag = m_fileInfo.id3v2Tags().at(0).get());
113 m_preservedMetaData.pop();
120 CPPUNIT_ASSERT_EQUAL(m_testTitle, titleValue);
121 CPPUNIT_ASSERT_EQUAL(m_testComment, commentValue);
126 CPPUNIT_ASSERT_MESSAGE(
"not attempted to use UTF-8 in ID3v2.3", titleValue.
dataEncoding() == TagTextEncoding::Utf16LittleEndian);
128 CPPUNIT_ASSERT_MESSAGE(
"not attempted to use UTF-8 in ID3v2.3", commentValue.
dataEncoding() == TagTextEncoding::Utf16LittleEndian);
129 CPPUNIT_ASSERT_MESSAGE(
"not attempted to use UTF-8 in ID3v2.3", commentValue.
descriptionEncoding() == TagTextEncoding::Utf16LittleEndian);
131 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"description is also converted to UTF-16",
"s\0o\0m\0e\0 \0d\0e\0s\0c\0r\0i\0p\0t\0i\0\xf3\0n\0"s, commentValue.
description());
137 m_preservedMetaData.pop();
154 void OverallTests::checkMp3PaddingConstraints()
161 CPPUNIT_ASSERT(m_fileInfo.paddingSize() == 4096);
163 CPPUNIT_ASSERT(m_fileInfo.paddingSize() >= 1024);
164 CPPUNIT_ASSERT(m_fileInfo.paddingSize() <= (4096 + 1024));
173 void OverallTests::setMp3TestMetaData()
181 id3v1Tag = m_fileInfo.createId3v1Tag();
182 id3v2Tag = m_fileInfo.createId3v2Tag();
184 id3v1Tag = m_fileInfo.createId3v1Tag();
185 m_fileInfo.removeAllId3v2Tags();
187 m_fileInfo.removeId3v1Tag();
188 id3v2Tag = m_fileInfo.createId3v2Tag();
190 if(!(m_mode & Id3v1Only) && m_mode &
UseId3v24) {
195 for(
Tag *tag : initializer_list<Tag *>{id3v1Tag, id3v2Tag}) {
213 cerr << endl <<
"MP3 parser" << endl;
214 m_fileInfo.setForceFullParse(
false);
216 parseFile(TestUtilities::testFilePath(
"mtx-test-data/mp3/id3-tag-and-xing-header.mp3"), &OverallTests::checkMp3Testfile1);
224 void OverallTests::testMp3Making()
227 m_fileInfo.setForceFullParse(
true);
230 for(m_mode = 0; m_mode != 0x20; ++m_mode) {
240 m_fileInfo.setTagPosition(ElementPosition::Keep);
241 m_fileInfo.setIndexPosition(ElementPosition::Keep);
243 m_fileInfo.setMinPadding(m_mode & PaddingConstraints ? 1024 : 0);
244 m_fileInfo.setMaxPadding(m_mode & PaddingConstraints ? (4096 + 1024) : static_cast<size_t>(-1));
245 m_fileInfo.setForceTagPosition(
false);
246 m_fileInfo.setForceIndexPosition(
false);
249 list<string> testConditions;
250 if(m_mode & ForceRewring) {
251 testConditions.emplace_back(
"forcing rewrite");
255 testConditions.emplace_back(
"removing tag");
257 testConditions.emplace_back(
"ID3v1 and ID3v2");
260 testConditions.emplace_back(
"ID3v1 only");
262 testConditions.emplace_back(
"ID3v2 only");
264 if(m_mode & PaddingConstraints) {
265 testConditions.emplace_back(
"padding constraints");
267 if(m_mode & UseId3v24) {
268 testConditions.emplace_back(
"use ID3v2.4");
270 cerr << endl <<
"MP3 maker - testmode " << m_mode <<
": " << joinStrings(testConditions,
", ") << endl;
274 void (
OverallTests::*modifyRoutine)(void) = (m_mode &
RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setMp3TestMetaData;
275 makeFile(TestUtilities::workingCopyPath(
"mtx-test-data/mp3/id3-tag-and-xing-header.mp3"), modifyRoutine, &OverallTests::checkMp3Testfile1);
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
void testMp3Parsing()
Tests the MP3 parser via MediaFileInfo.