@@ -270,6 +270,16 @@ def test_matcher_subset_value_operator(en_vocab):
270270 doc [0 ].tag_ = "A"
271271 assert len (matcher (doc )) == 0
272272
273+ # IS_SUBSET with a list value
274+ Token .set_extension ("ext" , default = [])
275+ matcher = Matcher (en_vocab )
276+ pattern = [{"_" : {"ext" : {"IS_SUBSET" : ["A" , "B" ]}}}]
277+ matcher .add ("M" , [pattern ])
278+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
279+ doc [0 ]._ .ext = ["A" ]
280+ doc [1 ]._ .ext = ["C" , "D" ]
281+ assert len (matcher (doc )) == 2
282+
273283
274284def test_matcher_superset_value_operator (en_vocab ):
275285 matcher = Matcher (en_vocab )
@@ -308,6 +318,72 @@ def test_matcher_superset_value_operator(en_vocab):
308318 doc [0 ].tag_ = "A"
309319 assert len (matcher (doc )) == 3
310320
321+ # IS_SUPERSET with a list value
322+ Token .set_extension ("ext" , default = [])
323+ matcher = Matcher (en_vocab )
324+ pattern = [{"_" : {"ext" : {"IS_SUPERSET" : ["A" ]}}}]
325+ matcher .add ("M" , [pattern ])
326+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
327+ doc [0 ]._ .ext = ["A" , "B" ]
328+ assert len (matcher (doc )) == 1
329+
330+
331+ def test_matcher_intersect_value_operator (en_vocab ):
332+ matcher = Matcher (en_vocab )
333+ pattern = [{"MORPH" : {"INTERSECTS" : ["Feat=Val" , "Feat2=Val2" , "Feat3=Val3" ]}}]
334+ matcher .add ("M" , [pattern ])
335+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
336+ assert len (matcher (doc )) == 0
337+ doc [0 ].set_morph ("Feat=Val" )
338+ assert len (matcher (doc )) == 1
339+ doc [0 ].set_morph ("Feat=Val|Feat2=Val2" )
340+ assert len (matcher (doc )) == 1
341+ doc [0 ].set_morph ("Feat=Val|Feat2=Val2|Feat3=Val3" )
342+ assert len (matcher (doc )) == 1
343+ doc [0 ].set_morph ("Feat=Val|Feat2=Val2|Feat3=Val3|Feat4=Val4" )
344+ assert len (matcher (doc )) == 1
345+
346+ # INTERSECTS with a single value is the same as IN
347+ matcher = Matcher (en_vocab )
348+ pattern = [{"TAG" : {"INTERSECTS" : ["A" , "B" ]}}]
349+ matcher .add ("M" , [pattern ])
350+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
351+ doc [0 ].tag_ = "A"
352+ assert len (matcher (doc )) == 1
353+
354+ # INTERSECTS with an empty pattern list matches nothing
355+ matcher = Matcher (en_vocab )
356+ pattern = [{"TAG" : {"INTERSECTS" : []}}]
357+ matcher .add ("M" , [pattern ])
358+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
359+ doc [0 ].tag_ = "A"
360+ assert len (matcher (doc )) == 0
361+
362+ # INTERSECTS with a list value
363+ Token .set_extension ("ext" , default = [])
364+ matcher = Matcher (en_vocab )
365+ pattern = [{"_" : {"ext" : {"INTERSECTS" : ["A" , "C" ]}}}]
366+ matcher .add ("M" , [pattern ])
367+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
368+ doc [0 ]._ .ext = ["A" , "B" ]
369+ assert len (matcher (doc )) == 1
370+
371+ # INTERSECTS with an empty pattern list matches nothing
372+ matcher = Matcher (en_vocab )
373+ pattern = [{"_" : {"ext" : {"INTERSECTS" : []}}}]
374+ matcher .add ("M" , [pattern ])
375+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
376+ doc [0 ]._ .ext = ["A" , "B" ]
377+ assert len (matcher (doc )) == 0
378+
379+ # INTERSECTS with an empty value matches nothing
380+ matcher = Matcher (en_vocab )
381+ pattern = [{"_" : {"ext" : {"INTERSECTS" : ["A" , "B" ]}}}]
382+ matcher .add ("M" , [pattern ])
383+ doc = Doc (en_vocab , words = ["a" , "b" , "c" ])
384+ doc [0 ]._ .ext = []
385+ assert len (matcher (doc )) == 0
386+
311387
312388def test_matcher_morph_handling (en_vocab ):
313389 # order of features in pattern doesn't matter
0 commit comments