// Copyright (C) 2022 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only #include #include #include using namespace Qt::StringLiterals; class tst_QJniArray : public QObject { Q_OBJECT public: tst_QJniArray() = default; private slots: void construct(); void size(); void operators(); }; using namespace QtJniTypes; // fake type so that we can compile-time test and assert correct type mappings Q_DECLARE_JNI_CLASS(List, "qt/test/List"); // verify that we get the return type we expect for the specified return type #define VERIFY_RETURN_FOR_TYPE(In, Out) \ static_assert(std::is_same_v("toByteArray")), Out>) VERIFY_RETURN_FOR_TYPE(jobjectArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jobject[], QJniArray); //VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(jbyteArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jbyte[], QJniArray); VERIFY_RETURN_FOR_TYPE(QByteArray, QByteArray); VERIFY_RETURN_FOR_TYPE(jbooleanArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jboolean[], QJniArray); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(jcharArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jchar[], QJniArray); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(jshortArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jshort[], QJniArray); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(jintArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jint[], QJniArray); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(jlongArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jlong[], QJniArray); VERIFY_RETURN_FOR_TYPE(QList, QList); // VERIFY_RETURN_FOR_TYPE(QList, QList); // assumes long is 64bit VERIFY_RETURN_FOR_TYPE(jfloatArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jfloat[], QJniArray); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(jdoubleArray, QJniObject); VERIFY_RETURN_FOR_TYPE(jdouble[], QJniArray); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QList, QList); VERIFY_RETURN_FOR_TYPE(QString, QString); VERIFY_RETURN_FOR_TYPE(List, List); VERIFY_RETURN_FOR_TYPE(List[], QJniArray); VERIFY_RETURN_FOR_TYPE(QJniArray, QJniArray); void tst_QJniArray::construct() { { QStringList strings; for (int i = 0; i < 10000; ++i) strings << QString::number(i); QJniArray list(strings); QCOMPARE(list.size(), 10000); } { QJniArray list{1, 2, 3}; QCOMPARE(list.size(), 3); } { QJniArray list(QList{1, 2, 3}); QCOMPARE(list.size(), 3); } { QJniArray list{QList{1, 2, 3}}; QCOMPARE(list.size(), 3); } } void tst_QJniArray::size() { QJniArray array; QVERIFY(!array.isValid()); QCOMPARE(array.size(), 0); QList intList; intList.resize(10); auto intArray = QJniArrayBase::fromContainer(intList); QCOMPARE(intArray.size(), 10); } void tst_QJniArray::operators() { QByteArray bytes("abcde"); QJniArray array(bytes); QVERIFY(array.isValid()); { auto it = array.begin(); QCOMPARE(*it, 'a'); QCOMPARE(*++it, 'b'); QCOMPARE(*it++, 'b'); QCOMPARE(*it, 'c'); ++it; it++; QCOMPARE(*it, 'e'); QCOMPARE(++it, array.end()); } { auto it = array.rbegin(); QCOMPARE(*it, 'e'); QCOMPARE(*++it, 'd'); QCOMPARE(*it++, 'd'); QCOMPARE(*it, 'c'); ++it; it++; QCOMPARE(*it, 'a'); QCOMPARE(++it, array.rend()); } { QJniArray::const_iterator it = {}; QCOMPARE(it, QJniArray::const_iterator{}); QCOMPARE_NE(array.begin(), array.end()); it = array.begin(); QCOMPARE(it, array.begin()); } QCOMPARE(std::distance(array.begin(), array.end()), array.size()); qsizetype index = 0; for (const auto &value : array) { QCOMPARE(value, bytes.at(index)); ++index; } } QTEST_MAIN(tst_QJniArray) #include "tst_qjniarray.moc"