#include "subtitleparser.h" #include using namespace Qt::Literals::StringLiterals; class SubtitleParserTest : public QObject { Q_OBJECT private Q_SLOTS: void parsesSrt() { const QString srt = u"1\r\n00:00:01,000 --> 00:00:02,500\r\nHello\r\nthere\r\n\r\n" "2\r\n00:01:00,000 --> 00:01:01,000 X1:10\r\n{\\an8}Top line\r\n"_s; const auto cues = Subtitles::parseSrt(srt); QCOMPARE(cues.size(), 2); QCOMPARE(cues.at(0), (SubtitleCue{1000, 2500, u"Hello\nthere"_s})); QCOMPARE(cues.at(1), (SubtitleCue{60000, 61000, u"Top line"_s})); } void parsesWebVtt() { const QString vtt = u"WEBVTT\n\nintro\n00:05.250 --> 00:07.000 align:start\nHi!\n\n" "01:00:00.000 --> 01:00:01.000\nLater\n"_s; const auto cues = Subtitles::parseSrt(vtt); QCOMPARE(cues.size(), 2); QCOMPARE(cues.at(0), (SubtitleCue{5250, 7000, u"Hi!"_s})); QCOMPARE(cues.at(1), (SubtitleCue{3600000, 3601000, u"Later"_s})); } void parsesAss() { const QString ass = u"[Script Info]\nTitle: test\n\n[Events]\n" "Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text\n" "Dialogue: 0,0:00:01.50,0:00:03.00,Default,,0,0,0,,{\\i1}Wait,{\\i0} what?\\NNo way.\n" "Comment: 0,0:00:04.00,0:00:05.00,Default,,0,0,0,,ignored\n" "Dialogue: 0,0:00:04.00,0:00:05.00,Sign,,0,0,0,,{\\p1}m 0 0 l 10 0 10 10{\\p0}\n"_s; const auto cues = Subtitles::parseAss(ass); QCOMPARE(cues.size(), 2); QCOMPARE(cues.at(0), (SubtitleCue{1500, 3000, u"Wait, what?\nNo way."_s})); // Vector drawings carry no words. QVERIFY(cues.at(1).text.isEmpty()); } void mergesRepeatedFrames() { QList cues{ {0, 1000, u"Hello"_s}, {1000, 1500, u""_s}, {5000, 6000, u"Sign"_s}, // too far from the earlier pieces: a new cue {7000, 7040, u"Xkcd Qwer"_s}, // a lone 40 ms animation frame }; // One sign drawn frame by frame, 40 ms each. for (qint64 t = 2000; t < 2400; t += 40) { cues.append({t, t + 40, u"Sign"_s}); } const auto merged = Subtitles::mergeRepeated(cues); QCOMPARE(merged.size(), 3); QCOMPARE(merged.at(0), (SubtitleCue{0, 1000, u"Hello"_s})); QCOMPARE(merged.at(1), (SubtitleCue{2000, 2400, u"Sign"_s})); QCOMPARE(merged.at(2), (SubtitleCue{5000, 6000, u"Sign"_s})); } void writesSrtThatParsesBack() { const QList cues{ {1000, 2500, u"Xin chào\nbạn"_s}, {3723004, 3724000, u"Một giờ sau"_s}, }; const QString srt = Subtitles::toSrt(cues); QVERIFY(srt.startsWith(u"1\n00:00:01,000 --> 00:00:02,500\nXin chào\nbạn\n\n"_s)); QCOMPARE(Subtitles::parseSrt(srt), cues); } }; QTEST_GUILESS_MAIN(SubtitleParserTest) #include "subtitleparsertest.moc"