@@ -252,7 +252,6 @@ public void TestBZMPopNoKeysProvided()
252252 var db = redis . GetDatabase ( null ) ;
253253 db . Execute ( "FLUSHALL" ) ;
254254
255- // Server would wait forever, but the multiplexer times out in 1 second.
256255 Assert . Throws < ArgumentException > ( ( ) => db . BZMPop ( 0 , Array . Empty < RedisKey > ( ) , MinMaxModifier . Min ) ) ;
257256 }
258257
@@ -270,15 +269,15 @@ public void TestBZMPopWithOrderEnum()
270269 db . SortedSetAdd ( sortedSetKey , "b" , 5.1 ) ;
271270 db . SortedSetAdd ( sortedSetKey , "c" , 3.7 ) ;
272271
273- // Pop two items with default order, which means it will pop the minimum values.
272+ // Pop two items with Ascending order, which means it will pop the minimum values.
274273 var resultWithDefaultOrder = db . BZMPop ( 0 , sortedSetKey , Order . Ascending . ToMinMax ( ) ) ;
275274
276275 Assert . NotNull ( resultWithDefaultOrder ) ;
277276 Assert . Equal ( sortedSetKey , resultWithDefaultOrder ! . Item1 ) ;
278277 Assert . Single ( resultWithDefaultOrder . Item2 ) ;
279278 Assert . Equal ( "a" , resultWithDefaultOrder . Item2 [ 0 ] . Value . ToString ( ) ) ;
280279
281- // Pop one more item, with descending order, which means it will pop the maximum value.
280+ // Pop one more item, with Descending order, which means it will pop the maximum value.
282281 var resultWithDescendingOrder = db . BZMPop ( 0 , sortedSetKey , Order . Descending . ToMinMax ( ) ) ;
283282
284283 Assert . NotNull ( resultWithDescendingOrder ) ;
@@ -407,6 +406,107 @@ public void TestBZPopMaxMultipleSets()
407406 Assert . Equal ( "b" , result . Item2 . Value . ToString ( ) ) ;
408407 }
409408
409+ [ SkipIfRedis ( Is . OSSCluster , Comparison . LessThan , "7.0.0" ) ]
410+ public void TestBLMPop ( )
411+ {
412+ var redis = ConnectionMultiplexer . Connect ( "localhost" ) ;
413+
414+ var db = redis . GetDatabase ( null ) ;
415+ db . Execute ( "FLUSHALL" ) ;
416+
417+ db . ListRightPush ( "my-list" , "a" ) ;
418+ db . ListRightPush ( "my-list" , "b" ) ;
419+ db . ListRightPush ( "my-list" , "c" ) ;
420+ db . ListRightPush ( "my-list" , "d" ) ;
421+ db . ListRightPush ( "my-list" , "e" ) ;
422+
423+ // Pop two items from the left side.
424+ var resultWithDefaultOrder = db . BLMPop ( 0 , "my-list" , ListSide . Left , 2 ) ;
425+
426+ Assert . NotNull ( resultWithDefaultOrder ) ;
427+ Assert . Equal ( "my-list" , resultWithDefaultOrder ! . Item1 ) ;
428+ Assert . Equal ( 2 , resultWithDefaultOrder . Item2 . Count ) ;
429+ Assert . Equal ( "a" , resultWithDefaultOrder . Item2 [ 0 ] . ToString ( ) ) ;
430+ Assert . Equal ( "b" , resultWithDefaultOrder . Item2 [ 1 ] . ToString ( ) ) ;
431+
432+ // Pop one more item, from the right side.
433+ var resultWithDescendingOrder = db . BLMPop ( 0 , "my-list" , ListSide . Right , 1 ) ;
434+
435+ Assert . NotNull ( resultWithDescendingOrder ) ;
436+ Assert . Equal ( "my-list" , resultWithDescendingOrder ! . Item1 ) ;
437+ Assert . Single ( resultWithDescendingOrder . Item2 ) ;
438+ Assert . Equal ( "e" , resultWithDescendingOrder . Item2 [ 0 ] . ToString ( ) ) ;
439+ }
440+
441+ [ SkipIfRedis ( Is . OSSCluster , Comparison . LessThan , "7.0.0" ) ]
442+ public void TestBLMPopNull ( )
443+ {
444+ var redis = ConnectionMultiplexer . Connect ( "localhost" ) ;
445+
446+ var db = redis . GetDatabase ( null ) ;
447+ db . Execute ( "FLUSHALL" ) ;
448+
449+ // Nothing in the list, and a short server timeout, which yields null.
450+ var result = db . BLMPop ( 0.5 , "my-list" , ListSide . Left ) ;
451+
452+ Assert . Null ( result ) ;
453+ }
454+
455+ [ SkipIfRedis ( Is . OSSCluster , Comparison . LessThan , "7.0.0" ) ]
456+ public void TestBLMPopMultipleLists ( )
457+ {
458+ var redis = ConnectionMultiplexer . Connect ( "localhost" ) ;
459+
460+ var db = redis . GetDatabase ( null ) ;
461+ db . Execute ( "FLUSHALL" ) ;
462+
463+ db . ListRightPush ( "list-one" , "a" ) ;
464+ db . ListRightPush ( "list-one" , "b" ) ;
465+ db . ListRightPush ( "list-one" , "c" ) ;
466+ db . ListRightPush ( "list-two" , "d" ) ;
467+ db . ListRightPush ( "list-two" , "e" ) ;
468+
469+ var result = db . BLMPop ( 0 , "list-two" , ListSide . Right ) ;
470+
471+ Assert . NotNull ( result ) ;
472+ Assert . Equal ( "list-two" , result ! . Item1 ) ;
473+ Assert . Single ( result . Item2 ) ;
474+ Assert . Equal ( "e" , result . Item2 [ 0 ] . ToString ( ) ) ;
475+
476+ result = db . BLMPop ( 0 , new [ ] { new RedisKey ( "list-two" ) , new RedisKey ( "list-one" ) } , ListSide . Left ) ;
477+
478+ Assert . NotNull ( result ) ;
479+ Assert . Equal ( "list-two" , result ! . Item1 ) ;
480+ Assert . Single ( result . Item2 ) ;
481+ Assert . Equal ( "d" , result . Item2 [ 0 ] . ToString ( ) ) ;
482+
483+ result = db . BLMPop ( 0 , new [ ] { new RedisKey ( "list-two" ) , new RedisKey ( "list-one" ) } , ListSide . Right ) ;
484+
485+ Assert . NotNull ( result ) ;
486+ Assert . Equal ( "list-one" , result ! . Item1 ) ;
487+ Assert . Single ( result . Item2 ) ;
488+ Assert . Equal ( "c" , result . Item2 [ 0 ] . ToString ( ) ) ;
489+
490+ result = db . BLMPop ( 0 , "list-one" , ListSide . Left , count : 2 ) ;
491+
492+ Assert . NotNull ( result ) ;
493+ Assert . Equal ( "list-one" , result ! . Item1 ) ;
494+ Assert . Equal ( 2 , result . Item2 . Count ) ;
495+ Assert . Equal ( "a" , result . Item2 [ 0 ] . ToString ( ) ) ;
496+ Assert . Equal ( "b" , result . Item2 [ 1 ] . ToString ( ) ) ;
497+ }
498+
499+ [ SkipIfRedis ( Is . OSSCluster , Comparison . LessThan , "7.0.0" ) ]
500+ public void TestBLMPopNoKeysProvided ( )
501+ {
502+ var redis = ConnectionMultiplexer . Connect ( "localhost" ) ;
503+
504+ var db = redis . GetDatabase ( null ) ;
505+ db . Execute ( "FLUSHALL" ) ;
506+
507+ Assert . Throws < ArgumentException > ( ( ) => db . BLMPop ( 0 , Array . Empty < RedisKey > ( ) , ListSide . Left ) ) ;
508+ }
509+
410510 [ SkipIfRedis ( Is . OSSCluster , Comparison . LessThan , "2.0.0" ) ]
411511 public void TestBLPop ( )
412512 {
0 commit comments