@@ -994,3 +994,149 @@ def _validate_quantization(original, quantized, tolerance=0.1):
994994 return False
995995 else :
996996 return True
997+
998+
999+ @skip_if_server_version_lt ("8.4.0" )
1000+ async def test_vrange_basic (d_client ):
1001+ """Test basic VRANGE functionality with lexicographical ordering."""
1002+ # Add elements with different names
1003+ elements = ["apple" , "banana" , "cherry" , "date" , "elderberry" ]
1004+ for elem in elements :
1005+ await d_client .vset ().vadd ("myset" , [1.0 , 2.0 , 3.0 ], elem )
1006+
1007+ # Test full range
1008+ result = await d_client .vset ().vrange ("myset" , "-" , "+" )
1009+ assert result == elements
1010+ assert len (result ) == 5
1011+
1012+ # Test inclusive range
1013+ result = await d_client .vset ().vrange ("myset" , "[banana" , "[date" )
1014+ assert result == ["banana" , "cherry" , "date" ]
1015+
1016+ # Test exclusive range
1017+ result = await d_client .vset ().vrange ("myset" , "(banana" , "(date" )
1018+ assert result == ["cherry" ]
1019+
1020+
1021+ @skip_if_server_version_lt ("8.4.0" )
1022+ async def test_vrange_with_count (d_client ):
1023+ """Test VRANGE with count parameter."""
1024+ # Add elements
1025+ elements = ["a" , "b" , "c" , "d" , "e" , "f" , "g" ]
1026+ for elem in elements :
1027+ await d_client .vset ().vadd ("myset" , [1.0 , 2.0 ], elem )
1028+
1029+ # Test with positive count
1030+ result = await d_client .vset ().vrange ("myset" , "-" , "+" , count = 3 )
1031+ assert len (result ) == 3
1032+ assert result == ["a" , "b" , "c" ]
1033+
1034+ # Test with count larger than set size
1035+ result = await d_client .vset ().vrange ("myset" , "-" , "+" , count = 100 )
1036+ assert len (result ) == 7
1037+ assert result == elements
1038+
1039+ # Test with count = 0
1040+ result = await d_client .vset ().vrange ("myset" , "-" , "+" , count = 0 )
1041+ assert result == []
1042+
1043+ # Test with negative count (should return all)
1044+ result = await d_client .vset ().vrange ("myset" , "-" , "+" , count = - 1 )
1045+ assert len (result ) == 7
1046+ assert result == elements
1047+
1048+
1049+ @skip_if_server_version_lt ("8.4.0" )
1050+ async def test_vrange_iteration (d_client ):
1051+ """Test VRANGE for stateless iteration."""
1052+ # Add elements
1053+ elements = [f"elem{ i :03d} " for i in range (20 )]
1054+ for elem in elements :
1055+ await d_client .vset ().vadd ("myset" , [1.0 , 2.0 ], elem )
1056+
1057+ # Iterate through all elements, 5 at a time
1058+ all_results = []
1059+ start = "-"
1060+ while True :
1061+ result = await d_client .vset ().vrange ("myset" , start , "+" , count = 5 )
1062+ if not result :
1063+ break
1064+ all_results .extend (result )
1065+ # Continue from the last element (exclusive)
1066+ start = f"({ result [- 1 ]} "
1067+
1068+ assert len (all_results ) == 20
1069+ assert all_results == elements
1070+
1071+
1072+ @skip_if_server_version_lt ("8.4.0" )
1073+ async def test_vrange_empty_key (d_client ):
1074+ """Test VRANGE on non-existent key."""
1075+ result = await d_client .vset ().vrange ("nonexistent" , "-" , "+" )
1076+ assert result == []
1077+
1078+ result = await d_client .vset ().vrange ("nonexistent" , "[a" , "[z" , count = 10 )
1079+ assert result == []
1080+
1081+
1082+ @skip_if_server_version_lt ("8.4.0" )
1083+ async def test_vrange_special_characters (d_client ):
1084+ """Test VRANGE with elements containing special characters."""
1085+ # Add elements with special characters
1086+ elements = ["a:1" , "a:2" , "b:1" , "b:2" , "c:1" ]
1087+ for elem in elements :
1088+ await d_client .vset ().vadd ("myset" , [1.0 , 2.0 ], elem )
1089+
1090+ # Test range with prefix
1091+ result = await d_client .vset ().vrange ("myset" , "[a:" , "[a:9" )
1092+ assert result == ["a:1" , "a:2" ]
1093+
1094+ result = await d_client .vset ().vrange ("myset" , "[b:" , "[b:9" )
1095+ assert result == ["b:1" , "b:2" ]
1096+
1097+
1098+ @skip_if_server_version_lt ("8.4.0" )
1099+ async def test_vrange_single_element (d_client ):
1100+ """Test VRANGE with a single element."""
1101+ await d_client .vset ().vadd ("myset" , [1.0 , 2.0 ], "single" )
1102+
1103+ result = await d_client .vset ().vrange ("myset" , "-" , "+" )
1104+ assert result == ["single" ]
1105+
1106+ result = await d_client .vset ().vrange ("myset" , "[single" , "[single" )
1107+ assert result == ["single" ]
1108+
1109+ result = await d_client .vset ().vrange ("myset" , "(single" , "+" )
1110+ assert result == []
1111+
1112+
1113+ @skip_if_server_version_lt ("8.4.0" )
1114+ async def test_vrange_lexicographical_order (d_client ):
1115+ """Test that VRANGE returns elements in correct lexicographical order."""
1116+ # Add elements in random order
1117+ elements = ["zebra" , "apple" , "mango" , "banana" , "cherry" ]
1118+ for elem in elements :
1119+ await d_client .vset ().vadd ("myset" , [1.0 , 2.0 ], elem )
1120+
1121+ # Should return in sorted order
1122+ result = await d_client .vset ().vrange ("myset" , "-" , "+" )
1123+ expected = sorted (elements )
1124+ assert result == expected
1125+
1126+
1127+ @skip_if_server_version_lt ("8.4.0" )
1128+ async def test_vrange_numeric_strings (d_client ):
1129+ """Test VRANGE with numeric string elements."""
1130+ # Add numeric strings (lexicographical order, not numeric)
1131+ elements = ["1" , "10" , "2" , "20" , "3" ]
1132+ for elem in elements :
1133+ await d_client .vset ().vadd ("myset" , [1.0 , 2.0 ], elem )
1134+
1135+ # Lexicographical order: "1", "10", "2", "20", "3"
1136+ result = await d_client .vset ().vrange ("myset" , "-" , "+" )
1137+ expected = sorted (elements ) # ["1", "10", "2", "20", "3"]
1138+ assert result == expected
1139+
1140+ # Range from "1" to "2" (inclusive)
1141+ result = await d_client .vset ().vrange ("myset" , "[1" , "[2" )
1142+ assert result == ["1" , "10" , "2" ]
0 commit comments