JSON: Further improve the duplicate handling in the parser

Avoid some unnecessary comparisons and add more tests.

Task-number: QTBUG-99799
Change-Id: I3aee9f0b62461d38dadbe8e969444e1cd1f94e68
Reviewed-by: Sona Kurazyan <sona.kurazyan@qt.io>
This commit is contained in:
Ulf Hermann 2022-01-18 10:36:33 +01:00
parent 6c6b342061
commit 9f1854acf8
6 changed files with 138 additions and 13 deletions

View File

@ -389,12 +389,24 @@ static Iterator customAssigningUniqueLast(Iterator first, Iterator last,
if (first == last)
return last;
Iterator result = first;
// After adjacent_find, we know that *first and *(first+1) compare equal,
// and that first+1 != last.
Iterator result = first++;
Q_ASSERT(compare(*result, *first));
assign(*result, *first);
Q_ASSERT(first != last);
while (++first != last) {
if (!compare(*result, *first))
++result;
if (result != first)
assign(*result, *first);
// Due to adjacent_find above, we know that we've at least eliminated one element.
// Therefore we have to move each further element across the gap.
Q_ASSERT(result != first);
// We have to overwrite each element we want to eliminate, to deref() the container.
// Therefore we don't try to optimize the number of assignments here.
assign(*result, *first);
}
return ++result;

View File

@ -24,6 +24,9 @@ if(ANDROID OR INTEGRITY)
"test.json"
"test2.json"
"test3.json"
"simple.duplicates.json"
"test.duplicates.json"
"test3.duplicates.json"
)
qt_internal_add_resource(tst_json "json"

View File

@ -0,0 +1 @@
{"":{"":0},"":0}

View File

@ -0,0 +1,66 @@
[
"JSON Test Pattern pass1",
{"a":["array with 1 element"]},
{},
[],
-42,
true,
false,
null,
{
"a": 1234567890,
"a": -9876.543210,
"a": 0.123456789e-12,
"a": 1.234567890E+34,
"a": 23456789012E66,
"a": 0,
"a": 1,
"a": " ",
"a": "\"",
"a": "\\",
"a": "\b\f\n\r\t",
"a": "/ & \/",
"a": "abcdefghijklmnopqrstuvwxyz",
"a": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
"a": "0123456789",
"a": "digit",
"a": "`1~!@#$%^&*()_+-={':[,]}|;.</>?",
"a": "\u0123\u4567\u89AB\uCDEF\uabcd\uef4A",
"a": true,
"a": false,
"a": null,
"a":[ ],
"a":{ },
"a": "50 St. James Street",
"a": "nix",
"a": "// /* <!-- --",
"a": " ",
"a":[1,2 , 3
,
4 , 5 , 6 ,7 ],"a":[1,2,3,4,5,6,7],
"a": "\"a:[\"array with 1 element\"]}",
"a": "&#34; \u0022 %22 0x22 034 &#x22;",
"a": "A key can be any string"
},
0.5 ,98.6
,
99.44
,
1066,
1e1,
0.1e1,
1e-1,
1e00,
2e+00,
2e-00,
"rosebud",
{"a": "bar"},
{"a":{"a":1000,"a":{"a":"nix"}},"a":{"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$4,833.99","a":483399}},"a":[{"a":"PRODUCT","a":"Silicone c","a":"Elite Hori","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":310711221747712.000000,"a":{"a":{"a":"$1.56","a":156},"a":{"a":"$29.99","a":2999},"a":14},"a":1968262863,"a":8515},{"a":"PRODUCT","a":"Nonslip Ch","a":"Specificat","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":175580930637824.000000,"a":{"a":{"a":"$0.45","a":45},"a":{"a":"$194.95","a":19495},"a":34},"a":2534935499,"a":8515},{"a":"PRODUCT","a":"Plastic Ca","a":"Descriptio","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":132488642953216.000000,"a":{"a":{"a":"$0.99","a":99},"a":{"a":"$303.68","a":30368},"a":33},"a":2305624670,"a":8515},{"a":"PRODUCT","a":"Protective","a":"Made of hi","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":108614681362432.000000,"a":{"a":{"a":"$1.70","a":170},"a":{"a":"$99.99","a":9999},"a":11},"a":2120981405,"a":8515},{"a":"PRODUCT","a":"P® 4","a":"Do more th","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":96203484168192.000000,"a":{"a":{"a":"$2.49","a":249},"a":{"a":"$79.95","a":7995},"a":16},"a":2203798762,"a":8515},{"a":"PRODUCT","a":"Case Refle","a":"NCAA iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":84727583211520.000000,"a":{"a":{"a":"$0.69","a":69},"a":{"a":"$75.52","a":7552},"a":59},"a":1114627445,"a":8515},{"a":"PRODUCT","a":"Infuse Pro","a":"Protect an","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":80831066406912.000000,"a":{"a":{"a":"$0.59","a":59},"a":{"a":"$79.00","a":7900},"a":24},"a":2557462717,"a":8515},{"a":"PRODUCT","a":"Dragonfly ","a":"d","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":70900229603328.000000,"a":{"a":{"a":"$1.05","a":105},"a":{"a":"$94.49","a":9449},"a":30},"a":2442061740,"a":8515},{"a":"PRODUCT","a":"Pho","a":"Snap on Ap","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":65194915004416.000000,"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$414.99","a":41499},"a":39},"a":2004746863,"a":8515},{"a":"PRODUCT","a":"Otterbox i","a":"Your iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":61515478597632.000000,"a":{"a":{"a":"$3.28","a":328},"a":{"a":"$110.65","a":11065},"a":25},"a":2584611575,"a":8515}],"a":10,"a":2000}},
{"a":{"a":1000,"a":{"a":"nix"}},"a":{"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$4,833.99","a":483399}},"a":[{"a":"PRODUCT","a":"Silicone c","a":"Elite Hori","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":310711221747712.000000,"a":{"a":{"a":"$1.56","a":156},"a":{"a":"$29.99","a":2999},"a":14},"a":1968262863,"a":8515},{"a":"PRODUCT","a":"Nonslip Ch","a":"Specificat","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":175580930637824.000000,"a":{"a":{"a":"$0.45","a":45},"a":{"a":"$194.95","a":19495},"a":34},"a":2534935499,"a":8515},{"a":"PRODUCT","a":"Plastic Ca","a":"Descriptio","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":132488642953216.000000,"a":{"a":{"a":"$0.99","a":99},"a":{"a":"$303.68","a":30368},"a":33},"a":2305624670,"a":8515},{"a":"PRODUCT","a":"Protective","a":"Made of hi","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":108614681362432.000000,"a":{"a":{"a":"$1.70","a":170},"a":{"a":"$99.99","a":9999},"a":11},"a":2120981405,"a":8515},{"a":"PRODUCT","a":"P® 4","a":"Do more th","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":96203484168192.000000,"a":{"a":{"a":"$2.49","a":249},"a":{"a":"$79.95","a":7995},"a":16},"a":2203798762,"a":8515},{"a":"PRODUCT","a":"Case Refle","a":"NCAA iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":84727583211520.000000,"a":{"a":{"a":"$0.69","a":69},"a":{"a":"$75.52","a":7552},"a":59},"a":1114627445,"a":8515},{"a":"PRODUCT","a":"Infuse Pro","a":"Protect an","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":80831066406912.000000,"a":{"a":{"a":"$0.59","a":59},"a":{"a":"$79.00","a":7900},"a":24},"a":2557462717,"a":8515},{"a":"PRODUCT","a":"Dragonfly ","a":"d","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":70900229603328.000000,"a":{"a":{"a":"$1.05","a":105},"a":{"a":"$94.49","a":9449},"a":30},"a":2442061740,"a":8515},{"a":"PRODUCT","a":"Pho","a":"Snap on Ap","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":65194915004416.000000,"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$414.99","a":41499},"a":39},"a":2004746863,"a":8515},{"a":"PRODUCT","a":"Otterbox i","a":"Your iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":61515478597632.000000,"a":{"a":{"a":"$3.28","a":328},"a":{"a":"$110.65","a":11065},"a":25},"a":2584611575,"a":8515}],"a":10,"a":2000}},
{"a":{"a":1000,"a":{"a":"nix"}},"a":{"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$4,833.99","a":483399}},"a":[{"a":"PRODUCT","a":"Silicone c","a":"Elite Hori","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":310711221747712.000000,"a":{"a":{"a":"$1.56","a":156},"a":{"a":"$29.99","a":2999},"a":14},"a":1968262863,"a":8515},{"a":"PRODUCT","a":"Nonslip Ch","a":"Specificat","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":175580930637824.000000,"a":{"a":{"a":"$0.45","a":45},"a":{"a":"$194.95","a":19495},"a":34},"a":2534935499,"a":8515},{"a":"PRODUCT","a":"Plastic Ca","a":"Descriptio","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":132488642953216.000000,"a":{"a":{"a":"$0.99","a":99},"a":{"a":"$303.68","a":30368},"a":33},"a":2305624670,"a":8515},{"a":"PRODUCT","a":"Protective","a":"Made of hi","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":108614681362432.000000,"a":{"a":{"a":"$1.70","a":170},"a":{"a":"$99.99","a":9999},"a":11},"a":2120981405,"a":8515},{"a":"PRODUCT","a":"P® 4","a":"Do more th","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":96203484168192.000000,"a":{"a":{"a":"$2.49","a":249},"a":{"a":"$79.95","a":7995},"a":16},"a":2203798762,"a":8515},{"a":"PRODUCT","a":"Case Refle","a":"NCAA iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":84727583211520.000000,"a":{"a":{"a":"$0.69","a":69},"a":{"a":"$75.52","a":7552},"a":59},"a":1114627445,"a":8515},{"a":"PRODUCT","a":"Infuse Pro","a":"Protect an","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":80831066406912.000000,"a":{"a":{"a":"$0.59","a":59},"a":{"a":"$79.00","a":7900},"a":24},"a":2557462717,"a":8515},{"a":"PRODUCT","a":"Dragonfly ","a":"d","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":70900229603328.000000,"a":{"a":{"a":"$1.05","a":105},"a":{"a":"$94.49","a":9449},"a":30},"a":2442061740,"a":8515},{"a":"PRODUCT","a":"Pho","a":"Snap on Ap","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":65194915004416.000000,"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$414.99","a":41499},"a":39},"a":2004746863,"a":8515},{"a":"PRODUCT","a":"Otterbox i","a":"Your iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":61515478597632.000000,"a":{"a":{"a":"$3.28","a":328},"a":{"a":"$110.65","a":11065},"a":25},"a":2584611575,"a":8515}],"a":10,"a":2000}},
{"a":{"a":1000,"a":{"a":"nix"}},"a":{"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$4,833.99","a":483399}},"a":[{"a":"PRODUCT","a":"Silicone c","a":"Elite Hori","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":310711221747712.000000,"a":{"a":{"a":"$1.56","a":156},"a":{"a":"$29.99","a":2999},"a":14},"a":1968262863,"a":8515},{"a":"PRODUCT","a":"Nonslip Ch","a":"Specificat","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":175580930637824.000000,"a":{"a":{"a":"$0.45","a":45},"a":{"a":"$194.95","a":19495},"a":34},"a":2534935499,"a":8515},{"a":"PRODUCT","a":"Plastic Ca","a":"Descriptio","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":132488642953216.000000,"a":{"a":{"a":"$0.99","a":99},"a":{"a":"$303.68","a":30368},"a":33},"a":2305624670,"a":8515},{"a":"PRODUCT","a":"Protective","a":"Made of hi","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":108614681362432.000000,"a":{"a":{"a":"$1.70","a":170},"a":{"a":"$99.99","a":9999},"a":11},"a":2120981405,"a":8515},{"a":"PRODUCT","a":"P® 4","a":"Do more th","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":96203484168192.000000,"a":{"a":{"a":"$2.49","a":249},"a":{"a":"$79.95","a":7995},"a":16},"a":2203798762,"a":8515},{"a":"PRODUCT","a":"Case Refle","a":"NCAA iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":84727583211520.000000,"a":{"a":{"a":"$0.69","a":69},"a":{"a":"$75.52","a":7552},"a":59},"a":1114627445,"a":8515},{"a":"PRODUCT","a":"Infuse Pro","a":"Protect an","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":80831066406912.000000,"a":{"a":{"a":"$0.59","a":59},"a":{"a":"$79.00","a":7900},"a":24},"a":2557462717,"a":8515},{"a":"PRODUCT","a":"Dragonfly ","a":"d","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":70900229603328.000000,"a":{"a":{"a":"$1.05","a":105},"a":{"a":"$94.49","a":9449},"a":30},"a":2442061740,"a":8515},{"a":"PRODUCT","a":"Pho","a":"Snap on Ap","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":65194915004416.000000,"a":{"a":{"a":"$0.01","a":1},"a":{"a":"$414.99","a":41499},"a":39},"a":2004746863,"a":8515},{"a":"PRODUCT","a":"Otterbox i","a":"Your iPhon","a":"someone","a":{"a":"nix"},"a":{"a":[{"a":"nix","a":60,"a":60},{"a":"nix","a":100,"a":100},{"a":"nix","a":160,"a":160},{"a":"nix","a":400,"a":400}]},"a":61515478597632.000000,"a":{"a":{"a":"$3.28","a":328},"a":{"a":"$110.65","a":11065},"a":25},"a":2584611575,"a":8515}],"a":10,"a":2000}}
]

