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"
|