void tst_QScriptValueIterator::iterateString() { QScriptEngine engine; QScriptValue str = QScriptValue(&engine, QString::fromLatin1("ciao")); QVERIFY(str.isString()); QScriptValue obj = str.toObject(); QVERIFY(obj.property("length").isNumber()); int length = obj.property("length").toInt32(); QCOMPARE(length, 4); QScriptValueIterator it(obj); QHash<QString, QScriptValue> stringProperties; bool iteratedThruLength = false; while (it.hasNext()) { it.next(); const QString name = it.name(); if (name == QString::fromLatin1("length")) { QVERIFY(it.value().isNumber()); QCOMPARE(it.value().toInt32(), length); QCOMPARE(it.flags(), QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); QVERIFY2(!iteratedThruLength, "'length' appeared more than once during iteration."); iteratedThruLength = true; continue; } QVERIFY2(!stringProperties.contains(name), "property appeared more than once during iteration."); stringProperties.insert(name, it.value()); QCOMPARE(it.flags(), obj.propertyFlags(name)); QVERIFY(it.value().strictlyEquals(obj.property(name))); } QVERIFY(iteratedThruLength); QCOMPARE(stringProperties.size(), length); // And going backwards iteratedThruLength = false; stringProperties.clear(); it.toBack(); while (it.hasPrevious()) { it.previous(); const QString name = it.name(); if (name == QString::fromLatin1("length")) { QVERIFY(it.value().isNumber()); QCOMPARE(it.value().toInt32(), length); QCOMPARE(it.flags(), QScriptValue::ReadOnly | QScriptValue::SkipInEnumeration | QScriptValue::Undeletable); QVERIFY2(!iteratedThruLength, "'length' appeared more than once during iteration."); iteratedThruLength = true; continue; } QVERIFY2(!stringProperties.contains(name), "property appeared more than once during iteration."); stringProperties.insert(name, it.value()); QCOMPARE(it.flags(), obj.propertyFlags(name)); QVERIFY(it.value().strictlyEquals(obj.property(name))); } }