View File

@ -0,0 +1,15 @@
{
"a": "John",
"a": "Smith",
"a": 25,
"a": {
"a": "21 2nd Street",
"a": "New York",
"a": "NY",
"a": "10021"
},
"a": [
{ "a": "home", "a": "212 555-1234" },
{ "a": "fax", "a": "646 555-4567" }
]
}

View File

@ -175,6 +175,8 @@ private Q_SLOTS:
void fromToVariantConversions();
void testIteratorComparison();
void noLeakOnNameClash_data();
void noLeakOnNameClash();
private:
@ -3647,22 +3649,48 @@ void tst_QtJson::testIteratorComparison()
QVERIFY(t.end() > t.begin());
}
void tst_QtJson::noLeakOnNameClash_data()
{
QTest::addColumn<QString>("fileName");
QTest::addColumn<QByteArray>("result");
QTest::addRow("simple")
<< QStringLiteral("simple.duplicates.json")
<< QByteArray(R"({"": 0})");
QTest::addRow("test")
<< QStringLiteral("test.duplicates.json")
<< QByteArray(R"([
"JSON Test Pattern pass1", {"a": ["array with 1 element"]}, {}, [], -42, true,
false, null, {"a": "A key can be any string"}, 0.5, 98.6, 99.44, 1066, 10, 1,
0.1, 1, 2, 2, "rosebud", {"a": "bar"}, {"a": {"a": 2000}}, {"a": {"a": 2000}},
{"a": {"a": 2000}}, {"a": {"a": 2000}}
])");
QTest::addRow("test3")
<< QStringLiteral("test3.duplicates.json")
<< QByteArray(R"({"a": [{"a": "212 555-1234"}, {"a": "646 555-4567"}]})");
}
void tst_QtJson::noLeakOnNameClash()
{
QJsonDocument doc = QJsonDocument::fromJson("{\"\":{\"\":0},\"\":0}");
QVERIFY(!doc.isNull());
const QJsonObject obj = doc.object();
QFETCH(QString, fileName);
QFETCH(QByteArray, result);
// Removed the duplicate key.
QCOMPARE(obj.length(), 1);
QFile file(testDataDir + u'/' + fileName);
QVERIFY(file.open(QFile::ReadOnly));
QByteArray testJson = file.readAll();
QVERIFY(!testJson.isEmpty());
// Retained the last of the duplicates.
const QJsonValue val = obj.begin().value();
QVERIFY(val.isDouble());
QCOMPARE(val.toDouble(), 0.0);
QJsonParseError error;
// Retains the last one of each set of duplicate keys.
QJsonDocument doc = QJsonDocument::fromJson(testJson, &error);
QVERIFY2(!doc.isNull(), qPrintable(error.errorString()));
QJsonDocument expected = QJsonDocument::fromJson(result, &error);
QVERIFY2(!expected.isNull(), qPrintable(error.errorString()));
QCOMPARE(doc, expected);
// It should not leak.
// In particular it should not forget to deref the container for the inner object.
// In particular it should not forget to deref the container for the inner objects.
}
QTEST_MAIN(tst_QtJson)