@@ -249,7 +249,7 @@ describe('convert legacy filters to expressions', () => {
249249 [
250250 'match' ,
251251 [ 'geometry-type' ] ,
252- [ 'LineString' , 'Point' , 'Polygon' ] ,
252+ [ 'LineString' , 'MultiLineString' , 'MultiPoint' , 'MultiPolygon' , ' Point', 'Polygon' ] ,
253253 true ,
254254 false
255255 ] ,
@@ -328,10 +328,96 @@ function legacyFilterTests(createFilterExpr) {
328328 expect ( f ( { zoom : 0 } , { properties : { } } ) ) . toBe ( false ) ;
329329 } ) ;
330330
331- test ( '==, $type' , ( ) => {
332- const f = createFilterExpr ( [ '==' , '$type' , 'LineString' ] ) . filter ;
333- expect ( f ( { zoom : 0 } , { type : 1 } ) ) . toBe ( false ) ;
334- expect ( f ( { zoom : 0 } , { type : 2 } ) ) . toBe ( true ) ;
331+ const UnknownGeometry = { type : 0 } ;
332+ const PointGeometry = { type : 1 , geometry : [
333+ [ { x : 0 , y : 0 } ] ] } ;
334+ const MultiPointGeometry = { type : 1 , geometry : [
335+ [ { x : 0 , y : 0 } ] ,
336+ [ { x : 1 , y : 1 } ] ] } ;
337+ const LinestringGeometry = { type : 2 , geometry : [
338+ [ { x : 0 , y : 0 } , { x : 1 , y : 1 } ] ] } ;
339+ const MultiLineStringGeometry = { type : 2 , geometry : [
340+ [ { x : 0 , y : 0 } , { x : 1 , y : 1 } ] ,
341+ [ { x : 2 , y : 0 } , { x : 1 , y : 0 } ] ] } ;
342+ const PolygonGeometry = { type : 3 , geometry : [
343+ [ { x : 0 , y : 0 } , { x : 3 , y : 0 } , { x : 3 , y : 3 } , { x : 0 , y : 3 } , { x : 0 , y : 0 } ] ,
344+ [ { x : 0 , y : 0 } , { x : 0 , y : 2 } , { x : 2 , y : 2 } , { x : 2 , y : 0 } , { x : 0 , y : 0 } ] ] } ;
345+ const MultiPolygonGeometry = { type : 3 , geometry : [
346+ [ { x : 0 , y : 0 } , { x : 3 , y : 0 } , { x : 3 , y : 3 } , { x : 0 , y : 3 } , { x : 0 , y : 0 } ] ,
347+ [ { x : 0 , y : 0 } , { x : 0 , y : 2 } , { x : 2 , y : 2 } , { x : 2 , y : 0 } , { x : 0 , y : 0 } ] ,
348+ [ { x : 0 , y : 0 } , { x : 1 , y : 0 } , { x : 1 , y : 1 } , { x : 0 , y : 1 } , { x : 0 , y : 0 } ] ] } ;
349+
350+ test ( '==, $type, Point' , ( ) => {
351+ const fPoint = createFilterExpr ( [ '==' , '$type' , 'Point' ] ) . filter ;
352+ expect ( fPoint ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( false ) ;
353+ expect ( fPoint ( { zoom : 0 } , PointGeometry ) ) . toBe ( true ) ;
354+ expect ( fPoint ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( true ) ;
355+ expect ( fPoint ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( false ) ;
356+ expect ( fPoint ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( false ) ;
357+ expect ( fPoint ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( false ) ;
358+ expect ( fPoint ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( false ) ;
359+ expect ( fPoint ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( false ) ;
360+ expect ( fPoint ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( true ) ;
361+ expect ( fPoint ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( true ) ;
362+ expect ( fPoint ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( false ) ;
363+ expect ( fPoint ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( false ) ;
364+ expect ( fPoint ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( false ) ;
365+ expect ( fPoint ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( false ) ;
366+ } ) ;
367+
368+ test ( '==, $type, LineString' , ( ) => {
369+ const fLineString = createFilterExpr ( [ '==' , '$type' , 'LineString' ] ) . filter ;
370+ expect ( fLineString ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( false ) ;
371+ expect ( fLineString ( { zoom : 0 } , PointGeometry ) ) . toBe ( false ) ;
372+ expect ( fLineString ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( false ) ;
373+ expect ( fLineString ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( true ) ;
374+ expect ( fLineString ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( true ) ;
375+ expect ( fLineString ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( false ) ;
376+ expect ( fLineString ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( false ) ;
377+ expect ( fLineString ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( false ) ;
378+ expect ( fLineString ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( false ) ;
379+ expect ( fLineString ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( false ) ;
380+ expect ( fLineString ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( true ) ;
381+ expect ( fLineString ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( true ) ;
382+ expect ( fLineString ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( false ) ;
383+ expect ( fLineString ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( false ) ;
384+ } ) ;
385+
386+ test ( '==, $type, Polygon' , ( ) => {
387+
388+ const fPolygon = createFilterExpr ( [ '==' , '$type' , 'Polygon' ] ) . filter ;
389+ expect ( fPolygon ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( false ) ;
390+ expect ( fPolygon ( { zoom : 0 } , PointGeometry ) ) . toBe ( false ) ;
391+ expect ( fPolygon ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( false ) ;
392+ expect ( fPolygon ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( false ) ;
393+ expect ( fPolygon ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( false ) ;
394+ expect ( fPolygon ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( true ) ;
395+ expect ( fPolygon ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( true ) ;
396+ expect ( fPolygon ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( false ) ;
397+ expect ( fPolygon ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( false ) ;
398+ expect ( fPolygon ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( false ) ;
399+ expect ( fPolygon ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( false ) ;
400+ expect ( fPolygon ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( false ) ;
401+ expect ( fPolygon ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( true ) ;
402+ expect ( fPolygon ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( true ) ;
403+ } ) ;
404+
405+ test ( '==, $type, Unknown' , ( ) => {
406+ const fUnknown = createFilterExpr ( [ '==' , '$type' , 'Unknown' ] ) . filter ;
407+ expect ( fUnknown ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( true ) ;
408+ expect ( fUnknown ( { zoom : 0 } , PointGeometry ) ) . toBe ( false ) ;
409+ expect ( fUnknown ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( false ) ;
410+ expect ( fUnknown ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( false ) ;
411+ expect ( fUnknown ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( false ) ;
412+ expect ( fUnknown ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( false ) ;
413+ expect ( fUnknown ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( false ) ;
414+ expect ( fUnknown ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( true ) ;
415+ expect ( fUnknown ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( false ) ;
416+ expect ( fUnknown ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( false ) ;
417+ expect ( fUnknown ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( false ) ;
418+ expect ( fUnknown ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( false ) ;
419+ expect ( fUnknown ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( false ) ;
420+ expect ( fUnknown ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( false ) ;
335421 } ) ;
336422
337423 test ( '==, $id' , ( ) => {
@@ -373,10 +459,76 @@ function legacyFilterTests(createFilterExpr) {
373459 expect ( f ( { zoom : 0 } , { properties : { } } ) ) . toBe ( true ) ;
374460 } ) ;
375461
376- test ( '!=, $type' , ( ) => {
377- const f = createFilterExpr ( [ '!=' , '$type' , 'LineString' ] ) . filter ;
378- expect ( f ( { zoom : 0 } , { type : 1 } ) ) . toBe ( true ) ;
379- expect ( f ( { zoom : 0 } , { type : 2 } ) ) . toBe ( false ) ;
462+ test ( '!=, $type, Point' , ( ) => {
463+ const fPoint = createFilterExpr ( [ '!=' , '$type' , 'Point' ] ) . filter ;
464+ expect ( fPoint ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( true ) ;
465+ expect ( fPoint ( { zoom : 0 } , PointGeometry ) ) . toBe ( false ) ;
466+ expect ( fPoint ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( false ) ;
467+ expect ( fPoint ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( true ) ;
468+ expect ( fPoint ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( true ) ;
469+ expect ( fPoint ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( true ) ;
470+ expect ( fPoint ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( true ) ;
471+ expect ( fPoint ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( true ) ;
472+ expect ( fPoint ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( false ) ;
473+ expect ( fPoint ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( false ) ;
474+ expect ( fPoint ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( true ) ;
475+ expect ( fPoint ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( true ) ;
476+ expect ( fPoint ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( true ) ;
477+ expect ( fPoint ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( true ) ;
478+ } ) ;
479+
480+ test ( '!=, $type, LineString' , ( ) => {
481+ const fLineString = createFilterExpr ( [ '!=' , '$type' , 'LineString' ] ) . filter ;
482+ expect ( fLineString ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( true ) ;
483+ expect ( fLineString ( { zoom : 0 } , PointGeometry ) ) . toBe ( true ) ;
484+ expect ( fLineString ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( true ) ;
485+ expect ( fLineString ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( false ) ;
486+ expect ( fLineString ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( false ) ;
487+ expect ( fLineString ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( true ) ;
488+ expect ( fLineString ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( true ) ;
489+ expect ( fLineString ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( true ) ;
490+ expect ( fLineString ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( true ) ;
491+ expect ( fLineString ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( true ) ;
492+ expect ( fLineString ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( false ) ;
493+ expect ( fLineString ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( false ) ;
494+ expect ( fLineString ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( true ) ;
495+ expect ( fLineString ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( true ) ;
496+ } ) ;
497+
498+ test ( '!=, $type, Polygon' , ( ) => {
499+ const fPolygon = createFilterExpr ( [ '!=' , '$type' , 'Polygon' ] ) . filter ;
500+ expect ( fPolygon ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( true ) ;
501+ expect ( fPolygon ( { zoom : 0 } , PointGeometry ) ) . toBe ( true ) ;
502+ expect ( fPolygon ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( true ) ;
503+ expect ( fPolygon ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( true ) ;
504+ expect ( fPolygon ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( true ) ;
505+ expect ( fPolygon ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( false ) ;
506+ expect ( fPolygon ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( false ) ;
507+ expect ( fPolygon ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( true ) ;
508+ expect ( fPolygon ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( true ) ;
509+ expect ( fPolygon ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( true ) ;
510+ expect ( fPolygon ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( true ) ;
511+ expect ( fPolygon ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( true ) ;
512+ expect ( fPolygon ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( false ) ;
513+ expect ( fPolygon ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( false ) ;
514+ } ) ;
515+
516+ test ( '!=, $type, Unknown' , ( ) => {
517+ const fUnknown = createFilterExpr ( [ '!=' , '$type' , 'Unknown' ] ) . filter ;
518+ expect ( fUnknown ( { zoom : 0 } , UnknownGeometry ) ) . toBe ( false ) ;
519+ expect ( fUnknown ( { zoom : 0 } , PointGeometry ) ) . toBe ( true ) ;
520+ expect ( fUnknown ( { zoom : 0 } , MultiPointGeometry ) ) . toBe ( true ) ;
521+ expect ( fUnknown ( { zoom : 0 } , LinestringGeometry ) ) . toBe ( true ) ;
522+ expect ( fUnknown ( { zoom : 0 } , MultiLineStringGeometry ) ) . toBe ( true ) ;
523+ expect ( fUnknown ( { zoom : 0 } , PolygonGeometry ) ) . toBe ( true ) ;
524+ expect ( fUnknown ( { zoom : 0 } , MultiPolygonGeometry ) ) . toBe ( true ) ;
525+ expect ( fUnknown ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( false ) ;
526+ expect ( fUnknown ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( true ) ;
527+ expect ( fUnknown ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( true ) ;
528+ expect ( fUnknown ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( true ) ;
529+ expect ( fUnknown ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( true ) ;
530+ expect ( fUnknown ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( true ) ;
531+ expect ( fUnknown ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( true ) ;
380532 } ) ;
381533
382534 test ( '<, number' , ( ) => {
@@ -563,15 +715,22 @@ function legacyFilterTests(createFilterExpr) {
563715
564716 test ( 'in, $type' , ( ) => {
565717 const f = createFilterExpr ( [ 'in' , '$type' , 'LineString' , 'Polygon' ] ) . filter ;
566- expect ( f ( { zoom : 0 } , { type : 1 } ) ) . toBe ( false ) ;
567- expect ( f ( { zoom : 0 } , { type : 2 } ) ) . toBe ( true ) ;
568- expect ( f ( { zoom : 0 } , { type : 3 } ) ) . toBe ( true ) ;
718+ expect ( f ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( false ) ;
719+ expect ( f ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( false ) ;
720+ expect ( f ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( false ) ;
721+ expect ( f ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( true ) ;
722+ expect ( f ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( true ) ;
723+ expect ( f ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( true ) ;
724+ expect ( f ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( true ) ;
569725
570726 const f1 = createFilterExpr ( [ 'in' , '$type' , 'Polygon' , 'LineString' , 'Point' ] ) . filter ;
571- expect ( f1 ( { zoom : 0 } , { type : 1 } ) ) . toBe ( true ) ;
572- expect ( f1 ( { zoom : 0 } , { type : 2 } ) ) . toBe ( true ) ;
573- expect ( f1 ( { zoom : 0 } , { type : 3 } ) ) . toBe ( true ) ;
574-
727+ expect ( f1 ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( false ) ;
728+ expect ( f1 ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( true ) ;
729+ expect ( f1 ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( true ) ;
730+ expect ( f1 ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( true ) ;
731+ expect ( f1 ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( true ) ;
732+ expect ( f1 ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( true ) ;
733+ expect ( f1 ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( true ) ;
575734 } ) ;
576735
577736 test ( '!in, degenerate' , ( ) => {
@@ -621,9 +780,22 @@ function legacyFilterTests(createFilterExpr) {
621780
622781 test ( '!in, $type' , ( ) => {
623782 const f = createFilterExpr ( [ '!in' , '$type' , 'LineString' , 'Polygon' ] ) . filter ;
624- expect ( f ( { zoom : 0 } , { type : 1 } ) ) . toBe ( true ) ;
625- expect ( f ( { zoom : 0 } , { type : 2 } ) ) . toBe ( false ) ;
626- expect ( f ( { zoom : 0 } , { type : 3 } ) ) . toBe ( false ) ;
783+ expect ( f ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( true ) ;
784+ expect ( f ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( true ) ;
785+ expect ( f ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( true ) ;
786+ expect ( f ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( false ) ;
787+ expect ( f ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( false ) ;
788+ expect ( f ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( false ) ;
789+ expect ( f ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( false ) ;
790+
791+ const f1 = createFilterExpr ( [ '!in' , '$type' , 'Polygon' , 'LineString' , 'Point' ] ) . filter ;
792+ expect ( f1 ( { zoom : 0 } , { type : 'Unknown' } ) ) . toBe ( true ) ;
793+ expect ( f1 ( { zoom : 0 } , { type : 'Point' } ) ) . toBe ( false ) ;
794+ expect ( f1 ( { zoom : 0 } , { type : 'MultiPoint' } ) ) . toBe ( false ) ;
795+ expect ( f1 ( { zoom : 0 } , { type : 'LineString' } ) ) . toBe ( false ) ;
796+ expect ( f1 ( { zoom : 0 } , { type : 'MultiLineString' } ) ) . toBe ( false ) ;
797+ expect ( f1 ( { zoom : 0 } , { type : 'Polygon' } ) ) . toBe ( false ) ;
798+ expect ( f1 ( { zoom : 0 } , { type : 'MultiPolygon' } ) ) . toBe ( false ) ;
627799 } ) ;
628800
629801 test ( 'any' , ( ) => {
0 commit comments