aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto/qml/qqmljsscope
diff options
context:
space:
mode:
Diffstat (limited to 'tests/auto/qml/qqmljsscope')
-rw-r--r--tests/auto/qml/qqmljsscope/data/compilationUnitsCompatibility.qml6
-rw-r--r--tests/auto/qml/qqmljsscope/tst_qqmljsscope.cpp53
2 files changed, 59 insertions, 0 deletions
diff --git a/tests/auto/qml/qqmljsscope/data/compilationUnitsCompatibility.qml b/tests/auto/qml/qqmljsscope/data/compilationUnitsCompatibility.qml
new file mode 100644
index 0000000000..bcc49537bb
--- /dev/null
+++ b/tests/auto/qml/qqmljsscope/data/compilationUnitsCompatibility.qml
@@ -0,0 +1,6 @@
+import QtQuick
+
+Text {
+ anchors.bottomMargin: Math.max(32, 31) + 10 // == 42
+ font.letterSpacing: Math.max(2, 3)
+}
diff --git a/tests/auto/qml/qqmljsscope/tst_qqmljsscope.cpp b/tests/auto/qml/qqmljsscope/tst_qqmljsscope.cpp
index 72ce3ab488..0c8eb0d227 100644
--- a/tests/auto/qml/qqmljsscope/tst_qqmljsscope.cpp
+++ b/tests/auto/qml/qqmljsscope/tst_qqmljsscope.cpp
@@ -23,6 +23,7 @@
#include <private/qqmljstyperesolver_p.h>
#include <QtQml/private/qqmljslexer_p.h>
#include <QtQml/private/qqmljsparser_p.h>
+#include <private/qqmlcomponent_p.h>
using namespace Qt::StringLiterals;
@@ -107,6 +108,7 @@ private Q_SLOTS:
void emptyBlockBinding();
void qualifiedName();
void resolvedNonUniqueScopes();
+ void compilationUnitsAreCompatible();
public:
tst_qqmljsscope()
@@ -733,5 +735,56 @@ void tst_qqmljsscope::resolvedNonUniqueScopes()
}
}
+static void
+getRuntimeInfoFromCompilationUnit(const QV4::CompiledData::Unit *unit,
+ QList<const QV4::CompiledData::Function *> &runtimeFunctions)
+{
+ QVERIFY(unit);
+ for (uint i = 0; i < unit->functionTableSize; ++i) {
+ const QV4::CompiledData::Function *function = unit->functionAt(i);
+ QVERIFY(function);
+ runtimeFunctions << function;
+ }
+}
+
+// Note: this test is here because we never explicitly test qCompileQmlFile()
+void tst_qqmljsscope::compilationUnitsAreCompatible()
+{
+ const QString url = u"compilationUnitsCompatibility.qml"_s;
+ QList<const QV4::CompiledData::Function *> componentFunctions;
+ QList<const QV4::CompiledData::Function *> cachegenFunctions;
+
+ QQmlEngine engine;
+ QQmlComponent component(&engine);
+ component.loadUrl(testFileUrl(url));
+ QVERIFY2(component.isReady(), qPrintable(component.errorString()));
+ QScopedPointer<QObject> root(component.create());
+ QVERIFY2(root, qPrintable(component.errorString()));
+ QQmlComponentPrivate *cPriv = QQmlComponentPrivate::get(&component);
+ QVERIFY(cPriv);
+ auto unit = cPriv->compilationUnit;
+ QVERIFY(unit);
+ QVERIFY(unit->unitData());
+ getRuntimeInfoFromCompilationUnit(unit->unitData(), componentFunctions);
+
+ if (QTest::currentTestFailed())
+ return;
+
+ QmlIR::Document document(false); // we need QmlIR information here
+ QVERIFY(run(url, &document));
+ QVERIFY(document.javaScriptCompilationUnit.unitData());
+ getRuntimeInfoFromCompilationUnit(document.javaScriptCompilationUnit.unitData(),
+ cachegenFunctions);
+ if (QTest::currentTestFailed())
+ return;
+
+ QCOMPARE(cachegenFunctions.size(), componentFunctions.size());
+ // name index should be fairly unique to distinguish different functions
+ // within a document. their order must be the same for both qmlcachegen and
+ // qqmltypecompiler (runtime)
+ for (qsizetype i = 0; i < cachegenFunctions.size(); ++i)
+ QCOMPARE(uint(cachegenFunctions[i]->nameIndex), uint(componentFunctions[i]->nameIndex));
+}
+
QTEST_MAIN(tst_qqmljsscope)
#include "tst_qqmljsscope.moc"