Martchus
6b469f1c26
Different media/tag formats specify languages and countries differently. This change introduces a Locale class to keep track of the format being used. So far there are no automatic conversions implemented so it is entirely up to the user to pass valid values using a format which matches the one required by the media/tag format. This change also adds support for Matroska's IETF elements so at least the raw value can be read, written and is preserved.
192 lines
8.0 KiB
C++
192 lines
8.0 KiB
C++
#include "./helper.h"
|
|
|
|
#include "../abstracttrack.h"
|
|
#include "../mediafileinfo.h"
|
|
#include "../tag.h"
|
|
|
|
#include <c++utilities/tests/testutils.h>
|
|
using namespace CppUtilities;
|
|
|
|
#include <cppunit/TestFixture.h>
|
|
#include <cppunit/extensions/HelperMacros.h>
|
|
|
|
#include <cstdio>
|
|
|
|
using namespace std;
|
|
using namespace CppUtilities::Literals;
|
|
using namespace TagParser;
|
|
|
|
using namespace CPPUNIT_NS;
|
|
|
|
/*!
|
|
* \brief The MediaFileInfoTests tests convenience methods provided by TagParser::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() override;
|
|
void tearDown() override;
|
|
|
|
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<std::uint64_t>(0), file.size());
|
|
file.reportPathChanged(testFilePath("unsupported.bin"));
|
|
file.open(true);
|
|
CPPUNIT_ASSERT(file.isOpen());
|
|
CPPUNIT_ASSERT(file.isReadOnly());
|
|
CPPUNIT_ASSERT_EQUAL(static_cast<std::uint64_t>(41), file.size());
|
|
}
|
|
|
|
void MediaFileInfoTests::testParsingUnsupportedFile()
|
|
{
|
|
Diagnostics diag;
|
|
MediaFileInfo file(testFilePath("unsupported.bin"));
|
|
file.parseContainerFormat(diag);
|
|
file.parseTags(diag);
|
|
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotSupported, file.containerParsingStatus());
|
|
CPPUNIT_ASSERT_EQUAL(ParsingStatus::NotSupported, 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()
|
|
{
|
|
Diagnostics diag;
|
|
MediaFileInfo file(testFilePath("mtx-test-data/aac/he-aacv2-ps.m4a"));
|
|
file.open(true);
|
|
file.parseContainerFormat(diag);
|
|
file.parseTags(diag);
|
|
file.parseAttachments(diag);
|
|
file.close();
|
|
CPPUNIT_ASSERT_THROW_MESSAGE("std::ios_base::failure thrown if file closed", file.parseTracks(diag), std::ios_base::failure);
|
|
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(Diagnostics({ DiagMessage(DiagLevel::Information,
|
|
"Parsing attachments is not implemented for the container format of the file.", "parsing attachments") }),
|
|
diag);
|
|
CPPUNIT_ASSERT_EQUAL(DiagLevel::Information, diag.level());
|
|
|
|
// 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()
|
|
{
|
|
Diagnostics diag;
|
|
MediaFileInfo file(testFilePath("matroska_wave1/test1.mkv"));
|
|
file.open(true);
|
|
file.parseEverything(diag);
|
|
// 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(diag);
|
|
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_EQUAL(Diagnostics(), diag);
|
|
CPPUNIT_ASSERT_EQUAL(DiagLevel::None, diag.level());
|
|
diag.emplace_back(DiagLevel::Warning, "warning", "test");
|
|
CPPUNIT_ASSERT_EQUAL(DiagLevel::Warning, diag.level());
|
|
diag.emplace_back(DiagLevel::Critical, "error", "test");
|
|
CPPUNIT_ASSERT_EQUAL(DiagLevel::Critical, diag.level());
|
|
|
|
// track info / available languages
|
|
file.tracks().back()->setLocale(Locale("eng"sv, LocaleFormat::ISO_639_2_B));
|
|
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: English"s, file.tracks()[1]->label());
|
|
CPPUNIT_ASSERT_EQUAL("MS-MPEG-4-480p / MP3-2ch-eng"s, file.technicalSummary());
|
|
}
|