diff options
author | Thiago Macieira <thiago.macieira@intel.com> | 2020-04-16 19:09:34 -0300 |
---|---|---|
committer | Thiago Macieira <thiago.macieira@intel.com> | 2020-08-12 21:05:06 -0700 |
commit | 99ce02f692bd9ad59f5e159ce65ef13f4e041a31 (patch) | |
tree | 8ebe04bcdf0ed26b7663de7c4aaa63daf3e0c0f3 /src | |
parent | e635568985ef8a09302edc02ff4f74eca4a65843 (diff) |
QCborValue: add support for QCOMPARE string output
Change-Id: Ibdc95e9af7bd456a94ecfffd16066c47ea9766d0
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/serialization/qcborvalue.cpp | 150 | ||||
-rw-r--r-- | src/testlib/qtest.h | 145 |
2 files changed, 220 insertions, 75 deletions
diff --git a/src/corelib/serialization/qcborvalue.cpp b/src/corelib/serialization/qcborvalue.cpp index ea2d092a1f..16f9b1cf05 100644 --- a/src/corelib/serialization/qcborvalue.cpp +++ b/src/corelib/serialization/qcborvalue.cpp @@ -2995,68 +2995,6 @@ size_t qHash(const QCborValue &value, size_t seed) return qHash(value.toSimpleType(), seed); } -#if !defined(QT_NO_DEBUG_STREAM) -static QDebug debugContents(QDebug &dbg, const QCborValue &v) -{ - switch (v.type()) { - case QCborValue::Integer: - return dbg << v.toInteger(); - case QCborValue::ByteArray: - return dbg << "QByteArray(" << v.toByteArray() << ')'; - case QCborValue::String: - return dbg << v.toString(); - case QCborValue::Array: - return dbg << v.toArray(); - case QCborValue::Map: - return dbg << v.toMap(); - case QCborValue::Tag: - dbg << v.tag() << ", "; - return debugContents(dbg, v.taggedValue()); - case QCborValue::SimpleType: - break; - case QCborValue::True: - return dbg << true; - case QCborValue::False: - return dbg << false; - case QCborValue::Null: - return dbg << "nullptr"; - case QCborValue::Undefined: - return dbg; - case QCborValue::Double: { - qint64 i = qint64(v.toDouble()); - if (i == v.toDouble()) - return dbg << i << ".0"; - else - return dbg << v.toDouble(); - } - case QCborValue::DateTime: - return dbg << v.toDateTime(); -#ifndef QT_BOOTSTRAPPED - case QCborValue::Url: - return dbg << v.toUrl(); -#endif -#if QT_CONFIG(regularexpression) - case QCborValue::RegularExpression: - return dbg << v.toRegularExpression(); -#endif - case QCborValue::Uuid: - return dbg << v.toUuid(); - case QCborValue::Invalid: - return dbg << "<invalid>"; - default: - break; - } - if (v.isSimpleType()) - return dbg << v.toSimpleType(); - return dbg << "<unknown type " << Qt::hex << int(v.type()) << Qt::dec << '>'; -} -QDebug operator<<(QDebug dbg, const QCborValue &v) -{ - QDebugStateSaver saver(dbg); - dbg.nospace() << "QCborValue("; - return debugContents(dbg, v) << ')'; -} - Q_CORE_EXPORT const char *qt_cbor_simpletype_id(QCborSimpleType st) { switch (st) { @@ -3072,16 +3010,6 @@ Q_CORE_EXPORT const char *qt_cbor_simpletype_id(QCborSimpleType st) return nullptr; } -QDebug operator<<(QDebug dbg, QCborSimpleType st) -{ - QDebugStateSaver saver(dbg); - const char *id = qt_cbor_simpletype_id(st); - if (id) - return dbg.nospace() << "QCborSimpleType::" << id; - - return dbg.nospace() << "QCborSimpleType(" << uint(st) << ')'; -} - Q_CORE_EXPORT const char *qt_cbor_tag_id(QCborTag tag) { // Casting to QCborKnownTags's underlying type will make the comparison @@ -3140,6 +3068,84 @@ Q_CORE_EXPORT const char *qt_cbor_tag_id(QCborTag tag) return nullptr; } +#if !defined(QT_NO_DEBUG_STREAM) +static QDebug debugContents(QDebug &dbg, const QCborValue &v) +{ + switch (v.type()) { + case QCborValue::Integer: + return dbg << v.toInteger(); + case QCborValue::ByteArray: + return dbg << "QByteArray(" << v.toByteArray() << ')'; + case QCborValue::String: + return dbg << v.toString(); + case QCborValue::Array: + return dbg << v.toArray(); + case QCborValue::Map: + return dbg << v.toMap(); + case QCborValue::Tag: { + QCborTag tag = v.tag(); + const char *id = qt_cbor_tag_id(tag); + if (id) + dbg.nospace() << "QCborKnownTags::" << id << ", "; + else + dbg.nospace() << "QCborTag(" << quint64(tag) << "), "; + return dbg << v.taggedValue(); + } + case QCborValue::SimpleType: + break; + case QCborValue::True: + return dbg << true; + case QCborValue::False: + return dbg << false; + case QCborValue::Null: + return dbg << "nullptr"; + case QCborValue::Undefined: + return dbg; + case QCborValue::Double: { + qint64 i; + if (convertDoubleTo(v.toDouble(), &i)) + return dbg << i << ".0"; + else + return dbg << v.toDouble(); + } + case QCborValue::DateTime: + return dbg << v.toDateTime(); +#ifndef QT_BOOTSTRAPPED + case QCborValue::Url: + return dbg << v.toUrl(); +#if QT_CONFIG(regularexpression) + case QCborValue::RegularExpression: + return dbg << v.toRegularExpression(); +#endif + case QCborValue::Uuid: + return dbg << v.toUuid(); +#endif + case QCborValue::Invalid: + return dbg << "<invalid>"; + default: + break; + } + if (v.isSimpleType()) + return dbg << v.toSimpleType(); + return dbg << "<unknown type 0x" << Qt::hex << int(v.type()) << Qt::dec << '>'; +} +QDebug operator<<(QDebug dbg, const QCborValue &v) +{ + QDebugStateSaver saver(dbg); + dbg.nospace() << "QCborValue("; + return debugContents(dbg, v) << ')'; +} + +QDebug operator<<(QDebug dbg, QCborSimpleType st) +{ + QDebugStateSaver saver(dbg); + const char *id = qt_cbor_simpletype_id(st); + if (id) + return dbg.nospace() << "QCborSimpleType::" << id; + + return dbg.nospace() << "QCborSimpleType(" << uint(st) << ')'; +} + QDebug operator<<(QDebug dbg, QCborTag tag) { QDebugStateSaver saver(dbg); diff --git a/src/testlib/qtest.h b/src/testlib/qtest.h index cceefde84a..57612de3de 100644 --- a/src/testlib/qtest.h +++ b/src/testlib/qtest.h @@ -1,7 +1,7 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. -** Copyright (C) 2016 Intel Corporation. +** Copyright (C) 2019 The Qt Company Ltd. +** Copyright (C) 2020 Intel Corporation. ** Contact: https://www.qt.io/licensing/ ** ** This file is part of the QtTest module of the Qt Toolkit. @@ -48,6 +48,10 @@ #include <QtCore/qbitarray.h> #include <QtCore/qbytearray.h> +#include <QtCore/qcborarray.h> +#include <QtCore/qcborcommon.h> +#include <QtCore/qcbormap.h> +#include <QtCore/qcborvalue.h> #include <QtCore/qstring.h> #include <QtCore/qstringlist.h> #include <QtCore/qcborcommon.h> @@ -69,7 +73,6 @@ QT_BEGIN_NAMESPACE - namespace QTest { @@ -232,6 +235,142 @@ template<> inline char *toString(const QVariant &v) return qstrdup(vstring.constData()); } +namespace Internal { +struct QCborValueFormatter +{ + enum { BufferLen = 256 }; + static char *formatSimpleType(QCborSimpleType st) + { + char *buf = new char[BufferLen]; + qsnprintf(buf, BufferLen, "QCborValue(QCborSimpleType(%d))", int(st)); + return buf; + } + + static char *formatTag(QCborTag tag, const QCborValue &taggedValue) + { + QScopedArrayPointer<char> hold(format(taggedValue)); + char *buf = new char[BufferLen]; + qsnprintf(buf, BufferLen, "QCborValue(QCborTag(%llu), %s)", tag, hold.get()); + return buf; + } + + static char *innerFormat(QCborValue::Type t, const char *str) + { + static const QMetaEnum typeEnum = []() { + int idx = QCborValue::staticMetaObject.indexOfEnumerator("Type"); + return QCborValue::staticMetaObject.enumerator(idx); + }(); + + char *buf = new char[BufferLen]; + const char *typeName = typeEnum.valueToKey(t); + if (typeName) + qsnprintf(buf, BufferLen, "QCborValue(%s, %s)", typeName, str); + else + qsnprintf(buf, BufferLen, "QCborValue(<unknown type 0x%02x>)", t); + return buf; + } + + template<typename T> static char *format(QCborValue::Type type, const T &t) + { + QScopedArrayPointer<char> hold(QTest::toString(t)); + return innerFormat(type, hold.get()); + } + + static char *format(const QCborValue &v) + { + switch (v.type()) { + case QCborValue::Integer: + return format(v.type(), v.toInteger()); + case QCborValue::ByteArray: + return format(v.type(), v.toByteArray()); + case QCborValue::String: + return format(v.type(), v.toString()); + case QCborValue::Array: + return innerFormat(v.type(), QScopedArrayPointer<char>(format(v.toArray())).get()); + case QCborValue::Map: + return innerFormat(v.type(), QScopedArrayPointer<char>(format(v.toMap())).get()); + case QCborValue::Tag: + return formatTag(v.tag(), v.taggedValue()); + case QCborValue::SimpleType: + break; + case QCborValue::True: + return qstrdup("QCborValue(true)"); + case QCborValue::False: + return qstrdup("QCborValue(false)"); + case QCborValue::Null: + return qstrdup("QCborValue(nullptr)"); + case QCborValue::Undefined: + return qstrdup("QCborValue()"); + case QCborValue::Double: + return format(v.type(), v.toDouble()); + case QCborValue::DateTime: + case QCborValue::Url: + case QCborValue::RegularExpression: + return format(v.type(), v.taggedValue().toString()); + case QCborValue::Uuid: + return format(v.type(), v.toUuid()); + case QCborValue::Invalid: + return qstrdup("QCborValue(<invalid>)"); + } + + if (v.isSimpleType()) + return formatSimpleType(v.toSimpleType()); + return innerFormat(v.type(), ""); + } + + static char *format(const QCborArray &a) + { + QByteArray out(1, '['); + const char *comma = ""; + for (const QCborValueRef v : a) { + QScopedArrayPointer<char> s(format(v)); + out += comma; + out += s.get(); + comma = ", "; + } + out += ']'; + return qstrdup(out.constData()); + } + + static char *format(const QCborMap &m) + { + QByteArray out(1, '{'); + const char *comma = ""; + for (auto pair : m) { + QScopedArrayPointer<char> key(format(pair.first)); + QScopedArrayPointer<char> value(format(pair.second)); + out += comma; + out += key.get(); + out += ": "; + out += value.get(); + comma = ", "; + } + out += '}'; + return qstrdup(out.constData()); + } +}; +} + +template<> inline char *toString(const QCborValue &v) +{ + return Internal::QCborValueFormatter::format(v); +} + +template<> inline char *toString(const QCborValueRef &v) +{ + return toString(QCborValue(v)); +} + +template<> inline char *toString(const QCborArray &a) +{ + return Internal::QCborValueFormatter::format(a); +} + +template<> inline char *toString(const QCborMap &m) +{ + return Internal::QCborValueFormatter::format(m); +} + template <typename T1, typename T2> inline char *toString(const std::pair<T1, T2> &pair) { |