diff options
author | Benjamin Poulain <benjamin.poulain@nokia.com> | 2009-08-03 14:12:10 (GMT) |
---|---|---|
committer | Benjamin Poulain <benjamin.poulain@nokia.com> | 2009-08-03 14:18:09 (GMT) |
commit | e520df1f8678bd59adb341fb586f008a7de17fe8 (patch) | |
tree | c8cfbf8e651c1e8aa5f9e0f305757b254e9ab6c4 /tests/auto/qscriptvalueiterator | |
parent | ecb53d192b4a56cd71c251621bec15a509307b23 (diff) | |
download | Qt-e520df1f8678bd59adb341fb586f008a7de17fe8.zip Qt-e520df1f8678bd59adb341fb586f008a7de17fe8.tar.gz Qt-e520df1f8678bd59adb341fb586f008a7de17fe8.tar.bz2 |
Complete the implementation of QScriptValueIterator with JSCore
This new implementation of QScriptValueIterator passes all the tests.
QScriptValueIterator uses an linked list instead of
JSC::PropertyNameArray so the list can be modified by ::remove() and
to be able to add internal properties for the strings and arrays.
Structure::getPropertyNames() has been modified to not show the
property from the prototype.
Reviewed-by: Kent Hansen
Diffstat (limited to 'tests/auto/qscriptvalueiterator')
-rw-r--r-- | tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp | 195 |
1 files changed, 79 insertions, 116 deletions
diff --git a/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp b/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp index 673ac70..c0ab36b 100644 --- a/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp +++ b/tests/auto/qscriptvalueiterator/tst_qscriptvalueiterator.cpp @@ -48,6 +48,8 @@ //TESTED_CLASS= //TESTED_FILES= +Q_DECLARE_METATYPE(QScriptValue); + class tst_QScriptValueIterator : public QObject { Q_OBJECT @@ -61,15 +63,14 @@ private slots: void iterateForward(); void iterateBackward_data(); void iterateBackward(); + void iterateArray_data(); void iterateArray(); void iterateBackAndForth(); void setValue(); void remove(); void iterateString(); void iterateGetterSetter(); - void iterateArgumentsObject(); void assignObjectToIterator(); - void undefinedBehavior(); }; tst_QScriptValueIterator::tst_QScriptValueIterator() @@ -207,49 +208,101 @@ void tst_QScriptValueIterator::iterateBackward() QCOMPARE(it.hasNext(), false); } +void tst_QScriptValueIterator::iterateArray_data() +{ + QTest::addColumn<QStringList>("inputPropertyNames"); + QTest::addColumn<QStringList>("inputPropertyValues"); + QTest::addColumn<QStringList>("propertyNames"); + QTest::addColumn<QStringList>("propertyValues"); + QTest::newRow("no elements") << QStringList() << QStringList() << QStringList() << QStringList(); + + + QTest::newRow("0=foo, 1=barr") + << (QStringList() << "0" << "1") + << (QStringList() << "foo" << "bar") + << (QStringList() << "0" << "1") + << (QStringList() << "foo" << "bar"); + + + QTest::newRow("0=foo, 3=barr") + << (QStringList() << "0" << "3") + << (QStringList() << "foo" << "bar") + << (QStringList() << "0" << "1" << "2" << "3") + << (QStringList() << "foo" << "" << "" << "bar"); +} + void tst_QScriptValueIterator::iterateArray() { + QFETCH(QStringList, inputPropertyNames); + QFETCH(QStringList, inputPropertyValues); + QFETCH(QStringList, propertyNames); + QFETCH(QStringList, propertyValues); + QScriptEngine engine; QScriptValue array = engine.newArray(); - array.setProperty("0", QScriptValue(&engine, 123)); - array.setProperty("1", QScriptValue(&engine, 456)); - array.setProperty("2", QScriptValue(&engine, 789)); + for (int i = 0; i < inputPropertyNames.size(); ++i) { + array.setProperty(inputPropertyNames.at(i), inputPropertyValues.at(i)); + } + int length = array.property("length").toInt32(); - QCOMPARE(length, 3); + QCOMPARE(length, propertyNames.size()); QScriptValueIterator it(array); for (int i = 0; i < length; ++i) { QCOMPARE(it.hasNext(), true); - QString indexStr = QScriptValue(&engine, i).toString(); it.next(); - QCOMPARE(it.name(), indexStr); - QCOMPARE(it.flags(), array.propertyFlags(indexStr)); - QCOMPARE(it.value().strictlyEquals(array.property(indexStr)), true); + QCOMPARE(it.name(), propertyNames.at(i)); + QCOMPARE(it.flags(), array.propertyFlags(propertyNames.at(i))); + QVERIFY(it.value().strictlyEquals(array.property(propertyNames.at(i)))); + QCOMPARE(it.value().toString(), propertyValues.at(i)); } QCOMPARE(it.hasNext(), false); - QVERIFY(it.hasPrevious()); + QCOMPARE(it.hasPrevious(), length > 0); for (int i = length - 1; i >= 0; --i) { it.previous(); - QString indexStr = QScriptValue(&engine, i).toString(); - QCOMPARE(it.name(), indexStr); - QCOMPARE(it.value().strictlyEquals(array.property(indexStr)), true); + QCOMPARE(it.name(), propertyNames.at(i)); + QCOMPARE(it.flags(), array.propertyFlags(propertyNames.at(i))); + QVERIFY(it.value().strictlyEquals(array.property(propertyNames.at(i)))); + QCOMPARE(it.value().toString(), propertyValues.at(i)); QCOMPARE(it.hasPrevious(), i > 0); } QCOMPARE(it.hasPrevious(), false); // hasNext() and hasPrevious() cache their result; verify that the result is in sync - QVERIFY(it.hasNext()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(it.hasNext()); - it.previous(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(!it.hasPrevious()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(it.hasPrevious()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("1")); + if (length > 1) { + QVERIFY(it.hasNext()); + it.next(); + QCOMPARE(it.name(), QString::fromLatin1("0")); + QVERIFY(it.hasNext()); + it.previous(); + QCOMPARE(it.name(), QString::fromLatin1("0")); + QVERIFY(!it.hasPrevious()); + it.next(); + QCOMPARE(it.name(), QString::fromLatin1("0")); + QVERIFY(it.hasPrevious()); + it.next(); + QCOMPARE(it.name(), QString::fromLatin1("1")); + } + { + // same test as object: + QScriptValue originalArray = engine.newArray(); + for (int i = 0; i < inputPropertyNames.size(); ++i) { + originalArray.setProperty(inputPropertyNames.at(i), inputPropertyValues.at(i)); + } + QScriptValue array = originalArray.toObject(); + int length = array.property("length").toInt32(); + QCOMPARE(length, propertyNames.size()); + QScriptValueIterator it(array); + for (int i = 0; i < length; ++i) { + QCOMPARE(it.hasNext(), true); + it.next(); + QCOMPARE(it.name(), propertyNames.at(i)); + QCOMPARE(it.flags(), array.propertyFlags(propertyNames.at(i))); + QVERIFY(it.value().strictlyEquals(array.property(propertyNames.at(i)))); + QCOMPARE(it.value().toString(), propertyValues.at(i)); + } + QCOMPARE(it.hasNext(), false); + } } void tst_QScriptValueIterator::iterateBackAndForth() @@ -484,96 +537,6 @@ void tst_QScriptValueIterator::iterateGetterSetter() } } -static QScriptValue getArgumentsObject(QScriptContext *ctx, QScriptEngine *) -{ - return ctx->argumentsObject(); -} - -void tst_QScriptValueIterator::iterateArgumentsObject() -{ - QScriptEngine eng; - QScriptValue fun = eng.newFunction(getArgumentsObject); - QScriptValue ret = fun.call(QScriptValue(), QScriptValueList() << QScriptValue(&eng, 123) << QScriptValue(&eng, 456)); - QCOMPARE(ret.property("length").toInt32(), 2); - - QScriptValueIterator it(ret); - QVERIFY(it.hasNext()); - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("callee")); - QVERIFY(it.value().isFunction()); - QVERIFY(it.value().strictlyEquals(fun)); - QVERIFY(it.hasNext()); - - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("length")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), 2); - QVERIFY(it.hasNext()); - - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), 123); - QVERIFY(it.hasNext()); - - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("1")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), 456); - QVERIFY(!it.hasNext()); - - QVERIFY(it.hasPrevious()); - it.previous(); - QCOMPARE(it.name(), QString::fromLatin1("1")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), 456); - QVERIFY(it.hasPrevious()); - - it.previous(); - QCOMPARE(it.name(), QString::fromLatin1("0")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), 123); - QVERIFY(it.hasPrevious()); - - it.previous(); - QCOMPARE(it.name(), QString::fromLatin1("length")); - QVERIFY(it.value().isNumber()); - QCOMPARE(it.value().toInt32(), 2); - QVERIFY(it.hasPrevious()); - - it.previous(); - QCOMPARE(it.name(), QString::fromLatin1("callee")); - QVERIFY(it.value().isFunction()); - QVERIFY(it.value().strictlyEquals(fun)); - QVERIFY(!it.hasPrevious()); -} - -void tst_QScriptValueIterator::undefinedBehavior() -{ - QScriptEngine eng; - QScriptValue obj = eng.newObject(); - obj.setProperty("foo", QScriptValue(&eng, 123)); - - QScriptValueIterator it(obj); - QVERIFY(it.hasNext()); - - // delete the property - obj.setProperty("foo", QScriptValue()); - - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("foo")); - QVERIFY(!it.value().isValid()); - - QVERIFY(!it.hasNext()); - // add a property - obj.setProperty("bar", QScriptValue(&eng, 123)); - QVERIFY(it.hasNext()); - - it.next(); - QCOMPARE(it.name(), QString::fromLatin1("bar")); - QVERIFY(it.value().isNumber()); -} - void tst_QScriptValueIterator::assignObjectToIterator() { QScriptEngine eng; |