@@ -1031,26 +1031,55 @@ def test_get_loc_namedtuple_behaves_like_tuple():
1031
1031
assert idx .get_loc (("i5" , "i6" )) == 2
1032
1032
1033
1033
1034
- def test_searchsorted ():
1035
- # GH14833
1036
- mi = MultiIndex .from_tuples ([("a" , 0 ), ("a" , 1 ), ("b" , 0 ), ("b" , 1 ), ("c" , 0 )])
1034
+ @ pytest . fixture
1035
+ def mi ():
1036
+ return MultiIndex .from_tuples ([("a" , 0 ), ("a" , 1 ), ("b" , 0 ), ("b" , 1 ), ("c" , 0 )])
1037
1037
1038
- assert np .all (mi .searchsorted (("b" , 0 )) == 2 )
1039
- assert np .all (mi .searchsorted (("b" , 0 ), side = "right" ) == 3 )
1040
- assert np .all (mi .searchsorted (("a" , 0 )) == 0 )
1041
- assert np .all (mi .searchsorted (("a" , - 1 )) == 0 )
1042
- assert np .all (mi .searchsorted (("c" , 1 )) == 5 )
1043
1038
1044
- result = mi .searchsorted ([("a" , 1 ), ("b" , 0 ), ("c" , 0 )])
1045
- expected = np .array ([1 , 2 , 4 ], dtype = np .intp )
1046
- tm .assert_numpy_array_equal (result , expected )
1039
+ @pytest .mark .parametrize (
1040
+ "value, side, expected" ,
1041
+ [
1042
+ (("b" , 0 ), "left" , 2 ),
1043
+ (("b" , 0 ), "right" , 3 ),
1044
+ (("a" , 0 ), "left" , 0 ),
1045
+ (("a" , - 1 ), "left" , 0 ),
1046
+ (("c" , 1 ), "left" , 5 ),
1047
+ ],
1048
+ ids = [
1049
+ "b-0-left" ,
1050
+ "b-0-right" ,
1051
+ "a-0-left" ,
1052
+ "a--1-left" ,
1053
+ "c-1-left-beyond" ,
1054
+ ],
1055
+ )
1056
+ def test_searchsorted_single (mi , value , side , expected ):
1057
+ # GH14833
1058
+ result = mi .searchsorted (value , side = side )
1059
+ assert np .all (result == expected )
1060
+
1047
1061
1048
- result = mi .searchsorted ([("a" , 1 ), ("b" , 0 ), ("c" , 0 )], side = "right" )
1049
- expected = np .array ([2 , 3 , 5 ], dtype = np .intp )
1062
+ @pytest .mark .parametrize (
1063
+ "values, side, expected" ,
1064
+ [
1065
+ ([("a" , 1 ), ("b" , 0 ), ("c" , 0 )], "left" , np .array ([1 , 2 , 4 ], dtype = np .intp )),
1066
+ ([("a" , 1 ), ("b" , 0 ), ("c" , 0 )], "right" , np .array ([2 , 3 , 5 ], dtype = np .intp )),
1067
+ ],
1068
+ ids = ["list-left" , "list-right" ],
1069
+ )
1070
+ def test_searchsorted_list (mi , values , side , expected ):
1071
+ result = mi .searchsorted (values , side = side )
1050
1072
tm .assert_numpy_array_equal (result , expected )
1051
1073
1052
- with pytest .raises (ValueError , match = "side must be either 'left' or 'right'" ):
1053
- mi .searchsorted (("a" , 1 ), side = "middle" )
1054
1074
1055
- with pytest .raises (TypeError , match = "value must be a tuple or list" ):
1056
- mi .searchsorted ("a" )
1075
+ @pytest .mark .parametrize (
1076
+ "value, side, error_type, match" ,
1077
+ [
1078
+ (("a" , 1 ), "middle" , ValueError , "side must be either 'left' or 'right'" ),
1079
+ ("a" , "left" , TypeError , "value must be a tuple or list" ),
1080
+ ],
1081
+ ids = ["invalid-side" , "invalid-value-type" ],
1082
+ )
1083
+ def test_searchsorted_invalid (mi , value , side , error_type , match ):
1084
+ with pytest .raises (error_type , match = match ):
1085
+ mi .searchsorted (value , side = side )
0 commit comments