From 115d99b7de934f30d52fbcf56ee4ff170377dd26 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Thu, 2 Sep 2021 11:44:38 -0700 Subject: tst_QtJson: add matching escape-generating test Change-Id: Ie72b0dd0fbe84d2caae0fffd16a11596eb61a90e Reviewed-by: Ievgenii Meshcheriakov Reviewed-by: Lars Knoll Reviewed-by: Edward Welbourne --- .../auto/corelib/serialization/json/tst_qtjson.cpp | 55 ++++++++++++++++++++++ 1 file changed, 55 insertions(+) (limited to 'tests/auto') diff --git a/tests/auto/corelib/serialization/json/tst_qtjson.cpp b/tests/auto/corelib/serialization/json/tst_qtjson.cpp index 80e6b2166f..ec3e0a97f1 100644 --- a/tests/auto/corelib/serialization/json/tst_qtjson.cpp +++ b/tests/auto/corelib/serialization/json/tst_qtjson.cpp @@ -120,6 +120,8 @@ private Q_SLOTS: void parseEscapes_data(); void parseEscapes(); + void makeEscapes_data(); + void makeEscapes(); void assignObjects(); void assignArrays(); @@ -2509,6 +2511,59 @@ void tst_QtJson::parseEscapes() QCOMPARE(array.first().toString(), result); } +void tst_QtJson::makeEscapes_data() +{ + QTest::addColumn("input"); + QTest::addColumn("result"); + + auto addUnicodeRow = [](char16_t c) { + char buf[32]; // more than enough + snprintf(buf, std::size(buf), "\\u%04x", c); + QTest::addRow("U+%04X", c) << QString(c) << QByteArray(buf); + }; + + + QTest::addRow("quote") << "\"" << QByteArray(R"(\")"); + QTest::addRow("backslash") << "\\" << QByteArray(R"(\\)"); + //QTest::addRow("slash") << "/" << QByteArray(R"(\/)"); // does not get escaped + QTest::addRow("backspace") << "\b" << QByteArray(R"(\b)"); + QTest::addRow("form-feed") << "\f" << QByteArray(R"(\f)"); + QTest::addRow("newline") << "\n" << QByteArray(R"(\n)"); + QTest::addRow("carriage-return") << "\r" << QByteArray(R"(\r)"); + QTest::addRow("tab") << "\t" << QByteArray(R"(\t)"); + + // control characters other than the above + for (char16_t c = 0; c < 0x20; ++c) { + if (c && strchr("\b\f\n\r\t", c)) + continue; + addUnicodeRow(c); + } + // unpaired surrogates + addUnicodeRow(char16_t(0xd800)); + addUnicodeRow(char16_t(0xdc00)); + + QString improperlyPaired; + improperlyPaired.append(char16_t(0xdc00)); + improperlyPaired.append(char16_t(0xd800)); + QTest::addRow("inverted-surrogates") << improperlyPaired << QByteArray("\\udc00\\ud800"); +} + +void tst_QtJson::makeEscapes() +{ + QFETCH(QString, input); + QFETCH(QByteArray, result); + + QJsonArray array = { input }; + QByteArray json = QJsonDocument(array).toJson(QJsonDocument::Compact); + + QVERIFY(json.startsWith("[\"")); + result.prepend("[\""); + QVERIFY(json.endsWith("\"]")); + result.append("\"]"); + + QCOMPARE(json, result); +} + void tst_QtJson::assignObjects() { const char *json = -- cgit v1.2.3