4 #include "../statusprovider.h" 5 #include "../tagtarget.h" 6 #include "../signature.h" 8 #include "../aspectratio.h" 9 #include "../mediaformat.h" 10 #include "../mediafileinfo.h" 11 #include "../exceptions.h" 12 #include "../backuphelper.h" 14 #include <c++utilities/conversion/stringbuilder.h> 15 #include <c++utilities/io/catchiofailure.h> 16 #include <c++utilities/tests/testutils.h> 19 #include <cppunit/TestFixture.h> 20 #include <cppunit/extensions/HelperMacros.h> 25 using namespace Media;
50 CPPUNIT_TEST(testSize);
51 CPPUNIT_TEST(testStatusProvider);
52 CPPUNIT_TEST(testTagTarget);
53 CPPUNIT_TEST(testSignature);
54 CPPUNIT_TEST(testMargin);
55 CPPUNIT_TEST(testAspectRatio);
56 CPPUNIT_TEST(testMediaFormat);
58 CPPUNIT_TEST(testBackupFile);
60 CPPUNIT_TEST_SUITE_END();
67 void testStatusProvider();
71 void testAspectRatio();
72 void testMediaFormat();
74 void testBackupFile();
90 static_assert(
Size().isNull(),
"Size::isNull()");
91 static_assert(!
Size(3, 4).isNull(),
"Size::isNull()");
92 static_assert(
Size(3, 4).resolution() == 12,
"Size::resolution");
94 Size size(1920, 1080);
95 CPPUNIT_ASSERT_EQUAL(
"width: 1920, height: 1080"s, size.
toString());
96 CPPUNIT_ASSERT_EQUAL(
"1080p"s,
string(size.
abbreviation()));
99 CPPUNIT_ASSERT_EQUAL(
"720p"s,
string(size.
abbreviation()));
104 const string context(
"unit tests");
110 status.
addNotification(NotificationType::Debug,
"debug notification", context);
115 CPPUNIT_ASSERT_EQUAL(
"warning"s, status.
notifications().back().message());
134 bool statusUpdateReceived =
false, firstStatusUpdate =
true;
136 CPPUNIT_ASSERT(&status == &sender);
137 if(firstStatusUpdate) {
140 firstStatusUpdate =
false;
143 statusUpdateReceived =
true;
146 CPPUNIT_ASSERT_MESSAGE(
"status update for updated status received", statusUpdateReceived);
148 statusUpdateReceived =
false;
150 CPPUNIT_ASSERT_MESSAGE(
"status update for updated percentage received", statusUpdateReceived);
151 statusUpdateReceived =
false;
153 CPPUNIT_ASSERT_MESSAGE(
"status update for new notification received", statusUpdateReceived);
154 statusUpdateReceived =
false;
157 CPPUNIT_ASSERT_MESSAGE(
"no status update received after callback unregistered", !statusUpdateReceived);
162 statusUpdateReceived =
false;
164 CPPUNIT_ASSERT(&status == &sender);
167 statusUpdateReceived =
true;
170 CPPUNIT_ASSERT(statusUpdateReceived);
176 CPPUNIT_ASSERT(target.
isEmpty());
177 CPPUNIT_ASSERT_EQUAL_MESSAGE(
"default level is 50", 50ul, target.
level());
178 CPPUNIT_ASSERT_EQUAL(
"level 50"s, target.
toString(TagTargetLevel::Unspecified));
179 target =
TagTarget(30, {1, 2, 3}, {4}, {5, 6}, {7, 8, 9});
180 CPPUNIT_ASSERT(!target.isEmpty());
181 const auto mapping = [] (uint64 level) {
184 CPPUNIT_ASSERT_EQUAL(
"level 30 'track, song, chapter', track 1, track 2, track 3, chapter 4, edition 5, edition 6, attachment 7, attachment 8, attachment 9"s, target.toString(mapping));
186 CPPUNIT_ASSERT_EQUAL(
"level 40, track 1, track 2, track 3, chapter 4, edition 5, edition 6, attachment 7, attachment 8, attachment 9"s, target.toString(mapping));
187 target.setLevelName(
"test");
188 CPPUNIT_ASSERT_EQUAL(
"level 40 'test', track 1, track 2, track 3, chapter 4, edition 5, edition 6, attachment 7, attachment 8, attachment 9"s, target.toString(mapping));
189 CPPUNIT_ASSERT(target ==
TagTarget(40, {1, 2, 3}, {4}, {5, 6}, {7, 8, 9}));
191 CPPUNIT_ASSERT(target.isEmpty());
197 const unsigned char xzHead[12] = {
198 0xfd, 0x37, 0x7a, 0x58,
199 0x5a, 0x00, 0x00, 0x04,
200 0xe6, 0xd6, 0xb4, 0x46
204 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown,
parseSignature(reinterpret_cast<const char *>(xzHead), 3));
205 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown,
parseSignature(reinterpret_cast<const char *>(xzHead), 2));
206 CPPUNIT_ASSERT_EQUAL(ContainerFormat::Unknown,
parseSignature(reinterpret_cast<const char *>(xzHead), 0));
208 const auto containerFormat =
parseSignature(reinterpret_cast<const char *>(xzHead),
sizeof(xzHead));
217 static_assert(
Margin().isNull(),
"empty margin");
218 static_assert(!
Margin(0, 2).isNull(),
"non-empty margin");
220 CPPUNIT_ASSERT_EQUAL(
"top: 1; left: 2; bottom: 3; right: 4"s,
Margin(1, 2, 3, 4).toString());
225 static_assert(!
AspectRatio().isValid(),
"invalid aspect ratio");
226 static_assert(
AspectRatio(16, 9).isValid(),
"valid aspect ratio");
227 static_assert(
AspectRatio(16, 9).isExtended(),
"extended aspect ratio");
230 CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(16), ratio.
numerator);
231 CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(11), ratio.
denominator);
233 CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(0), ratio2.
numerator);
234 CPPUNIT_ASSERT_EQUAL(static_cast<uint16>(0), ratio2.
denominator);
241 CPPUNIT_ASSERT_EQUAL(
"Advanced Audio Coding"s,
string(aac.
name()));
242 CPPUNIT_ASSERT_EQUAL(
"AAC"s,
string(aac.
abbreviation()));
249 CPPUNIT_ASSERT_EQUAL(
"Advanced Audio Coding Low Complexity Profile"s,
string(aac.
name()));
250 CPPUNIT_ASSERT_EQUAL(
"MPEG-4 AAC-LC"s,
string(aac.
abbreviation()));
252 CPPUNIT_ASSERT_EQUAL(
"Spectral Band Replication / HE-AAC"s,
string(aac.
extensionName()));
256 void UtilitiesTests::testBackupFile()
258 using namespace BackupHelper;
266 const auto workingDir(file.containingDirectory());
270 string backupPath1, backupPath2;
271 NativeFileStream backupStream1, backupStream2;
273 CPPUNIT_ASSERT_EQUAL(workingDir +
"/unsupported.bin.bak", backupPath1);
276 file.stream().open(file.path(), ios_base::out);
277 file.stream() <<
"test1" << endl;
281 CPPUNIT_ASSERT_EQUAL(workingDir +
"/unsupported.bin.1.bak", backupPath2);
284 backupStream2.close();
285 remove(backupPath2.data());
286 file.stream().open(file.path(), ios_base::out);
287 file.stream() <<
"test2" << endl;
293 CPPUNIT_FAIL(
"renaming failed because backup dir does not exist");
295 const char *what = catchIoFailure();
296 CPPUNIT_ASSERT(strstr(what,
"Unable to rename original file before rewriting it."));
298 backupStream2.clear();
299 workingCopyPathMode(
"bak/unsupported.bin", WorkingCopyMode::NoCopy);
301 CPPUNIT_ASSERT_EQUAL(workingDir +
"/bak/unsupported.bin", backupPath2);
304 backupStream2.close();
305 CPPUNIT_ASSERT_EQUAL(0,
remove(backupPath2.data()));
306 CPPUNIT_ASSERT_EQUAL(0,
remove(argsToString(workingDir %
'/' +
backupDirectory()).data()));
309 backupStream1.seekg(0, ios_base::end);
310 CPPUNIT_ASSERT_EQUAL(41_st, static_cast<size_t>(backupStream1.tellg()));
317 file.stream().seekg(0x1D);
318 CPPUNIT_ASSERT_EQUAL(0x34_st, static_cast<size_t>(file.stream().get()));
321 CPPUNIT_ASSERT_MESSAGE(
"file has no critical notifications yet", !file.hasCriticalNotifications());
333 CPPUNIT_ASSERT(!file.hasCriticalNotifications());
334 CPPUNIT_ASSERT(file.hasNotifications());
335 CPPUNIT_ASSERT_EQUAL(
"Rewriting the file to apply changed tag information has been aborted."s, file.notifications().front().message());
336 CPPUNIT_ASSERT_EQUAL(
"The original file has been restored."s, file.notifications().back().message());
337 file.invalidateNotifications();
346 CPPUNIT_ASSERT(file.hasCriticalNotifications());
347 CPPUNIT_ASSERT_EQUAL(
"Rewriting the file to apply changed tag information failed."s, file.notifications().front().message());
348 CPPUNIT_ASSERT_EQUAL(
"The original file has been restored."s, file.notifications().back().message());
349 file.invalidateNotifications();
354 throwIoFailure(
"simulated IO failure");
358 CPPUNIT_FAIL(
"IO failure rethrown");
363 CPPUNIT_ASSERT(file.hasCriticalNotifications());
364 CPPUNIT_ASSERT_EQUAL(
"An IO error occured when rewriting the file to apply changed tag information."s, file.notifications().front().message());
365 CPPUNIT_ASSERT_EQUAL(
"The original file has been restored."s, file.notifications().back().message());
366 file.invalidateNotifications();
368 CPPUNIT_ASSERT_EQUAL(0,
remove(file.path().data()));
The UtilitiesTests class tests various utility classes and functions of the tagparser library...
Contains utility classes helping to read and write streams.
CPPUNIT_TEST_SUITE_REGISTRATION(UtilitiesTests)
The TestStatusProvider class helps testing the StatusProvider class.
void testStatusProvider()