Files
QtPotato/autotests/subtitleparsertest.cpp

80 lines
3.1 KiB
C++
Raw Permalink Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "subtitleparser.h"
#include <QTest>
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\n<i>Hello</i>\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\n<v Anna>Hi!</v>\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<SubtitleCue> 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<SubtitleCue> 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"