Tag Parser 12.4.0
C++ library for reading and writing MP4 (iTunes), ID3, Vorbis, Opus, FLAC and Matroska tags
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
overallflac.cpp
Go to the documentation of this file.
1#include "./overall.h"
2
3#include "../abstracttrack.h"
4#include "../tag.h"
5
6#include <regex>
7
12void OverallTests::checkFlacTestfile1()
13{
14 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Flac, m_fileInfo.containerFormat());
15 const auto tracks = m_fileInfo.tracks();
16 CPPUNIT_ASSERT_EQUAL(1_st, tracks.size());
17 for (const auto &track : tracks) {
18 CPPUNIT_ASSERT_EQUAL(MediaType::Audio, track->mediaType());
19 CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::Flac, track->format().general);
20 CPPUNIT_ASSERT_EQUAL(static_cast<std::uint16_t>(2), track->channelCount());
21 CPPUNIT_ASSERT_EQUAL(44100u, track->samplingFrequency());
22 CPPUNIT_ASSERT_EQUAL(static_cast<std::uint16_t>(16), track->bitsPerSample());
23 CPPUNIT_ASSERT_EQUAL(4, track->duration().minutes());
24 }
25 const auto tags = m_fileInfo.tags();
26 switch (m_tagStatus) {
28 // ffmpeg is able to set some tags from the original file (mtx-test-data/alac/othertest-itunes.m4a)
29 CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
30 CPPUNIT_ASSERT_EQUAL("Sad Song"s, tags.front()->value(KnownField::Title).toString());
31 CPPUNIT_ASSERT_EQUAL("Oasis"s, tags.front()->value(KnownField::Artist).toString());
32 CPPUNIT_ASSERT_EQUAL("Don't Go Away (Apple Lossless)"s, tags.front()->value(KnownField::Album).toString());
33 CPPUNIT_ASSERT_EQUAL("Alternative & Punk"s, tags.front()->value(KnownField::Genre).toString());
34 TESTUTILS_ASSERT_LIKE("encoder", "Lavf.*", tags.front()->value(KnownField::Encoder).toString());
35 CPPUNIT_ASSERT_EQUAL("1998"s, tags.front()->value(KnownField::RecordDate).toString());
36 CPPUNIT_ASSERT(tags.front()->value(KnownField::Comment).isEmpty());
37 //CPPUNIT_ASSERT(tags.front()->value(KnownField::Cover).dataSize() == 0x58f3);
38 //CPPUNIT_ASSERT(BE::toInt<std::uint64_t>(tags.front()->value(KnownField::Cover).dataPointer()) == 0xFFD8FFE000104A46);
39 CPPUNIT_ASSERT_EQUAL(PositionInSet(3, 4), tags.front()->value(KnownField::TrackPosition).toPositionInSet());
40 CPPUNIT_ASSERT_EQUAL(PositionInSet(1, 1), tags.front()->value(KnownField::DiskPosition).toPositionInSet());
41 break;
43 checkOggTestMetaData();
44 break;
46 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
47 }
48
49 CPPUNIT_ASSERT(m_diag.level() <= DiagLevel::Information);
50}
51
56void OverallTests::checkFlacTestfile2()
57{
58 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Ogg, m_fileInfo.containerFormat());
59 const auto tracks = m_fileInfo.tracks();
60 CPPUNIT_ASSERT_EQUAL(1_st, tracks.size());
61 for (const auto &track : tracks) {
62 CPPUNIT_ASSERT_EQUAL(MediaType::Audio, track->mediaType());
63 CPPUNIT_ASSERT_EQUAL(GeneralMediaFormat::Flac, track->format().general);
64 CPPUNIT_ASSERT_EQUAL(static_cast<std::uint16_t>(2), track->channelCount());
65 CPPUNIT_ASSERT_EQUAL(44100u, track->samplingFrequency());
66 CPPUNIT_ASSERT_EQUAL(static_cast<std::uint16_t>(16), track->bitsPerSample());
67 CPPUNIT_ASSERT_EQUAL(4, track->duration().minutes());
68 }
69 const auto tags = m_fileInfo.tags();
70 switch (m_tagStatus) {
72 CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
73 break;
75 checkOggTestMetaData();
76 break;
78 CPPUNIT_ASSERT_EQUAL(0_st, tags.size());
79 }
80
81 // check for unexpected critical notifications or warnings
82 if (m_tagStatus == TagStatus::Removed) {
83 bool gotMessageAboutMissingVorbisComment = false;
84 for (const auto &msg : m_diag) {
85 if (msg.level() == DiagLevel::Critical) {
86 CPPUNIT_ASSERT_EQUAL("Ogg page after FLAC-to-Ogg mapping header doesn't contain Vorbis comment."s, msg.message());
87 gotMessageAboutMissingVorbisComment = true;
88 continue;
89 }
90 CPPUNIT_ASSERT(msg.level() <= DiagLevel::Information);
91 }
92 CPPUNIT_ASSERT(gotMessageAboutMissingVorbisComment);
93 } else {
94 CPPUNIT_ASSERT(m_diag.level() <= DiagLevel::Information);
95 }
96}
97
102{
103 cerr << endl << "FLAC parser" << endl;
104 m_fileInfo.setForceFullParse(false);
105 m_tagStatus = TagStatus::Original;
106 parseFile(testFilePath("flac/test.flac"), &OverallTests::checkFlacTestfile1);
107 parseFile(testFilePath("flac/test.ogg"), &OverallTests::checkFlacTestfile2);
108}
109
115{
116 // full parse is required to determine padding
117 m_fileInfo.setForceFullParse(true);
118
119 // do the test under different conditions
120 for (m_mode = 0; m_mode != 0x2; ++m_mode) {
121 using namespace SimpleTestFlags;
122
123 // TODO: setup test conditions
124
125 // print test conditions
126 list<string> testConditions;
127 if (m_mode & RemoveTag) {
128 testConditions.emplace_back("removing tag");
129 } else {
130 testConditions.emplace_back("modifying tag");
131 }
132 cerr << endl << "FLAC maker - testmode " << m_mode << ": " << joinStrings(testConditions, ", ") << endl;
133
134 // do actual tests
135 m_tagStatus = (m_mode & RemoveTag) ? TagStatus::Removed : TagStatus::TestMetaDataPresent;
136 void (OverallTests::*modifyRoutine)(void) = (m_mode & RemoveTag) ? &OverallTests::removeAllTags : &OverallTests::setOggTestMetaData;
137 makeFile(workingCopyPath("flac/test.flac"), modifyRoutine, &OverallTests::checkFlacTestfile1);
138 makeFile(workingCopyPath("flac/test.ogg"), modifyRoutine, &OverallTests::checkFlacTestfile2);
139 }
140}
The OverallTests class tests reading and writing tags and parsing technical information for all suppo...
Definition overall.h:40
void testFlacParsing()
Tests the FLAC parser via MediaFileInfo.
void testFlacMaking()
Tests the FLAC maker via MediaFileInfo.
DiagLevel level() const
Returns the worst diag level present in the container.
std::vector< AbstractTrack * > tracks() const
Returns the tracks for the current file.
void setForceFullParse(bool forceFullParse)
Sets whether forcing a full parse is enabled.
void tags(std::vector< Tag * > &tags) const
Stores all tags assigned to the current file in the specified vector.
ContainerFormat containerFormat() const
Returns the container format of the current file.
@ TestMetaDataPresent