@@ -34,162 +34,199 @@ class TestQgsJsonUtils : public QObject
34
34
Q_ENUM ( JsonAlgs )
35
35
36
36
Q_OBJECT
37
- private slots:
38
- void testStringList ()
39
- {
40
- QStringList list;
41
37
42
- {
43
- const QString json = QgsJsonUtils::encodeValue ( list );
44
- QCOMPARE ( json, QString ( " []" ) );
45
- const QVariant back = QgsJsonUtils::parseArray ( json, QVariant::String );
46
- QCOMPARE ( back.toStringList (), list );
47
- }
48
-
49
- {
50
- list << QStringLiteral ( " one" ) << QStringLiteral ( " <',\"\\ >" ) << QStringLiteral ( " two" );
51
- const QString json = QgsJsonUtils::encodeValue ( list );
52
- QCOMPARE ( json, QString ( " [\" one\" ,\" <',\\\"\\\\ >\" ,\" two\" ]" ) );
53
- const QVariant back = QgsJsonUtils::parseArray ( json, QVariant::String );
54
- QCOMPARE ( back.toStringList (), list );
55
- }
56
- }
38
+ private slots:
39
+ void testStringList ();
40
+ void testJsonArray ();
41
+ void testIntList ();
42
+ void testDoubleList ();
43
+ void testExportAttributesJson_data ();
44
+ void testExportAttributesJson ();
45
+ void testExportFeatureJson ();
46
+ void testExportGeomToJson ();
47
+ };
57
48
58
- void testIntList ()
59
- {
60
- QVariantList list;
61
49
62
- {
63
- list << 1 << -2 ;
64
- const QString json = QgsJsonUtils::encodeValue ( list );
65
- QCOMPARE ( json, QString ( " [1,-2]" ) );
66
- const QVariantList back = QgsJsonUtils::parseArray ( json, QVariant::Int );
67
- QCOMPARE ( back, list );
68
- QCOMPARE ( back.at ( 0 ).type (), QVariant::Int );
69
- }
70
50
71
- {
72
- // check invalid entries are ignored
73
- const QVariantList back = QgsJsonUtils::parseArray ( QStringLiteral ( " [1,\" a\" ,-2]" ), QVariant::Int );
74
- QCOMPARE ( back, list );
75
- }
76
- }
51
+ void TestQgsJsonUtils::testStringList ()
52
+ {
53
+ QStringList list;
54
+
55
+ {
56
+ const QString json = QgsJsonUtils::encodeValue ( list );
57
+ QCOMPARE ( json, QString ( " []" ) );
58
+ const QVariant back = QgsJsonUtils::parseArray ( json, QVariant::String );
59
+ QCOMPARE ( back.toStringList (), list );
60
+ }
61
+
62
+ {
63
+ list << QStringLiteral ( " one" ) << QStringLiteral ( " <',\"\\ >" ) << QStringLiteral ( " two" );
64
+ const QString json = QgsJsonUtils::encodeValue ( list );
65
+ QCOMPARE ( json, QString ( " [\" one\" ,\" <',\\\"\\\\ >\" ,\" two\" ]" ) );
66
+ const QVariant back = QgsJsonUtils::parseArray ( json, QVariant::String );
67
+ QCOMPARE ( back.toStringList (), list );
68
+ }
69
+ }
70
+
71
+ void TestQgsJsonUtils::testJsonArray ()
72
+ {
73
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [1,2,3])" , QVariant::Int ), QVariantList () << 1 << 2 << 3 );
74
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [1,2,3])" ), QVariantList () << 1 << 2 << 3 );
75
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [1,2,3])" , QVariant::Double ), QVariantList () << 1.0 << 2.0 << 3.0 );
76
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [1.0,2.0,3.0])" ), QVariantList () << 1.0 << 2.0 << 3.0 );
77
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [1.234567,2.00003e+4,-3.01234e-02])" ), QVariantList () << 1.234567 << 2.00003e+4 << -3.01234e-2 );
78
+ // Strings
79
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( ["one", "two", "three"])" ), QVariantList () << " one" << " two" << " three" );
80
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( ["one,comma", "two[]brackets", "three\"escaped"])" ), QVariantList () << " one,comma" << " two[]brackets" << " three\" escaped" );
81
+ // Nested (not implemented: discard deeper levels)
82
+ // QCOMPARE( QgsJsonUtils::parseArray( R"([1.0,[2.0,5.0],3.0])" ), QVariantList() << 1.0 << 3.0 );
83
+ // Mixed types
84
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [1,"a",2.0])" ), QVariantList () << 1 << " a" << 2.0 );
85
+ // discarded ...
86
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [1,"a",2.0])" , QVariant::Int ), QVariantList () << 1 << 2.0 );
87
+ // Try invalid JSON
88
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( not valid json here)" ), QVariantList () );
89
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( not valid json here)" , QVariant::Int ), QVariantList () );
90
+ // Empty
91
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [])" , QVariant::Int ), QVariantList () );
92
+ QCOMPARE ( QgsJsonUtils::parseArray ( " " , QVariant::Int ), QVariantList () );
93
+ // Nulls
94
+ QCOMPARE ( QgsJsonUtils::parseArray ( R"( [null, null])" ), QVariantList () << QVariant () << QVariant () );
95
+ }
96
+
97
+ void TestQgsJsonUtils::testIntList ()
98
+ {
99
+ QVariantList list;
100
+
101
+ {
102
+ list << 1 << -2 ;
103
+ const QString json = QgsJsonUtils::encodeValue ( list );
104
+ QCOMPARE ( json, QString ( " [1,-2]" ) );
105
+ const QVariantList back = QgsJsonUtils::parseArray ( json, QVariant::Int );
106
+ QCOMPARE ( back, list );
107
+ QCOMPARE ( back.at ( 0 ).type (), QVariant::Int );
108
+ }
109
+
110
+ {
111
+ // check invalid entries are ignored
112
+ const QVariantList back = QgsJsonUtils::parseArray ( QStringLiteral ( " [1,\" a\" ,-2]" ), QVariant::Int );
113
+ QCOMPARE ( back, list );
114
+ }
115
+ }
116
+
117
+ void TestQgsJsonUtils::testDoubleList ()
118
+ {
119
+ QVariantList list;
77
120
78
- void testDoubleList ()
79
- {
80
- QVariantList list;
81
-
82
- list << 1.0 << -2.2456 ;
83
- const QString json = QgsJsonUtils::encodeValue ( list );
84
- QCOMPARE ( json, QString ( " [1,-2.2456]" ) );
85
- const QVariantList back = QgsJsonUtils::parseArray ( json, QVariant::Double );
86
- QCOMPARE ( back, list );
87
- QCOMPARE ( back.at ( 0 ).type (), QVariant::Double );
88
- }
121
+ list << 1.0 << -2.2456 ;
122
+ const QString json = QgsJsonUtils::encodeValue ( list );
123
+ QCOMPARE ( json, QString ( " [1,-2.2456]" ) );
124
+ const QVariantList back = QgsJsonUtils::parseArray ( json, QVariant::Double );
125
+ QCOMPARE ( back, list );
126
+ QCOMPARE ( back.at ( 0 ).type (), QVariant::Double );
127
+ }
89
128
90
- void testExportAttributesJson_data ()
91
- {
92
- QTest::addColumn<JsonAlgs>( " jsonAlg " );
93
- QTest::newRow ( " Use json" ) << JsonAlgs::Json;
94
- QTest::newRow ( " Use old string concat" ) << JsonAlgs::String;
95
- }
129
+ void TestQgsJsonUtils:: testExportAttributesJson_data ()
130
+ {
131
+ QTest::addColumn<JsonAlgs>( " JsonAlgs " );
132
+ QTest::newRow ( " Use json" ) << JsonAlgs::Json;
133
+ QTest::newRow ( " Use old string concat" ) << JsonAlgs::String;
134
+ }
96
135
97
- void testExportAttributesJson ()
98
- {
136
+ void TestQgsJsonUtils:: testExportAttributesJson ()
137
+ {
99
138
100
- QFETCH ( enum JsonAlgs, jsonAlg );
139
+ QFETCH ( enum JsonAlgs, JsonAlgs );
101
140
102
- QgsVectorLayer vl { QStringLiteral ( " Point?field=fldtxt:string&field=fldint:integer&field=flddbl:double" ), QStringLiteral ( " mem" ), QStringLiteral ( " memory" ) };
103
- QgsFeature feature { vl.fields () };
104
- feature.setAttributes ( QgsAttributes () << QStringLiteral ( " a value" ) << 1 << 2.0 );
141
+ QgsVectorLayer vl { QStringLiteral ( " Point?field=fldtxt:string&field=fldint:integer&field=flddbl:double" ), QStringLiteral ( " mem" ), QStringLiteral ( " memory" ) };
142
+ QgsFeature feature { vl.fields () };
143
+ feature.setAttributes ( QgsAttributes () << QStringLiteral ( " a value" ) << 1 << 2.0 );
105
144
106
- if ( jsonAlg == JsonAlgs::Json ) // 0.0022
107
- {
108
- QBENCHMARK
109
- {
110
- json j { QgsJsonUtils::exportAttributesToJsonObject ( feature, &vl ) };
111
- QCOMPARE ( QString::fromStdString ( j.dump () ), QStringLiteral ( R"raw( {"flddbl":2.0,"fldint":1,"fldtxt":"a value"})raw" ) );
112
- }
113
- }
114
- else // 0.0032
115
- {
116
- QBENCHMARK
117
- {
118
- const auto json { QgsJsonUtils::exportAttributes ( feature, &vl ) };
119
- QCOMPARE ( json, QStringLiteral ( " {\" fldtxt\" :\" a value\" ,\n\" fldint\" :1,\n\" flddbl\" :2}" ) );
120
- }
121
- }
145
+ if ( JsonAlgs == JsonAlgs::Json ) // 0.0022
146
+ {
147
+ QBENCHMARK
148
+ {
149
+ json j { QgsJsonUtils::exportAttributesToJsonObject ( feature, &vl ) };
150
+ QCOMPARE ( QString::fromStdString ( j.dump () ), QStringLiteral ( R"raw( {"flddbl":2.0,"fldint":1,"fldtxt":"a value"})raw" ) );
122
151
}
123
-
124
- void testExportFeatureJson ()
152
+ }
153
+ else // 0.0032
154
+ {
155
+ QBENCHMARK
125
156
{
157
+ const auto json { QgsJsonUtils::exportAttributes ( feature, &vl ) };
158
+ QCOMPARE ( json, QStringLiteral ( " {\" fldtxt\" :\" a value\" ,\n\" fldint\" :1,\n\" flddbl\" :2}" ) );
159
+ }
160
+ }
161
+ }
126
162
163
+ void TestQgsJsonUtils::testExportFeatureJson ()
164
+ {
127
165
128
- QgsVectorLayer vl { QStringLiteral ( " Polygon?field=fldtxt:string&field=fldint:integer&field=flddbl:double" ), QStringLiteral ( " mem" ), QStringLiteral ( " memory" ) };
129
- QgsFeature feature { vl.fields () };
130
- feature.setGeometry ( QgsGeometry::fromWkt ( QStringLiteral ( " POLYGON((1.12 1.34,5.45 1.12,5.34 5.33,1.56 5.2,1.12 1.34),(2 2, 3 2, 3 3, 2 3,2 2))" ) ) );
131
- feature.setAttributes ( QgsAttributes () << QStringLiteral ( " a value" ) << 1 << 2.0 );
132
166
133
- QgsJsonExporter exporter { &vl };
167
+ QgsVectorLayer vl { QStringLiteral ( " Polygon?field=fldtxt:string&field=fldint:integer&field=flddbl:double" ), QStringLiteral ( " mem" ), QStringLiteral ( " memory" ) };
168
+ QgsFeature feature { vl.fields () };
169
+ feature.setGeometry ( QgsGeometry::fromWkt ( QStringLiteral ( " POLYGON((1.12 1.34,5.45 1.12,5.34 5.33,1.56 5.2,1.12 1.34),(2 2, 3 2, 3 3, 2 3,2 2))" ) ) );
170
+ feature.setAttributes ( QgsAttributes () << QStringLiteral ( " a value" ) << 1 << 2.0 );
134
171
135
- const auto expectedJson { QStringLiteral ( " {\" bbox\" :[[1.12,1.12,5.45,5.33]],\" geometry\" :{\" coordinates\" :"
136
- " [[[1.12,1.34],[5.45,1.12],[5.34,5.33],[1.56,5.2],[1.12,1.34]],"
137
- " [[2.0,2.0],[3.0,2.0],[3.0,3.0],[2.0,3.0],[2.0,2.0]]],\" type\" :\" Polygon\" }"
138
- " ,\" id\" :0,\" properties\" :{\" flddbl\" :2.0,\" fldint\" :1,\" fldtxt\" :\" a value\" }"
139
- " ,\" type\" :\" Feature\" }" ) };
172
+ QgsJsonExporter exporter { &vl };
140
173
141
- const auto j { exporter. exportFeatureToJsonObject ( feature ) };
142
- QCOMPARE ( QString::fromStdString ( j. dump () ), expectedJson );
143
- const auto json { exporter. exportFeature ( feature ) };
144
- QCOMPARE ( json, expectedJson );
145
- }
174
+ const auto expectedJson { QStringLiteral ( " { \" bbox \" :[[1.12,1.12,5.45,5.33]], \" geometry \" :{ \" coordinates \" : "
175
+ " [[[1.12,1.34],[5.45,1.12],[5.34,5.33],[1.56,5.2],[1.12,1.34]], "
176
+ " [[2.0,2.0],[3.0,2.0],[3.0,3.0],[2.0,3.0],[2.0,2.0]]], \" type \" : \" Polygon \" } "
177
+ " , \" id \" :0, \" properties \" :{ \" flddbl \" :2.0, \" fldint \" :1, \" fldtxt \" : \" a value \" } "
178
+ " , \" type \" : \" Feature \" } " ) };
146
179
180
+ const auto j { exporter.exportFeatureToJsonObject ( feature ) };
181
+ QCOMPARE ( QString::fromStdString ( j.dump () ), expectedJson );
182
+ const auto json { exporter.exportFeature ( feature ) };
183
+ QCOMPARE ( json, expectedJson );
184
+ }
147
185
148
- void testExportGeomToJson ()
186
+ void TestQgsJsonUtils::testExportGeomToJson ()
187
+ {
188
+ const QMap<QString, QString> testWkts
189
+ {
149
190
{
150
- const QMap<QString, QString> testWkts
151
191
{
152
- {
153
- {
154
- QStringLiteral ( " LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)" ),
155
- QStringLiteral ( R"json( {"coordinates":[[-71.16,42.259],[-71.161,42.259],[-71.161,42.259]],"type":"LineString"})json" )
156
- },
157
- {
158
- QStringLiteral ( " MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932), (-70 43.56, -67 44.68))" ),
159
- QStringLiteral ( R"json( {"coordinates":[[[-71.16,42.259],[-71.161,42.259],[-71.161,42.259]],[[-70.0,43.56],[-67.0,44.68]]],"type":"MultiLineString"})json" )
160
- },
161
- { QStringLiteral ( " POINT(-71.064544 42.28787)" ), QStringLiteral ( R"json( {"coordinates":[-71.065,42.288],"type":"Point"})json" ) },
162
- { QStringLiteral ( " MULTIPOINT(-71.064544 42.28787, -71.1776585052917 42.3902909739571)" ), QStringLiteral ( R"json( {"coordinates":[[-71.065,42.288],[-71.178,42.39]],"type":"MultiPoint"})json" ) },
163
- {
164
- QStringLiteral ( " POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,"
165
- " -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))" ),
166
- QStringLiteral ( R"json( {"coordinates":[[[-71.178,42.39],[-71.178,42.39],[-71.178,42.39],[-71.178,42.39],[-71.178,42.39]]],"type":"Polygon"})json" )
167
- },
168
- {
169
- QStringLiteral ( " MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)),((3 3,6 2,6 4,3 3)))" ),
170
- QStringLiteral ( R"json( {"coordinates":[[[[1.0,1.0],[5.0,1.0],[5.0,5.0],[1.0,5.0],[1.0,1.0]],[[2.0,2.0],[3.0,2.0],[3.0,3.0],[2.0,3.0],[2.0,2.0]]],[[[3.0,3.0],[6.0,2.0],[6.0,4.0],[3.0,3.0]]]],"type":"MultiPolygon"})json" )
171
- },
172
- // Note: CIRCULARSTRING json is very long, we will check first three vertices only
173
- { QStringLiteral ( " CIRCULARSTRING(220268 150415,220227 150505,220227 150406)" ), QStringLiteral ( R"json( {"coordinates":[[220268.0,150415.0],[220268.7,150415.535],[220269.391,150416.081])json" ) },
174
- }
175
- };
176
-
177
- for ( const auto &w : testWkts.toStdMap () )
192
+ QStringLiteral ( " LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)" ),
193
+ QStringLiteral ( R"json( {"coordinates":[[-71.16,42.259],[-71.161,42.259],[-71.161,42.259]],"type":"LineString"})json" )
194
+ },
195
+ {
196
+ QStringLiteral ( " MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932), (-70 43.56, -67 44.68))" ),
197
+ QStringLiteral ( R"json( {"coordinates":[[[-71.16,42.259],[-71.161,42.259],[-71.161,42.259]],[[-70.0,43.56],[-67.0,44.68]]],"type":"MultiLineString"})json" )
198
+ },
199
+ { QStringLiteral ( " POINT(-71.064544 42.28787)" ), QStringLiteral ( R"json( {"coordinates":[-71.065,42.288],"type":"Point"})json" ) },
200
+ { QStringLiteral ( " MULTIPOINT(-71.064544 42.28787, -71.1776585052917 42.3902909739571)" ), QStringLiteral ( R"json( {"coordinates":[[-71.065,42.288],[-71.178,42.39]],"type":"MultiPoint"})json" ) },
201
+ {
202
+ QStringLiteral ( " POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,"
203
+ " -71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))" ),
204
+ QStringLiteral ( R"json( {"coordinates":[[[-71.178,42.39],[-71.178,42.39],[-71.178,42.39],[-71.178,42.39],[-71.178,42.39]]],"type":"Polygon"})json" )
205
+ },
178
206
{
179
- const auto g { QgsGeometry::fromWkt ( w.first ) };
180
- QVERIFY ( !g.isNull ( ) );
181
- if ( w.first .startsWith ( QStringLiteral ( " CIRCULARSTRING" ) ) )
182
- {
183
- QVERIFY ( g.asJson ( 3 ).startsWith ( w.second ) );
184
- QCOMPARE ( QString::fromStdString ( g.asJsonObject ( 3 )[" type" ].dump () ), QStringLiteral ( R"( "LineString")" ) );
185
- }
186
- else
187
- {
188
- QCOMPARE ( g.asJson ( 3 ), w.second );
189
- }
190
- }
207
+ QStringLiteral ( " MULTIPOLYGON(((1 1,5 1,5 5,1 5,1 1),(2 2, 3 2, 3 3, 2 3,2 2)),((3 3,6 2,6 4,3 3)))" ),
208
+ QStringLiteral ( R"json( {"coordinates":[[[[1.0,1.0],[5.0,1.0],[5.0,5.0],[1.0,5.0],[1.0,1.0]],[[2.0,2.0],[3.0,2.0],[3.0,3.0],[2.0,3.0],[2.0,2.0]]],[[[3.0,3.0],[6.0,2.0],[6.0,4.0],[3.0,3.0]]]],"type":"MultiPolygon"})json" )
209
+ },
210
+ // Note: CIRCULARSTRING json is very long, we will check first three vertices only
211
+ { QStringLiteral ( " CIRCULARSTRING(220268 150415,220227 150505,220227 150406)" ), QStringLiteral ( R"json( {"coordinates":[[220268.0,150415.0],[220268.7,150415.535],[220269.391,150416.081])json" ) },
191
212
}
192
- };
213
+ };
214
+
215
+ for ( const auto &w : testWkts.toStdMap () )
216
+ {
217
+ const auto g { QgsGeometry::fromWkt ( w.first ) };
218
+ QVERIFY ( !g.isNull ( ) );
219
+ if ( w.first .startsWith ( QStringLiteral ( " CIRCULARSTRING" ) ) )
220
+ {
221
+ QVERIFY ( g.asJson ( 3 ).startsWith ( w.second ) );
222
+ QCOMPARE ( QString::fromStdString ( g.asJsonObject ( 3 )[" type" ].dump () ), QStringLiteral ( R"( "LineString")" ) );
223
+ }
224
+ else
225
+ {
226
+ QCOMPARE ( g.asJson ( 3 ), w.second );
227
+ }
228
+ }
229
+ }
193
230
194
231
QGSTEST_MAIN ( TestQgsJsonUtils )
195
232
#include " testqgsjsonutils.moc"
0 commit comments