#include "trackselection.h" #include using namespace Qt::Literals::StringLiterals; using TrackSelection::Track; namespace { Track sub(int id, const QString &lang, const QString &codec = u"subrip"_s, bool forced = false, bool isDefault = false) { return {.id = id, .lang = lang, .codec = codec, .forced = forced, .isDefault = isDefault}; } } class TrackSelectionTest : public QObject { Q_OBJECT private Q_SLOTS: void matchesLanguageTags() { QVERIFY(TrackSelection::sameLanguage(u"en"_s, u"eng"_s)); QVERIFY(TrackSelection::sameLanguage(u"en-US"_s, u"English"_s)); QVERIFY(TrackSelection::sameLanguage(u"ger"_s, u"de"_s)); QVERIFY(TrackSelection::sameLanguage(u"vie"_s, u"vietnamese"_s)); QVERIFY(!TrackSelection::sameLanguage(u"en"_s, u"ru"_s)); QVERIFY(!TrackSelection::sameLanguage(u""_s, u""_s)); QVERIFY(!TrackSelection::sameLanguage(u"en"_s, u""_s)); } void detectsBitmapSubtitles() { QVERIFY(TrackSelection::isBitmapSubtitle(u"hdmv_pgs_subtitle"_s)); QVERIFY(TrackSelection::isBitmapSubtitle(u"dvd_subtitle"_s)); QVERIFY(!TrackSelection::isBitmapSubtitle(u"subrip"_s)); QVERIFY(!TrackSelection::isBitmapSubtitle(u"ass"_s)); QVERIFY(!TrackSelection::isBitmapSubtitle(u""_s)); } // VisionQuest release: Russian dub by default, two Russian subtitles before the // English one, no default subtitle, so mpv turns none on. void fallsBackInLanguageOrder() { const QList tracks{sub(1, u"rus"_s), sub(2, u"rus"_s), sub(3, u"eng"_s)}; QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"vi"_s, u"en"_s, u"rus"_s}, 0, true), 3); QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"vi"_s, u"en"_s, u"rus"_s}, 0, false), 0); QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"ru"_s, u"en"_s}, 0, true), 1); QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"ja"_s}, 0, true), 1); } void fallbackPrefersDefaultFullTextTracks() { const QList tracks{sub(1, u"en"_s, u"subrip"_s, true), sub(2, u"en"_s, u"hdmv_pgs_subtitle"_s), sub(3, u"en"_s), sub(4, u"fr"_s, u"subrip"_s, false, true)}; QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"en"_s}, 0, true), 3); QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"ja"_s}, 0, true), 4); // Only forced subtitles: leave subtitles off. QCOMPARE(TrackSelection::pickSubtitle({sub(1, u"en"_s, u"subrip"_s, true)}, {}, {u"en"_s}, 0, true), 0); } void preferredLanguagesWinOverMpvChoice() { const QList tracks{sub(1, u"ru"_s), sub(2, u"vi"_s), sub(3, u"en"_s)}; QCOMPARE(TrackSelection::pickSubtitle(tracks, {u"vi"_s, u"en"_s}, {u"en"_s}, 1, true), 2); QCOMPARE(TrackSelection::pickSubtitle(tracks, {u"de"_s, u"English"_s}, {u"en"_s}, 1, true), 3); // No preferred language present: keep mpv's choice. QCOMPARE(TrackSelection::pickSubtitle(tracks, {u"de"_s}, {u"en"_s}, 1, true), 1); } // A saved translation is turned on when the file opens, over mpv's choice and the // fallback, but not over a subtitle in a preferred language. void picksSavedTranslation() { const QList tracks{sub(1, u"rus"_s), sub(2, u"rus"_s, u"subrip"_s, false, true), sub(3, u"eng"_s), sub(4, u"vi"_s)}; QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"en"_s}, 0, true, 4), 4); QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"en"_s}, 2, true, 4), 4); QCOMPARE(TrackSelection::pickSubtitle(tracks, {u"en"_s}, {u"en"_s}, 0, true, 4), 3); // Automatic subtitles turned off: keep mpv's choice. QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"en"_s}, 0, false, 4), 0); QCOMPARE(TrackSelection::pickSubtitle(tracks, {}, {u"en"_s}, 0, true, 0), 3); } void picksAudioByPreference() { const QList tracks{sub(1, u"en"_s, u"aac"_s), sub(2, u"jpn"_s, u"aac"_s)}; QCOMPARE(TrackSelection::pickAudio(tracks, {u"ja"_s}, 1), 2); QCOMPARE(TrackSelection::pickAudio(tracks, {u"de"_s}, 1), 1); QCOMPARE(TrackSelection::pickAudio(tracks, {}, 1), 1); } void picksTextTranslationSource() { const QList tracks{sub(1, u"en"_s, u"hdmv_pgs_subtitle"_s), sub(2, u"ru"_s), sub(3, u"en"_s)}; QCOMPARE(TrackSelection::pickTranslationSource(tracks, {u"en"_s}, 2), 2); QCOMPARE(TrackSelection::pickTranslationSource(tracks, {u"en"_s}, 1), 3); QCOMPARE(TrackSelection::pickTranslationSource(tracks, {u"en"_s}, 0), 3); QCOMPARE(TrackSelection::pickTranslationSource(tracks, {u"ru"_s}, 0), 2); QCOMPARE(TrackSelection::pickTranslationSource({sub(1, u"en"_s, u"dvd_subtitle"_s)}, {u"en"_s}, 0), 0); } }; QTEST_GUILESS_MAIN(TrackSelectionTest) #include "trackselectiontest.moc"