Test more methods of MediaFileInfo

This commit is contained in:
Martchus 2017-08-17 18:43:19 +02:00
parent b9fb3c9695
commit 3924b5f56b
5 changed files with 220 additions and 5 deletions

View File

@ -156,6 +156,7 @@ set(TEST_SRC_FILES
tests/overallogg.cpp
tests/overallflac.cpp
tests/tagvalue.cpp
tests/mediafileinfo.cpp
)
set(DOC_FILES

BIN
testfiles/unsupported.bin Normal file

Binary file not shown.

View File

@ -19,13 +19,21 @@ inline std::ostream &operator <<(std::ostream &os, const Media::TagValue &tagVal
}
/*!
* \brief Prints a PositionInSet to enable CPPUNIT_ASSERT_EQUAL for tag values.
* \brief Prints a PositionInSet to enable using it in CPPUNIT_ASSERT_EQUAL.
*/
inline std::ostream &operator <<(std::ostream &os, const Media::PositionInSet &pos)
{
return os << pos.toString();
}
/*!
* \brief Prints a Notification to enable using it in CPPUNIT_ASSERT_EQUAL.
*/
inline std::ostream &operator <<(std::ostream &os, const Media::Notification &n)
{
return os << n.typeName() << ':' << ' ' << n.message() << ' ' << '(' << n.context() << ')';
}
}
#endif // TAGPARSER_TEST_HELPER

204
tests/mediafileinfo.cpp Normal file
View File

