@@ -879,6 +879,103 @@ async def test_bitop_string_operands(self, r: redis.Redis):
879
879
assert int (binascii .hexlify (await r .get ("res2" )), 16 ) == 0x0102FFFF
880
880
assert int (binascii .hexlify (await r .get ("res3" )), 16 ) == 0x000000FF
881
881
882
+ @pytest .mark .onlynoncluster
883
+ @skip_if_server_version_lt ("8.1.224" )
884
+ async def test_bitop_diff (self , r : redis .Redis ):
885
+ await r .set ("a" , b"\xf0 " )
886
+ await r .set ("b" , b"\xc0 " )
887
+ await r .set ("c" , b"\x80 " )
888
+
889
+ result = await r .bitop ("DIFF" , "result" , "a" , "b" , "c" )
890
+ assert result == 1
891
+ assert await r .get ("result" ) == b"\x30 "
892
+
893
+ await r .bitop ("DIFF" , "result2" , "a" , "nonexistent" )
894
+ assert await r .get ("result2" ) == b"\xf0 "
895
+
896
+ @pytest .mark .onlynoncluster
897
+ @skip_if_server_version_lt ("8.1.224" )
898
+ async def test_bitop_diff1 (self , r : redis .Redis ):
899
+ await r .set ("a" , b"\xf0 " )
900
+ await r .set ("b" , b"\xc0 " )
901
+ await r .set ("c" , b"\x80 " )
902
+
903
+ result = await r .bitop ("DIFF1" , "result" , "a" , "b" , "c" )
904
+ assert result == 1
905
+ assert await r .get ("result" ) == b"\x00 "
906
+
907
+ await r .set ("d" , b"\x0f " )
908
+ await r .set ("e" , b"\x03 " )
909
+ await r .bitop ("DIFF1" , "result2" , "d" , "e" )
910
+ assert await r .get ("result2" ) == b"\x00 "
911
+
912
+ @pytest .mark .onlynoncluster
913
+ @skip_if_server_version_lt ("8.1.224" )
914
+ async def test_bitop_andor (self , r : redis .Redis ):
915
+ await r .set ("a" , b"\xf0 " )
916
+ await r .set ("b" , b"\xc0 " )
917
+ await r .set ("c" , b"\x80 " )
918
+
919
+ result = await r .bitop ("ANDOR" , "result" , "a" , "b" , "c" )
920
+ assert result == 1
921
+ assert await r .get ("result" ) == b"\xc0 "
922
+
923
+ await r .set ("x" , b"\xf0 " )
924
+ await r .set ("y" , b"\x0f " )
925
+ await r .bitop ("ANDOR" , "result2" , "x" , "y" )
926
+ assert await r .get ("result2" ) == b"\x00 "
927
+
928
+ @pytest .mark .onlynoncluster
929
+ @skip_if_server_version_lt ("8.1.224" )
930
+ async def test_bitop_one (self , r : redis .Redis ):
931
+ await r .set ("a" , b"\xf0 " )
932
+ await r .set ("b" , b"\xc0 " )
933
+ await r .set ("c" , b"\x80 " )
934
+
935
+ result = await r .bitop ("ONE" , "result" , "a" , "b" , "c" )
936
+ assert result == 1
937
+ assert await r .get ("result" ) == b"\x30 "
938
+
939
+ await r .set ("x" , b"\xf0 " )
940
+ await r .set ("y" , b"\x0f " )
941
+ await r .bitop ("ONE" , "result2" , "x" , "y" )
942
+ assert await r .get ("result2" ) == b"\xff "
943
+
944
+ @pytest .mark .onlynoncluster
945
+ @skip_if_server_version_lt ("8.1.224" )
946
+ async def test_bitop_new_operations_with_empty_keys (self , r : redis .Redis ):
947
+ await r .set ("a" , b"\xff " )
948
+
949
+ await r .bitop ("DIFF" , "empty_result" , "nonexistent" , "a" )
950
+ assert await r .get ("empty_result" ) == b"\x00 "
951
+
952
+ await r .bitop ("DIFF1" , "empty_result2" , "a" , "nonexistent" )
953
+ assert await r .get ("empty_result2" ) == b"\x00 "
954
+
955
+ await r .bitop ("ANDOR" , "empty_result3" , "a" , "nonexistent" )
956
+ assert await r .get ("empty_result3" ) == b"\x00 "
957
+
958
+ await r .bitop ("ONE" , "empty_result4" , "nonexistent" )
959
+ assert await r .get ("empty_result4" ) is None
960
+
961
+ @pytest .mark .onlynoncluster
962
+ @skip_if_server_version_lt ("8.1.224" )
963
+ async def test_bitop_new_operations_return_values (self , r : redis .Redis ):
964
+ await r .set ("a" , b"\xff \x00 \xff " )
965
+ await r .set ("b" , b"\x00 \xff " )
966
+
967
+ result1 = await r .bitop ("DIFF" , "result1" , "a" , "b" )
968
+ assert result1 == 3
969
+
970
+ result2 = await r .bitop ("DIFF1" , "result2" , "a" , "b" )
971
+ assert result2 == 3
972
+
973
+ result3 = await r .bitop ("ANDOR" , "result3" , "a" , "b" )
974
+ assert result3 == 3
975
+
976
+ result4 = await r .bitop ("ONE" , "result4" , "a" , "b" )
977
+ assert result4 == 3
978
+
882
979
@pytest .mark .onlynoncluster
883
980
@skip_if_server_version_lt ("2.8.7" )
884
981
async def test_bitpos (self , r : redis .Redis ):
0 commit comments