test_validate_args_and_kwargs.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import pytest
  2. from pandas.util._validators import validate_args_and_kwargs
  3. _fname = "func"
  4. def test_invalid_total_length_max_length_one():
  5. compat_args = ("foo",)
  6. kwargs = {"foo": "FOO"}
  7. args = ("FoO", "BaZ")
  8. min_fname_arg_count = 0
  9. max_length = len(compat_args) + min_fname_arg_count
  10. actual_length = len(kwargs) + len(args) + min_fname_arg_count
  11. msg = (
  12. rf"{_fname}\(\) takes at most {max_length} "
  13. rf"argument \({actual_length} given\)"
  14. )
  15. with pytest.raises(TypeError, match=msg):
  16. validate_args_and_kwargs(_fname, args, kwargs, min_fname_arg_count, compat_args)
  17. def test_invalid_total_length_max_length_multiple():
  18. compat_args = ("foo", "bar", "baz")
  19. kwargs = {"foo": "FOO", "bar": "BAR"}
  20. args = ("FoO", "BaZ")
  21. min_fname_arg_count = 2
  22. max_length = len(compat_args) + min_fname_arg_count
  23. actual_length = len(kwargs) + len(args) + min_fname_arg_count
  24. msg = (
  25. rf"{_fname}\(\) takes at most {max_length} "
  26. rf"arguments \({actual_length} given\)"
  27. )
  28. with pytest.raises(TypeError, match=msg):
  29. validate_args_and_kwargs(_fname, args, kwargs, min_fname_arg_count, compat_args)
  30. @pytest.mark.parametrize("args,kwargs", [((), {"foo": -5, "bar": 2}), ((-5, 2), {})])
  31. def test_missing_args_or_kwargs(args, kwargs):
  32. bad_arg = "bar"
  33. min_fname_arg_count = 2
  34. compat_args = {"foo": -5, bad_arg: 1}
  35. msg = (
  36. rf"the '{bad_arg}' parameter is not supported "
  37. rf"in the pandas implementation of {_fname}\(\)"
  38. )
  39. with pytest.raises(ValueError, match=msg):
  40. validate_args_and_kwargs(_fname, args, kwargs, min_fname_arg_count, compat_args)
  41. def test_duplicate_argument():
  42. min_fname_arg_count = 2
  43. compat_args = {"foo": None, "bar": None, "baz": None}
  44. kwargs = {"foo": None, "bar": None}
  45. args = (None,) # duplicate value for "foo"
  46. msg = rf"{_fname}\(\) got multiple values for keyword argument 'foo'"
  47. with pytest.raises(TypeError, match=msg):
  48. validate_args_and_kwargs(_fname, args, kwargs, min_fname_arg_count, compat_args)
  49. def test_validation():
  50. # No exceptions should be raised.
  51. compat_args = {"foo": 1, "bar": None, "baz": -2}
  52. kwargs = {"baz": -2}
  53. args = (1, None)
  54. min_fname_arg_count = 2
  55. validate_args_and_kwargs(_fname, args, kwargs, min_fname_arg_count, compat_args)