Added tests for the get indexer.

This commit is contained in:
Paul Knopf 2018-08-17 16:29:53 -04:00
parent 7997adbdc7
commit 9def032327
6 changed files with 73 additions and 25 deletions

View file

@ -68,33 +68,13 @@ ReturnedValue NetArray::getIndexed(const Managed *m, uint index, bool *hasProper
}
NetValue* netValue = reinterpret_cast<NetValue*>(wrapper->d()->object());
QSharedPointer<NetTypeInfo> typeInfo = netValue->getNetReference()->getTypeInfo();
QSharedPointer<NetTypeArrayFacade> arrayFacade = netValue->getNetReference()->getTypeInfo()->getArrayFacade();
QSharedPointer<NetMethodInfo> getMethod;
for(int x = 0; x < typeInfo->getMethodCount(); x++) {
QSharedPointer<NetMethodInfo> methodInfo = typeInfo->getMethodInfo(x);
if(methodInfo->getMethodName().compare("Get") == 0) {
getMethod = methodInfo;
break;
}
if(arrayFacade == nullptr) {
THROW_GENERIC_ERROR("The wrapped object can't be treated as an array.");
}
if(getMethod == nullptr) {
THROW_GENERIC_ERROR("Couldn't find the Get method for the .NET array");
}
QSharedPointer<NetVariantList> parameters = QSharedPointer<NetVariantList>(new NetVariantList());
QSharedPointer<NetVariant> parameter = QSharedPointer<NetVariant>(new NetVariant());
parameter->setInt(static_cast<int>(index));
parameters->add(parameter);
QSharedPointer<NetVariant> result = QSharedPointer<NetVariant>(new NetVariant());
invokeNetMethod(getMethod, netValue->getNetReference(), parameters, result);
QSharedPointer<NetVariant> result = arrayFacade->getIndexed(netValue->getNetReference(), static_cast<int>(index));
QJSValue resultJsValue = result->toQJSValue(scope.engine->jsEngine());
if(resultJsValue.isNull() || resultJsValue.isUndefined()) {
THROW_GENERIC_ERROR("Couldn't find the Get method for the .NET array");
}
return scope.engine->fromVariant(resultJsValue.toVariant());
}

View file

@ -25,3 +25,13 @@ int NetTypeArrayFacade::getLength(QSharedPointer<NetReference>)
{
return 0;
}
QSharedPointer<NetVariant> NetTypeArrayFacade::getIndexed(QSharedPointer<NetReference>, int)
{
return nullptr;
}
void NetTypeArrayFacade::setIndexed(QSharedPointer<NetReference>, int, QSharedPointer<NetVariant>)
{
}

View file

@ -6,6 +6,7 @@
class NetTypeInfo;
class NetReference;
class NetVariant;
class NetTypeArrayFacade
{
@ -14,6 +15,8 @@ public:
virtual ~NetTypeArrayFacade() {}
static QSharedPointer<NetTypeArrayFacade> fromType(QSharedPointer<NetTypeInfo> type);
virtual int getLength(QSharedPointer<NetReference> reference);
virtual QSharedPointer<NetVariant> getIndexed(QSharedPointer<NetReference> reference, int index);
virtual void setIndexed(QSharedPointer<NetReference> reference, int index, QSharedPointer<NetVariant> value);
};
#endif // NETTYPEARRAYFACADE_H

View file

@ -16,7 +16,18 @@ NetTypeArrayFacade_Array::NetTypeArrayFacade_Array(QSharedPointer<NetTypeInfo> t
}
}
if(_lengthProperty == nullptr) {
for(int x = 0; x < type->getMethodCount(); x++) {
QSharedPointer<NetMethodInfo> method = type->getMethodInfo(x);
if(method->getMethodName().compare("Get") == 0) {
_getIndexed = method;
} else if(method->getMethodName().compare("Set") == 0) {
_setIndexed = method;
}
}
if(_lengthProperty == nullptr ||
_getIndexed == nullptr ||
_setIndexed == nullptr) {
_isIncomplete = true;
return;
}
@ -33,3 +44,25 @@ int NetTypeArrayFacade_Array::getLength(QSharedPointer<NetReference> reference)
readProperty(_lengthProperty, reference, result);
return result->getInt();
}
QSharedPointer<NetVariant> NetTypeArrayFacade_Array::getIndexed(QSharedPointer<NetReference> reference, int index)
{
QSharedPointer<NetVariantList> parameters = QSharedPointer<NetVariantList>(new NetVariantList());
QSharedPointer<NetVariant> parameter = QSharedPointer<NetVariant>(new NetVariant());
parameter->setInt(static_cast<int>(index));
parameters->add(parameter);
QSharedPointer<NetVariant> result = QSharedPointer<NetVariant>(new NetVariant());
invokeNetMethod(_getIndexed, reference, parameters, result);
return result;
}
void NetTypeArrayFacade_Array::setIndexed(QSharedPointer<NetReference> reference, int index, QSharedPointer<NetVariant> value)
{
QSharedPointer<NetVariantList> parameters = QSharedPointer<NetVariantList>(new NetVariantList());
QSharedPointer<NetVariant> parameter = QSharedPointer<NetVariant>(new NetVariant());
parameter->setInt(static_cast<int>(index));
parameters->add(parameter);
parameters->add(value);
QSharedPointer<NetVariant> result = QSharedPointer<NetVariant>(new NetVariant());
invokeNetMethod(_setIndexed, reference, parameters, result);
}

View file

@ -12,9 +12,13 @@ public:
NetTypeArrayFacade_Array(QSharedPointer<NetTypeInfo> type);
bool isIncomplete();
int getLength(QSharedPointer<NetReference> reference);
QSharedPointer<NetVariant> getIndexed(QSharedPointer<NetReference> reference, int index);
void setIndexed(QSharedPointer<NetReference> reference, int index, QSharedPointer<NetVariant> value);
private:
bool _isIncomplete;
QSharedPointer<NetPropertyInfo> _lengthProperty;
QSharedPointer<NetMethodInfo> _getIndexed;
QSharedPointer<NetMethodInfo> _setIndexed;
};
#endif // NETTYPEARRAYFACADEARRAY_H

View file

@ -35,5 +35,23 @@ namespace Qml.Net.Tests.Qml
Mock.Verify(x => x.GetArray(), Times.Once);
Mock.Verify(x => x.Test(3), Times.Once);
}
[Fact]
public void Can_get_indexed()
{
var array = new[] {3, 4, 6};
Mock.Setup(x => x.GetArray()).Returns(array);
Mock.Setup(x => x.Test(4));
RunQmlTest(
"test",
@"
var array = Net.toJsArray(test.getArray())
test.test(array[1])
");
Mock.Verify(x => x.GetArray(), Times.Once);
Mock.Verify(x => x.Test(4), Times.Once);
}
}
}