Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qmlutils.cpp
Go to the documentation of this file.
1
// Copyright (C) 2021 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4
#
include
"qmlutils_p.h"
5
6
#
include
<
QtCore
/
QDebug
>
7
#
include
<
QtCore
/
QMutexLocker
>
8
#
include
<
QtQml
/
QQmlComponent
>
9
#
include
<
QtQml
/
QQmlEngine
>
10
#
include
<
private
/
qqmlengine_p
.
h
>
11
12
QT_BEGIN_NAMESPACE
13
14
QQmlDataTest *QQmlDataTest::m_instance =
nullptr
;
15
16
QQmlDataTest::QQmlDataTest(
17
const
char
*qmlTestDataDir, FailOnWarningsPolicy failOnWarningsPolicy,
18
const
char
*dataSubDir)
19
: m_qmlTestDataDir(qmlTestDataDir)
20
#
ifdef
QT_TESTCASE_BUILDDIR
21
, m_dataDirectory(QTest::qFindTestData(dataSubDir, m_qmlTestDataDir, 0, QT_TESTCASE_BUILDDIR))
22
#
else
23
, m_dataDirectory(QTest::qFindTestData(dataSubDir, m_qmlTestDataDir, 0))
24
#
endif
25
, m_dataDirectoryUrl(m_dataDirectory.startsWith(QLatin1Char(
':'
))
26
? QUrl(QLatin1String(
"qrc"
) + m_dataDirectory + QLatin1Char(
'/'
))
27
: QUrl::fromLocalFile(m_dataDirectory + QLatin1Char(
'/'
)))
28
, m_failOnWarningsPolicy(failOnWarningsPolicy)
29
{
30
m_instance =
this
;
31
if
(m_cacheDir.isValid() && !qEnvironmentVariableIsSet(
"QML_DISK_CACHE_PATH"
)) {
32
m_usesOwnCacheDir =
true
;
33
qputenv(
"QML_DISK_CACHE_PATH"
, m_cacheDir.path().toLocal8Bit());
34
}
35
36
if
(!qEnvironmentVariableIsSet(
"QTEST_ENVIRONMENT"
))
37
QTest::defaultTryTimeout.store(std::chrono::seconds(1));
38
}
39
40
QQmlDataTest::~QQmlDataTest()
41
{
42
m_instance =
nullptr
;
43
if
(m_usesOwnCacheDir)
44
qunsetenv(
"QML_DISK_CACHE_PATH"
);
45
}
46
47
void
QQmlDataTest::initTestCase()
48
{
49
QVERIFY2(!m_dataDirectory.isEmpty(), qPrintable(
50
QLatin1String(
"'%1' directory not found in %2"
).arg(
51
QString::fromUtf8(m_dataSubDir),
52
QFileInfo(QString::fromUtf8(m_qmlTestDataDir)).absolutePath())));
53
m_directory = QFileInfo(m_dataDirectory).absolutePath();
54
if
(m_dataDirectoryUrl.scheme() != QLatin1String(
"qrc"
))
55
QVERIFY2(QDir::setCurrent(m_directory), qPrintable(QLatin1String(
"Could not chdir to "
) + m_directory));
56
}
57
58
void
QQmlDataTest::init()
59
{
60
if
(m_failOnWarningsPolicy == FailOnWarningsPolicy::FailOnWarnings)
61
QTest::failOnWarning(QRegularExpression(QStringLiteral(
".?"
)));
62
}
63
64
QString QQmlDataTest::testFile(
const
QString &fileName)
const
65
{
66
if
(m_directory.isEmpty())
67
qFatal(
"QQmlDataTest::initTestCase() not called."
);
68
QString result = m_dataDirectory;
69
result += QLatin1Char(
'/'
);
70
result += fileName;
71
return
result;
72
}
73
74
bool
QQmlDataTest::canImportModule(
const
QString &importTestQmlSource)
const
75
{
76
QQmlEngine engine;
77
QQmlComponent component(&engine);
78
component.setData(importTestQmlSource.toLatin1(), QUrl());
79
return
!component.isError();
80
}
81
82
Q_GLOBAL_STATIC
(
QMutex
,
qQmlTestMessageHandlerMutex
)
83
84
QQmlTestMessageHandler
*
QQmlTestMessageHandler
::m_instance =
nullptr
;
85
86
void
QQmlTestMessageHandler
::messageHandler(QtMsgType,
const
QMessageLogContext &context,
const
QString &message)
87
{
88
QMutexLocker locker(qQmlTestMessageHandlerMutex());
89
if
(
QQmlTestMessageHandler
::m_instance) {
90
if
(
QQmlTestMessageHandler
::m_instance->m_includeCategories) {
91
QQmlTestMessageHandler
::m_instance->m_messages.push_back(
92
QString::fromLatin1(
"%1: %2"
).arg(QString::fromUtf8(context.category), message));
93
}
else
{
94
QQmlTestMessageHandler
::m_instance->m_messages.push_back(message);
95
}
96
}
97
}
98
99
QQmlTestMessageHandler
::QQmlTestMessageHandler()
100
{
101
QMutexLocker locker(qQmlTestMessageHandlerMutex());
102
Q_ASSERT(!
QQmlTestMessageHandler
::m_instance);
103
QQmlTestMessageHandler
::m_instance =
this
;
104
m_oldHandler = qInstallMessageHandler(messageHandler);
105
m_includeCategories =
false
;
106
}
107
108
QQmlTestMessageHandler
::~
QQmlTestMessageHandler
()
109
{
110
QMutexLocker locker(qQmlTestMessageHandlerMutex());
111
Q_ASSERT(
QQmlTestMessageHandler
::m_instance);
112
qInstallMessageHandler(m_oldHandler);
113
QQmlTestMessageHandler
::m_instance =
nullptr
;
114
}
115
116
117
bool
gcDone
(
const
QV4
::ExecutionEngine *engine) {
118
return
!engine->memoryManager->gcStateMachine->inProgress();
119
}
120
121
void
gc
(
QV4
::ExecutionEngine &engine,
GCFlags
flags)
122
{
123
engine.memoryManager->runFullGC();
124
if
(
int
(
GCFlags
::
DontSendPostedEvents
) &
int
(flags))
125
return
;
126
QCoreApplication::sendPostedEvents(
nullptr
, QEvent::DeferredDelete);
127
QCoreApplication::processEvents();
128
}
129
130
bool
gcDone
(QQmlEngine *engine) {
131
return
gcDone(engine->handle());
132
}
133
134
void
gc
(QQmlEngine &engine,
GCFlags
flags)
135
{
136
gc(*engine.handle(), flags);
137
}
138
139
namespace
Syntax
{
140
141
auto
stringView
(
const
Word &word) ->
QLatin1StringView
142
{
143
return
std::holds_alternative<Token>(word) ? spellFor(std::get<Token>(word))
144
: std::get<QLatin1StringView>(word);
145
}
146
147
auto
toString
(
const
Phrase &phrase) ->
QString
148
{
149
QString result;
150
for
(
const
auto
&word : phrase) {
151
result += stringView(word) + QLatin1Char(
' '
);
152
}
153
return
result;
154
}
155
156
// comfort
157
auto
operator
+(
const
Word &word,
const
Phrase &phrase) ->
Phrase
158
{
159
return
Phrase{ word } + phrase;
160
};
161
162
auto
operator
+(
const
Word &word1,
const
Word &word2) ->
Phrase
163
{
164
return
Phrase{ word1, word2 };
165
};
166
167
auto
objectDeclaration
(Phrase &&objectMember, QLatin1StringView objName) ->
Phrase
168
{
169
return
Phrase{} << Word(objName) << Word(Token::T_LBRACE) << std::move(objectMember)
170
<< Word(Token::T_RBRACE);
171
}
172
173
}
// namespace Syntax
174
175
QT_END_NAMESPACE
176
177
#
include
"moc_qmlutils_p.cpp"
QQmlTestMessageHandler
Definition
qmlutils_p.h:88
QQmlTestMessageHandler::~QQmlTestMessageHandler
~QQmlTestMessageHandler()
Definition
qmlutils.cpp:108
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QV4
Definition
qjsvalue.h:24
Syntax
Definition
qmlutils.cpp:139
Syntax::stringView
auto stringView(const Word &word) -> QLatin1StringView
Definition
qmlutils.cpp:141
Syntax::toString
auto toString(const Phrase &phrase) -> QString
Definition
qmlutils.cpp:147
Syntax::operator+
auto operator+(const Word &word, const Phrase &phrase) -> Phrase
Definition
qmlutils.cpp:157
Syntax::objectDeclaration
auto objectDeclaration(Phrase &&objectMember, QLatin1StringView objName) -> Phrase
Definition
qmlutils.cpp:167
Q_GLOBAL_STATIC
Q_GLOBAL_STATIC(QReadWriteLock, g_updateMutex)
GCFlags
GCFlags
Definition
qmlutils_p.h:116
GCFlags::DontSendPostedEvents
@ DontSendPostedEvents
Definition
qmlutils_p.h:118
gc
void gc(QV4::ExecutionEngine &engine, GCFlags flags)
Definition
qmlutils.cpp:121
gc
void gc(QQmlEngine &engine, GCFlags flags)
Definition
qmlutils.cpp:134
gcDone
bool gcDone(const QV4::ExecutionEngine *engine)
Definition
qmlutils.cpp:117
gcDone
bool gcDone(QQmlEngine *engine)
Definition
qmlutils.cpp:130
qtdeclarative
src
quicktestutils
qml
qmlutils.cpp
Generated on
for Qt by
1.18.0