@ -0,0 +1,204 @@
#include "./helper.h"
#include "../mediafileinfo.h"
#include "../abstracttrack.h"
#include "../tag.h"
#include <c++utilities/io/catchiofailure.h>
#include <c++utilities/tests/testutils.h>
using namespace TestUtilities;
#include <cppunit/TestFixture.h>
#include <cppunit/extensions/HelperMacros.h>
#include <cstdio>
using namespace std;
using namespace Media;
using namespace IoUtilities;
using namespace TestUtilities::Literals;
using namespace CPPUNIT_NS;
/*!
* \brief The MediaFileInfoTests tests convenience methods provided by MediaFileInfo.
* \remarks It only tests parsing a simple Mkv/Mp4. Parsing different formats with different settings is tested in OverallTests.
*/
class MediaFileInfoTests : public TestFixture {
CPPUNIT_TEST_SUITE(MediaFileInfoTests);
CPPUNIT_TEST(testInitialStatus);
CPPUNIT_TEST(testFileSystemMethods);
CPPUNIT_TEST(testParsingUnsupportedFile);
CPPUNIT_TEST(testFullParseAndFurtherProperties);
CPPUNIT_TEST_SUITE_END();
public:
void setUp();
void tearDown();
void testInitialStatus();
void testFileSystemMethods();
void testParsingUnsupportedFile();
void testPartialParsingAndTagCreationOfMp4File();
void testFullParseAndFurtherProperties();
};
CPPUNIT_TEST_SUITE_REGISTRATION(MediaFileInfoTests);
void MediaFileInfoTests::setUp()
{
}
void MediaFileInfoTests::tearDown()
{
}
void MediaFileInfoTests::testInitialStatus()
{
const MediaFileInfo file;
CPPUNIT_ASSERT(!file.areTagsSupported());
CPPUNIT_ASSERT(!file.areTracksSupported());
CPPUNIT_ASSERT(!file.areChaptersSupported());
CPPUNIT_ASSERT(!file.areAttachmentsSupported());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.containerParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tagsParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tracksParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.chaptersParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.attachmentsParsingStatus());
CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown, file.containerFormat());
}
void MediaFileInfoTests::testFileSystemMethods()
{
MediaFileInfo file("/usr/bin/unsupported.bin");
CPPUNIT_ASSERT_EQUAL("/usr/bin"s, file.containingDirectory());
CPPUNIT_ASSERT_EQUAL("unsupported.bin"s, file.fileName());
CPPUNIT_ASSERT_EQUAL("unsupported"s, file.fileName(true));
CPPUNIT_ASSERT_EQUAL("/usr/bin/unsupported"s, file.pathWithoutExtension());
CPPUNIT_ASSERT_EQUAL(".bin"s, file.extension());
CPPUNIT_ASSERT_EQUAL(static_cast<uint64>(0), file.size());
file.reportPathChanged(testFilePath("unsupported.bin"));
file.open(true);
CPPUNIT_ASSERT(file.isOpen());
CPPUNIT_ASSERT(file.isReadOnly());
CPPUNIT_ASSERT_EQUAL(static_cast<uint64>(41), file.size());
}
void MediaFileInfoTests::testParsingUnsupportedFile()
{
MediaFileInfo file(testFilePath("unsupported.bin"));
file.parseContainerFormat();
file.parseTags();
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotSupported, file.containerParsingStatus());
// NOTE: parsing tags of unsupported container is actually supported: there is nothing to do
// but maybe not what one would expect?
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.tagsParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tracksParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.chaptersParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.attachmentsParsingStatus());
CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown, file.containerFormat());
file.invalidate();
}
void MediaFileInfoTests::testPartialParsingAndTagCreationOfMp4File()
{
MediaFileInfo file(testFilePath("mtx-test-data/aac/he-aacv2-ps.m4a"));
file.open(true);
file.parseContainerFormat();
file.parseTags();
file.parseAttachments();
file.close();
try {
file.parseTracks();
CPPUNIT_FAIL("expected std::ios_base::failure because file has been closed");
} catch(...) {
catchIoFailure();
}
CPPUNIT_ASSERT(file.areTagsSupported());
CPPUNIT_ASSERT(file.areTracksSupported());
CPPUNIT_ASSERT(!file.areChaptersSupported());
CPPUNIT_ASSERT(!file.areAttachmentsSupported());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.containerParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.tagsParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.tracksParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotParsedYet, file.chaptersParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotSupported, file.attachmentsParsingStatus());
CPPUNIT_ASSERT_EQUAL(0_st, file.trackCount());
CPPUNIT_ASSERT_EQUAL(ContainerFormat::Mp4, file.containerFormat());
CPPUNIT_ASSERT_EQUAL(NotificationList({
Notification(NotificationType::Information,
"Parsing attachments is not implemented for the container format of the file.",
"parsing attachments")
}), file.gatherRelatedNotifications());
CPPUNIT_ASSERT_EQUAL(NotificationType::Information, file.worstNotificationTypeIncludingRelatedObjects());
// create/remove tag
CPPUNIT_ASSERT_EQUAL(0_st, file.matroskaTags().size());
CPPUNIT_ASSERT(!file.id3v1Tag());
CPPUNIT_ASSERT_EQUAL(0_st, file.id3v2Tags().size());
CPPUNIT_ASSERT(!file.vorbisComment());
CPPUNIT_ASSERT(!file.mp4Tag());
// NOTE: Maybe it should not be possible to create ID3 tags for MP4 file? It will be ignored anyways.
CPPUNIT_ASSERT(file.createId3v1Tag());
CPPUNIT_ASSERT(file.id3v1Tag());
CPPUNIT_ASSERT(file.createId3v2Tag());
CPPUNIT_ASSERT_EQUAL(1_st, file.id3v2Tags().size());
CPPUNIT_ASSERT(!file.createVorbisComment());
CPPUNIT_ASSERT(!file.vorbisComment());
CPPUNIT_ASSERT(!file.removeVorbisComment());
file.createAppropriateTags();
CPPUNIT_ASSERT(file.mp4Tag());
}
void MediaFileInfoTests::testFullParseAndFurtherProperties()
{
MediaFileInfo file(testFilePath("matroska_wave1/test1.mkv"));
file.open(true);
file.parseEverything();
// calling parse methods twice should not do anything (and hence can not fail anymore because the file has already been closed)
file.close();
file.parseEverything();
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.containerParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.tagsParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.tracksParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.chaptersParsingStatus());
CPPUNIT_ASSERT_EQUAL(ParsingStatus::Ok, file.attachmentsParsingStatus());
CPPUNIT_ASSERT_EQUAL(ContainerFormat::Matroska, file.containerFormat());
// general info
CPPUNIT_ASSERT(file.container());
CPPUNIT_ASSERT(file.areTagsSupported());
CPPUNIT_ASSERT(file.hasAnyTag());
CPPUNIT_ASSERT_EQUAL(1_st, file.tags().size());
CPPUNIT_ASSERT_EQUAL(1_st, file.matroskaTags().size());
CPPUNIT_ASSERT(!file.mp4Tag());
CPPUNIT_ASSERT(!file.vorbisComment());
CPPUNIT_ASSERT(file.areTracksSupported());
CPPUNIT_ASSERT_EQUAL(2_st, file.trackCount());
CPPUNIT_ASSERT(file.areChaptersSupported());
CPPUNIT_ASSERT_EQUAL(0_st, file.chapters().size());
CPPUNIT_ASSERT(file.areAttachmentsSupported());
CPPUNIT_ASSERT_EQUAL(0_st, file.attachments().size());
// notifications
CPPUNIT_ASSERT(!file.hasNotifications());
CPPUNIT_ASSERT(!file.haveRelatedObjectsNotifications());
CPPUNIT_ASSERT_EQUAL(NotificationList(), file.gatherRelatedNotifications());
CPPUNIT_ASSERT_EQUAL(NotificationType::None, file.worstNotificationTypeIncludingRelatedObjects());
file.container()->addNotification(NotificationType::Warning, "warning", "test");
CPPUNIT_ASSERT(file.haveRelatedObjectsNotifications());
CPPUNIT_ASSERT_EQUAL(NotificationType::Warning, file.worstNotificationTypeIncludingRelatedObjects());
file.tags().back()->addNotification(NotificationType::Critical, "error", "test");
CPPUNIT_ASSERT_EQUAL(NotificationType::Critical, file.worstNotificationTypeIncludingRelatedObjects());
CPPUNIT_ASSERT(file.haveRelatedObjectsNotifications());
CPPUNIT_ASSERT_EQUAL(2_st, file.gatherRelatedNotifications().size());
// track info / available languages
file.tracks().back()->setLanguage("eng");
CPPUNIT_ASSERT_EQUAL(unordered_set<string>({"eng"}), file.availableLanguages());
CPPUNIT_ASSERT_EQUAL(unordered_set<string>({}), file.availableLanguages(MediaType::Text));
CPPUNIT_ASSERT_EQUAL("ID: 2422994868, type: Video"s, file.tracks()[0]->label());
CPPUNIT_ASSERT_EQUAL("ID: 3653291187, type: Audio, language: \"eng\""s, file.tracks()[1]->label());
CPPUNIT_ASSERT_EQUAL("MS-MPEG-4-480p / MP3-2ch-eng"s, file.technicalSummary());
}

View File

@ -33,8 +33,9 @@ void OverallTests::checkOggTestfile1()
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 1);
CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "ffmpeg2theora 0.13");
CPPUNIT_ASSERT(m_fileInfo.hasAnyTag());
CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
CPPUNIT_ASSERT_EQUAL("ffmpeg2theora 0.13"s, tags.front()->value(KnownField::Encoder).toString());
// Theora tags are currently not supported and hence only the Vorbis comment is
// taken into account here
break;
@ -70,8 +71,9 @@ void OverallTests::checkOggTestfile2()
const auto tags = m_fileInfo.tags();
switch(m_tagStatus) {
case TagStatus::Original:
CPPUNIT_ASSERT(tags.size() == 1);
CPPUNIT_ASSERT(tags.front()->value(KnownField::Encoder).toString() == "opusenc from opus-tools 0.1.6");
CPPUNIT_ASSERT(m_fileInfo.hasAnyTag());
CPPUNIT_ASSERT_EQUAL(1_st, tags.size());
CPPUNIT_ASSERT_EQUAL("opusenc from opus-tools 0.1.6"s, tags.front()->value(KnownField::Encoder).toString());
break;
case TagStatus::TestMetaDataPresent:
checkOggTestMetaData();