summaryrefslogtreecommitdiffstats
path: root/tests/auto/qvoice/tst_qvoice.cpp
blob: 50472d5bca5b1007dd0c8d57dc251949a88bb576 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only


#include <QTest>
#include <QTextToSpeech>
#include <QOperatingSystemVersion>

class tst_QVoice : public QObject
{
    Q_OBJECT

private slots:
    void initTestCase_data();
    void init();

    void basic();
    void sameEngine();
    void datastream();
};

void tst_QVoice::initTestCase_data()
{
    qInfo("Available text-to-speech engines:");
    QTest::addColumn<QString>("engine");
    const auto engines = QTextToSpeech::availableEngines();
    if (!engines.size())
        QSKIP("No speech engines available, skipping test case");
    for (const auto &engine : engines) {
        QTest::addRow("%s", engine.toUtf8().constData()) << engine;
        qInfo().noquote() << "- " << engine;
    }
}

void tst_QVoice::init()
{
    QFETCH_GLOBAL(QString, engine);
    if (engine == "speechd") {
        QTextToSpeech tts(engine);
        if (tts.state() == QTextToSpeech::Error) {
            QSKIP("speechd engine reported an error, "
                  "make sure the speech-dispatcher service is running!");
        }
    } else if (engine == "darwin"
        && QOperatingSystemVersion::current() <= QOperatingSystemVersion::MacOSMojave) {
        QTextToSpeech tts(engine);
        if (!tts.availableLocales().size())
            QSKIP("iOS engine is not functional on macOS <= 10.14");
    }
}

/*
    Test basic value type semantics.
*/
void tst_QVoice::basic()
{
    QFETCH_GLOBAL(QString, engine);
    QTextToSpeech tts(engine);
    QTRY_COMPARE(tts.state(), QTextToSpeech::Ready);
    const QList<QVoice> voices = tts.availableVoices();
    QVERIFY(voices.size());

    QVoice emptyVoice;
    for (const auto &voice : voices) {
        QCOMPARE(voice, voice);
        QCOMPARE(voice.locale(), tts.locale());
        QVERIFY(voice != emptyVoice);

        QVoice voiceCopy = voice;
        QCOMPARE(voiceCopy, voice);
    }

    QVoice movedFrom = voices.first();
    QVoice movedTo = std::move(movedFrom);
    QCOMPARE(movedTo, voices.first());
    QCOMPARE(movedFrom, emptyVoice);
}

/*
    A QVoice from one engine should match the same voice from the same engine.
*/
void tst_QVoice::sameEngine()
{
    QFETCH_GLOBAL(QString, engine);
    QTextToSpeech tts1(engine);
    QTextToSpeech tts2(engine);
    QTRY_COMPARE(tts1.state(), QTextToSpeech::Ready);
    QTRY_COMPARE(tts2.state(), QTextToSpeech::Ready);

    const QList<QVoice> voices = tts1.availableVoices();
    QVERIFY(voices.size());
    QCOMPARE(tts1.availableVoices(), tts2.availableVoices());

    for (const auto &voice : voices)
        QVERIFY(tts2.availableVoices().indexOf(voice) != -1);
}

void tst_QVoice::datastream()
{
    QFETCH_GLOBAL(QString, engine);
    QVoice savedVoice;

    QByteArray storage;
    {
        QTextToSpeech tts(engine);
        QTRY_COMPARE(tts.state(), QTextToSpeech::Ready);
        const QList<QVoice> voices = tts.availableVoices();
        QVERIFY(voices.size());
        savedVoice = voices.first();

        QDataStream writeStream(&storage, QIODevice::WriteOnly);
        writeStream << savedVoice;
        QVERIFY(storage.size() > 0);
    }

    QVoice loadedVoice;
    QDataStream readStream(storage);
    readStream >> loadedVoice;

    QCOMPARE(loadedVoice, savedVoice);
}

QTEST_MAIN(tst_QVoice)
#include "tst_qvoice.moc"