@@ -228,6 +228,65 @@ class TestQgsExpression: public QObject
228
228
QCOMPARE ( exp.dump (), dump );
229
229
}
230
230
231
+ void named_parameter_data ()
232
+ {
233
+ // test passing named parameters to functions
234
+ QTest::addColumn<QString>( " string" );
235
+ QTest::addColumn<bool >( " parserError" );
236
+ QTest::addColumn<QString>( " dump" );
237
+ QTest::addColumn<QVariant>( " result" );
238
+
239
+ QTest::newRow ( " unsupported" ) << " min( val1:=1, val2:=2, val3:=3 )" << true << " " << QVariant ();
240
+ QTest::newRow ( " named params named" ) << " clamp( min:=1, value:=2, max:=3)" << false << " clamp(1, 2, 3)" << QVariant ( 2.0 );
241
+ QTest::newRow ( " named params unnamed" ) << " clamp(1,2,3)" << false << " clamp(1, 2, 3)" << QVariant ( 2.0 );
242
+ QTest::newRow ( " named params mixed" ) << " clamp( 1, value:=2, max:=3)" << false << " clamp(1, 2, 3)" << QVariant ( 2.0 );
243
+ QTest::newRow ( " named params mixed bad" ) << " clamp( 1, value:=2, 3)" << true << " " << QVariant ();
244
+ QTest::newRow ( " named params mixed 2" ) << " clamp( 1, 2, max:=3)" << false << " clamp(1, 2, 3)" << QVariant ( 2.0 );
245
+ QTest::newRow ( " named params reordered" ) << " clamp( value := 2, max:=3, min:=1)" << false << " clamp(1, 2, 3)" << QVariant ( 2.0 );
246
+ QTest::newRow ( " named params mixed case" ) << " clamp( Min:=1, vAlUe:=2,MAX:=3)" << false << " clamp(1, 2, 3)" << QVariant ( 2.0 );
247
+ QTest::newRow ( " named params expression node" ) << " clamp( min:=1*2, value:=2+2, max:=3+1+2)" << false << " clamp(1 * 2, 2 + 2, 3 + 1 + 2)" << QVariant ( 4.0 );
248
+ QTest::newRow ( " named params bad name" ) << " clamp( min:=1, x:=2, y:=3)" << true << " " << QVariant ();
249
+ QTest::newRow ( " named params dupe implied" ) << " clamp( 1, 2, value:= 3, max:=4)" << true << " " << QVariant ();
250
+ QTest::newRow ( " named params dupe explicit" ) << " clamp( 1, value := 2, value:= 3, max:=4)" << true << " " << QVariant ();
251
+ QTest::newRow ( " named params dupe explicit 2" ) << " clamp( value:=1, value := 2, max:=4)" << true << " " << QVariant ();
252
+ QTest::newRow ( " named params non optional omitted" ) << " clamp( min:=1, max:=2)" << true << " " << QVariant ();
253
+ QTest::newRow ( " optional parameters specified" ) << " wordwrap( 'testxstring', 5, 'x')" << false << " wordwrap('testxstring', 5, 'x')" << QVariant ( " test\n string" );
254
+ QTest::newRow ( " optional parameters specified named" ) << " wordwrap( text:='testxstring', length:=5, delimiter:='x')" << false << " wordwrap('testxstring', 5, 'x')" << QVariant ( " test\n string" );
255
+ QTest::newRow ( " optional parameters unspecified" ) << " wordwrap( text:='test string', length:=5 )" << false << " wordwrap('test string', 5, ' ')" << QVariant ( " test\n string" );
256
+ QTest::newRow ( " named params dupe explicit 3" ) << " wordwrap( 'test string', 5, length:=6 )" << true << " " << QVariant ();
257
+ QTest::newRow ( " named params dupe explicit 4" ) << " wordwrap( text:='test string', length:=5, length:=6 )" << true << " " << QVariant ();
258
+ }
259
+
260
+ void named_parameter ()
261
+ {
262
+ QFETCH ( QString, string );
263
+ QFETCH ( bool , parserError );
264
+ QFETCH ( QString, dump );
265
+ QFETCH ( QVariant, result );
266
+
267
+ QgsExpression exp ( string );
268
+ QCOMPARE ( exp.hasParserError (), parserError );
269
+ if ( exp.hasParserError () )
270
+ {
271
+ // parser error, so no point continuing testing
272
+ qDebug () << exp.parserErrorString ();
273
+ return ;
274
+ }
275
+
276
+ QgsExpressionContext context;
277
+ Q_ASSERT ( exp.prepare ( &context ) );
278
+
279
+ QVariant res = exp.evaluate ();
280
+ if ( exp.hasEvalError () )
281
+ qDebug () << exp.evalErrorString ();
282
+ if ( res.type () != result.type () )
283
+ {
284
+ qDebug () << " got " << res.typeName () << " instead of " << result.typeName ();
285
+ }
286
+ QCOMPARE ( res, result );
287
+ QCOMPARE ( exp.dump (), dump );
288
+ }
289
+
231
290
void evaluation_data ()
232
291
{
233
292
QTest::addColumn<QString>( " string" );
@@ -354,28 +413,29 @@ class TestQgsExpression: public QObject
354
413
// math functions
355
414
QTest::newRow ( " pi" ) << " pi()" << false << QVariant ( M_PI );
356
415
QTest::newRow ( " sqrt" ) << " sqrt(16)" << false << QVariant ( 4 . );
416
+ QTest::newRow ( " sqrt" ) << " sqrt(value:=16)" << false << QVariant ( 4 . );
357
417
QTest::newRow ( " abs(0.1)" ) << " abs(0.1)" << false << QVariant ( 0.1 );
358
418
QTest::newRow ( " abs(0)" ) << " abs(0)" << false << QVariant ( 0 . );
359
- QTest::newRow ( " abs(-0.1)" ) << " abs(-0.1)" << false << QVariant ( 0.1 );
419
+ QTest::newRow ( " abs( value:= -0.1)" ) << " abs(value:= -0.1)" << false << QVariant ( 0.1 );
360
420
QTest::newRow ( " invalid sqrt value" ) << " sqrt('a')" << true << QVariant ();
361
- QTest::newRow ( " degrees to radians" ) << " toint(radians(45)*1000000)" << false << QVariant ( 785398 ); // sorry for the nasty hack to work around floating point comparison problems
362
- QTest::newRow ( " radians to degrees" ) << " toint(degrees(2)*1000)" << false << QVariant ( 114592 );
363
- QTest::newRow ( " sin 0" ) << " sin(0)" << false << QVariant ( 0 . );
364
- QTest::newRow ( " cos 0" ) << " cos(0)" << false << QVariant ( 1 . );
365
- QTest::newRow ( " tan 0" ) << " tan(0)" << false << QVariant ( 0 . );
366
- QTest::newRow ( " asin 0" ) << " asin(0)" << false << QVariant ( 0 . );
367
- QTest::newRow ( " acos 1" ) << " acos(1)" << false << QVariant ( 0 . );
368
- QTest::newRow ( " atan 0" ) << " atan(0)" << false << QVariant ( 0 . );
421
+ QTest::newRow ( " degrees to radians" ) << " toint(radians(degrees:= 45)*1000000)" << false << QVariant ( 785398 ); // sorry for the nasty hack to work around floating point comparison problems
422
+ QTest::newRow ( " radians to degrees" ) << " toint(degrees(radians:= 2)*1000)" << false << QVariant ( 114592 );
423
+ QTest::newRow ( " sin 0" ) << " sin(angle:= 0)" << false << QVariant ( 0 . );
424
+ QTest::newRow ( " cos 0" ) << " cos(angle:= 0)" << false << QVariant ( 1 . );
425
+ QTest::newRow ( " tan 0" ) << " tan(angle:= 0)" << false << QVariant ( 0 . );
426
+ QTest::newRow ( " asin 0" ) << " asin(value:= 0)" << false << QVariant ( 0 . );
427
+ QTest::newRow ( " acos 1" ) << " acos(value:= 1)" << false << QVariant ( 0 . );
428
+ QTest::newRow ( " atan 0" ) << " atan(value:= 0)" << false << QVariant ( 0 . );
369
429
QTest::newRow ( " atan2(0,1)" ) << " atan2(0,1)" << false << QVariant ( 0 . );
370
- QTest::newRow ( " atan2(1,0)" ) << " atan2(1, 0)" << false << QVariant ( M_PI / 2 );
430
+ QTest::newRow ( " atan2(1,0)" ) << " atan2(dx:=1,dy:= 0)" << false << QVariant ( M_PI / 2 );
371
431
QTest::newRow ( " exp(0)" ) << " exp(0)" << false << QVariant ( 1 . );
372
- QTest::newRow ( " exp(1)" ) << " exp(1)" << false << QVariant ( exp ( 1 . ) );
432
+ QTest::newRow ( " exp(1)" ) << " exp(value:= 1)" << false << QVariant ( exp ( 1 . ) );
373
433
QTest::newRow ( " ln(0)" ) << " ln(0)" << false << QVariant ();
374
434
QTest::newRow ( " log10(-1)" ) << " log10(-1)" << false << QVariant ();
375
- QTest::newRow ( " ln(1)" ) << " ln(1)" << false << QVariant ( log ( 1 . ) );
435
+ QTest::newRow ( " ln(1)" ) << " ln(value:= 1)" << false << QVariant ( log ( 1 . ) );
376
436
QTest::newRow ( " log10(100)" ) << " log10(100)" << false << QVariant ( 2 . );
377
437
QTest::newRow ( " log(2,32)" ) << " log(2,32)" << false << QVariant ( 5 . );
378
- QTest::newRow ( " log(10,1000)" ) << " log(10,1000)" << false << QVariant ( 3 . );
438
+ QTest::newRow ( " log(10,1000)" ) << " log(base:= 10,value:= 1000)" << false << QVariant ( 3 . );
379
439
QTest::newRow ( " log(-2,32)" ) << " log(-2,32)" << false << QVariant ();
380
440
QTest::newRow ( " log(2,-32)" ) << " log(2,-32)" << false << QVariant ();
381
441
QTest::newRow ( " log(0.5,32)" ) << " log(0.5,32)" << false << QVariant ( -5 . );
@@ -389,6 +449,7 @@ class TestQgsExpression: public QObject
389
449
QTest::newRow ( " min(-16.6,3.5,-2.1)" ) << " min(-16.6,3.5,-2.1)" << false << QVariant ( -16.6 );
390
450
QTest::newRow ( " min(5,3.5,-2.1)" ) << " min(5,3.5,-2.1)" << false << QVariant ( -2.1 );
391
451
QTest::newRow ( " clamp(-2,1,5)" ) << " clamp(-2,1,5)" << false << QVariant ( 1.0 );
452
+ QTest::newRow ( " clamp(min:=-2,value:=1,max:=5)" ) << " clamp(min:=-2,value:=1,max:=5)" << false << QVariant ( 1.0 );
392
453
QTest::newRow ( " clamp(-2,-10,5)" ) << " clamp(-2,-10,5)" << false << QVariant ( -2.0 );
393
454
QTest::newRow ( " clamp(-2,100,5)" ) << " clamp(-2,100,5)" << false << QVariant ( 5.0 );
394
455
QTest::newRow ( " floor(4.9)" ) << " floor(4.9)" << false << QVariant ( 4 . );
@@ -582,7 +643,7 @@ class TestQgsExpression: public QObject
582
643
QTest::newRow ( " relate bad 2" ) << " relate(geom_from_wkt('POINT(110 120)'),geom_from_wkt(''))" << false << QVariant ();
583
644
QTest::newRow ( " relate pattern true" ) << " relate( geom_from_wkt( 'LINESTRING(40 40,120 120)' ), geom_from_wkt( 'LINESTRING(40 40,60 120)' ), '**1F001**' )" << false << QVariant ( true );
584
645
QTest::newRow ( " relate pattern false" ) << " relate( geom_from_wkt( 'LINESTRING(40 40,120 120)' ), geom_from_wkt( 'LINESTRING(40 40,60 120)' ), '**1F002**' )" << false << QVariant ( false );
585
- QTest::newRow ( " azimuth" ) << " toint(degrees(azimuth( make_point(25, 45), make_point(75, 100)))*1000000)" << false << QVariant ( 42273689 );
646
+ QTest::newRow ( " azimuth" ) << " toint(degrees(azimuth( point_a := make_point(25, 45), point_b := make_point(75, 100)))*1000000)" << false << QVariant ( 42273689 );
586
647
QTest::newRow ( " azimuth" ) << " toint(degrees( azimuth( make_point(75, 100), make_point(25,45) ) )*1000000)" << false << QVariant ( 222273689 );
587
648
QTest::newRow ( " extrude geom" ) << " geom_to_wkt(extrude( geom_from_wkt('LineString( 1 2, 3 2, 4 3)'),1,2))" << false << QVariant ( " Polygon ((1 2, 3 2, 4 3, 5 5, 4 4, 2 4, 1 2))" );
588
649
QTest::newRow ( " extrude not geom" ) << " extrude('g',5,6)" << true << QVariant ();
@@ -1075,7 +1136,7 @@ class TestQgsExpression: public QObject
1075
1136
QCOMPARE ( v1.toInt () <= 10 , true );
1076
1137
QCOMPARE ( v1.toInt () >= 1 , true );
1077
1138
1078
- QgsExpression exp2 ( " rand(-5,-5)" );
1139
+ QgsExpression exp2 ( " rand(min:= -5,max:= -5)" );
1079
1140
QVariant v2 = exp2.evaluate ();
1080
1141
QCOMPARE ( v2.toInt (), -5 );
1081
1142
@@ -1092,7 +1153,7 @@ class TestQgsExpression: public QObject
1092
1153
QCOMPARE ( v1.toDouble () <= 9.5 , true );
1093
1154
QCOMPARE ( v1.toDouble () >= 1.5 , true );
1094
1155
1095
- QgsExpression exp2 ( " randf(-0.0005,-0.0005)" );
1156
+ QgsExpression exp2 ( " randf(min:= -0.0005,max:= -0.0005)" );
1096
1157
QVariant v2 = exp2.evaluate ();
1097
1158
QCOMPARE ( v2.toDouble (), -0.0005 );
1098
1159
0 commit comments