@@ -1031,26 +1031,55 @@ def test_get_loc_namedtuple_behaves_like_tuple():
10311031 assert idx .get_loc (("i5" , "i6" )) == 2
10321032
10331033
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 )])
10371037
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 )
10431038
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+
10471061
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 )
10501072 tm .assert_numpy_array_equal (result , expected )
10511073
1052- with pytest .raises (ValueError , match = "side must be either 'left' or 'right'" ):
1053- mi .searchsorted (("a" , 1 ), side = "middle" )
10541074
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