qpropertytesthelper: Check that the types match

If you have a property myprop of type float, testReadWritePropertyBasics
would happily accept
testReadWritePropertyBasics(myObject, 1, 2, "myProp")
The test would then fail when setting bindings, as we would try to
install a binding of type int on a float property, which gets rejected
at runtime.
To prevent unexpected failures, verify that the types match before doing
any further checks.

Change-Id: I3893563fce0e11f9e20afa7c6a1e1fe0385382ab
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
This commit is contained in:
Fabian Kosmale 2021-04-22 11:59:30 +02:00
parent bf65abc4ab
commit 948261d70c

View File

@ -139,6 +139,11 @@ void testReadWritePropertyBasics(
// get the property
const QMetaObject *metaObject = instance.metaObject();
QMetaProperty metaProperty = metaObject->property(metaObject->indexOfProperty(propertyName));
QVERIFY2(metaProperty.metaType() == QMetaType::fromType<PropertyType>(),
QByteArray("Preconditions not met for") + propertyName + '\n' +
"The type of initial and changed value does not match the type of the property."
"Please ensure that the types match exactly (convertability is not enough)."
"You can provide the template types to the function explicitly to force a certain type");
// in case the TestedClass has setProperty()/property() methods.
QObject &testedObj = static_cast<QObject &>(instance);
@ -268,6 +273,12 @@ void testReadOnlyPropertyBasics(
// in case the TestedClass has setProperty()/property() methods.
QObject &testedObj = static_cast<QObject &>(instance);
QVERIFY2(metaProperty.metaType() == QMetaType::fromType<PropertyType>(),
QByteArray("Preconditions not met for") + propertyName + '\n' +
"The type of initial and changed value does not match the type of the property."
"Please ensure that the types match exactly (convertability is not enough)."
"You can provide the template types to the function explicitly to force a certain type");
QVERIFY2(metaProperty.isBindable(), "Preconditions not met for " + QByteArray(propertyName));
QUntypedBindable bindable = metaProperty.bindable(&instance);