aboutsummaryrefslogtreecommitdiffstats
path: root/tests/auto
diff options
context:
space:
mode:
authorUlf Hermann <ulf.hermann@qt.io>2020-12-07 15:04:44 +0100
committerUlf Hermann <ulf.hermann@qt.io>2020-12-07 15:53:39 +0100
commit61a5860599cb2bf770ea3150f8a993d3b08b840a (patch)
tree266eaafa852e5a95622a8fb0a571d5f3ab2eb39c /tests/auto
parente8596de70e46e98a851ac8204e294e5ef4994b96 (diff)
QJSValue: Add toVariant() overload with conversion behavior
The QJSValue to QVariant conversion is traditionally messy. The recent addition of a special case for FunctionObject did not make that better. Rather, we now add a way of specifying that the conversion should be lossless, which avoids all conversions of JS objects and arrays. Amends commit 6b08c24297f39f3c67bc5c16f46198b33af66529. Change-Id: I6d4506b52d3175ed2f2984f8a26d560cf6311ab6 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'tests/auto')
-rw-r--r--tests/auto/qml/qjsvalue/tst_qjsvalue.cpp83
1 files changed, 69 insertions, 14 deletions
diff --git a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
index 94068bfa12..e2f83a78ba 100644
--- a/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
+++ b/tests/auto/qml/qjsvalue/tst_qjsvalue.cpp
@@ -962,15 +962,18 @@ void tst_QJSValue::toUInt()
void tst_QJSValue::toVariant()
{
QJSEngine eng;
- QObject temp;
- QJSValue undefined = eng.toScriptValue(QVariant());
- QCOMPARE(undefined.toVariant(), QVariant());
- QCOMPARE(qjsvalue_cast<QVariant>(undefined), QVariant());
+ {
+ QJSValue undefined = eng.toScriptValue(QVariant());
+ QCOMPARE(undefined.toVariant(), QVariant());
+ QCOMPARE(qjsvalue_cast<QVariant>(undefined), QVariant());
+ }
- QJSValue null = eng.evaluate("null");
- QCOMPARE(null.toVariant(), QVariant::fromValue(nullptr));
- QCOMPARE(qjsvalue_cast<QVariant>(null), QVariant::fromValue(nullptr));
+ {
+ QJSValue null = eng.evaluate("null");
+ QCOMPARE(null.toVariant(), QVariant::fromValue(nullptr));
+ QCOMPARE(qjsvalue_cast<QVariant>(null), QVariant::fromValue(nullptr));
+ }
{
QJSValue number = eng.toScriptValue(123.0);
@@ -995,14 +998,21 @@ void tst_QJSValue::toVariant()
QCOMPARE(qjsvalue_cast<QVariant>(str), QVariant(QString("ciao")));
}
- QJSValue object = eng.newObject();
- QCOMPARE(object.toVariant(), QVariant(QVariantMap()));
+ {
+ QJSValue object = eng.newObject();
+ QCOMPARE(object.toVariant(), QVariant(QVariantMap()));
+ QVariant retained = object.toVariant(QJSValue::RetainJSObjects);
+ QCOMPARE(retained.metaType(), QMetaType::fromType<QJSValue>());
+ QVERIFY(retained.value<QJSValue>().strictlyEquals(object));
+ }
- QJSValue qobject = eng.newQObject(&temp);
{
+ QObject temp;
+ QJSValue qobject = eng.newQObject(&temp);
QVariant var = qobject.toVariant();
QCOMPARE(var.typeId(), int(QMetaType::QObjectStar));
QCOMPARE(qvariant_cast<QObject*>(var), (QObject *)&temp);
+ QCOMPARE(qobject.toVariant(QJSValue::RetainJSObjects), var);
}
{
@@ -1010,6 +1020,7 @@ void tst_QJSValue::toVariant()
QJSValue dateObject = eng.toScriptValue(dateTime);
QVariant var = dateObject.toVariant();
QCOMPARE(var, QVariant(dateTime));
+ QCOMPARE(dateObject.toVariant(QJSValue::RetainJSObjects), var);
}
{
@@ -1018,39 +1029,76 @@ void tst_QJSValue::toVariant()
QVERIFY(rxObject.isRegExp());
QVariant var = rxObject.toVariant();
QCOMPARE(var, QVariant(rx));
+ QCOMPARE(rxObject.toVariant(QJSValue::RetainJSObjects), var);
}
- QJSValue inv;
- QCOMPARE(inv.toVariant(), QVariant());
- QCOMPARE(qjsvalue_cast<QVariant>(inv), QVariant());
+ {
+ QJSValue inv;
+ QCOMPARE(inv.toVariant(), QVariant());
+ QCOMPARE(inv.toVariant(QJSValue::RetainJSObjects), QVariant());
+ QCOMPARE(qjsvalue_cast<QVariant>(inv), QVariant());
+ }
// V2 constructors
{
QJSValue number = QJSValue(123.0);
QCOMPARE(number.toVariant(), QVariant(123.0));
+ QCOMPARE(number.toVariant(QJSValue::RetainJSObjects), QVariant(123.0));
QCOMPARE(qjsvalue_cast<QVariant>(number), QVariant(123.0));
QJSValue falskt = QJSValue(false);
QCOMPARE(falskt.toVariant(), QVariant(false));
+ QCOMPARE(falskt.toVariant(QJSValue::RetainJSObjects), QVariant(false));
QCOMPARE(qjsvalue_cast<QVariant>(falskt), QVariant(false));
QJSValue sant = QJSValue(true);
QCOMPARE(sant.toVariant(), QVariant(true));
+ QCOMPARE(sant.toVariant(QJSValue::RetainJSObjects), QVariant(true));
QCOMPARE(qjsvalue_cast<QVariant>(sant), QVariant(true));
QJSValue str = QJSValue(QString("ciao"));
QCOMPARE(str.toVariant(), QVariant(QString("ciao")));
+ QCOMPARE(str.toVariant(QJSValue::RetainJSObjects), QVariant(QString("ciao")));
QCOMPARE(qjsvalue_cast<QVariant>(str), QVariant(QString("ciao")));
QJSValue undef = QJSValue(QJSValue::UndefinedValue);
QCOMPARE(undef.toVariant(), QVariant());
+ QCOMPARE(undef.toVariant(QJSValue::RetainJSObjects), QVariant());
QCOMPARE(qjsvalue_cast<QVariant>(undef), QVariant());
QJSValue nil = QJSValue(QJSValue::NullValue);
QCOMPARE(nil.toVariant(), QVariant::fromValue(nullptr));
+ QCOMPARE(nil.toVariant(QJSValue::RetainJSObjects), QVariant::fromValue(nullptr));
QCOMPARE(qjsvalue_cast<QVariant>(nil), QVariant::fromValue(nullptr));
}
+ // object
+ {
+ QVariantMap mapIn;
+ mapIn["a"] = 123;
+ mapIn["b"] = "hello";
+ QJSValue object = eng.toScriptValue(mapIn);
+ QVERIFY(object.isObject());
+
+ QVariant retained = object.toVariant(QJSValue::RetainJSObjects);
+ QCOMPARE(retained.metaType(), QMetaType::fromType<QJSValue>());
+ QVERIFY(retained.value<QJSValue>().strictlyEquals(object));
+
+ QVariant ret = object.toVariant();
+ QCOMPARE(ret.typeId(), QMetaType::QVariantMap);
+ QVariantMap mapOut = ret.toMap();
+ QCOMPARE(mapOut.size(), mapIn.size());
+ for (auto it = mapOut.begin(), end = mapOut.end(); it != end; ++it)
+ QCOMPARE(*it, mapIn[it.key()]);
+
+ // round-trip conversion
+ QJSValue object2 = eng.toScriptValue(ret);
+ QVERIFY(object2.isObject());
+ QVERIFY(object2.property("a").strictlyEquals(object.property("a")));
+ QVERIFY(object2.property("b").strictlyEquals(object.property("b")));
+ }
+
+
// array
{
auto handler = qInstallMessageHandler([](QtMsgType type, const QMessageLogContext &, const QString &) {
@@ -1062,6 +1110,11 @@ void tst_QJSValue::toVariant()
QJSValue array = eng.toScriptValue(listIn);
QVERIFY(array.isArray());
QCOMPARE(array.property("length").toInt(), 2);
+
+ QVariant retained = array.toVariant(QJSValue::RetainJSObjects);
+ QCOMPARE(retained.metaType(), QMetaType::fromType<QJSValue>());
+ QVERIFY(retained.value<QJSValue>().strictlyEquals(array));
+
QVariant ret = array.toVariant();
QCOMPARE(ret.typeId(), QMetaType::QVariantList);
QVariantList listOut = ret.toList();
@@ -1084,13 +1137,15 @@ void tst_QJSValue::toVariant()
QVERIFY(func.isCallable());
QCOMPARE(func.call().toInt(), 10);
- QVariant funcVar = func.toVariant();
+ QVariant funcVar = func.toVariant(QJSValue::RetainJSObjects);
QVERIFY(funcVar.isValid());
QCOMPARE(funcVar.metaType(), QMetaType::fromType<QJSValue>());
QJSValue func2 = eng.toScriptValue(funcVar);
QVERIFY(func2.isCallable());
QCOMPARE(func2.call().toInt(), 10);
+
+ QCOMPARE(func.toVariant(), QVariant());
}
}