test_compat.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. # -*- coding: utf-8 -*-
  2. """
  3. Testing that functions from compat work as expected
  4. """
  5. import re
  6. import pytest
  7. from pandas.compat import (
  8. PY2, builtins, filter, get_range_parameters, iteritems, iterkeys,
  9. itervalues, lfilter, lmap, lrange, lzip, map, next, range, re_type, zip)
  10. class TestBuiltinIterators(object):
  11. @classmethod
  12. def check_result(cls, actual, expected, lengths):
  13. for (iter_res, list_res), exp, length in zip(actual, expected,
  14. lengths):
  15. assert not isinstance(iter_res, list)
  16. assert isinstance(list_res, list)
  17. iter_res = list(iter_res)
  18. assert len(list_res) == length
  19. assert len(iter_res) == length
  20. assert iter_res == exp
  21. assert list_res == exp
  22. def test_range(self):
  23. actual1 = range(10)
  24. actual2 = lrange(10)
  25. actual = [actual1, actual2],
  26. expected = list(builtins.range(10)),
  27. lengths = 10,
  28. actual1 = range(1, 10, 2)
  29. actual2 = lrange(1, 10, 2)
  30. actual += [actual1, actual2],
  31. lengths += 5,
  32. expected += list(builtins.range(1, 10, 2)),
  33. self.check_result(actual, expected, lengths)
  34. def test_map(self):
  35. func = lambda x, y, z: x + y + z
  36. lst = [builtins.range(10), builtins.range(10), builtins.range(10)]
  37. actual1 = map(func, *lst)
  38. actual2 = lmap(func, *lst)
  39. actual = [actual1, actual2],
  40. expected = list(builtins.map(func, *lst)),
  41. lengths = 10,
  42. self.check_result(actual, expected, lengths)
  43. def test_filter(self):
  44. func = lambda x: x
  45. lst = list(builtins.range(10))
  46. actual1 = filter(func, lst)
  47. actual2 = lfilter(func, lst)
  48. actual = [actual1, actual2],
  49. lengths = 9,
  50. expected = list(builtins.filter(func, lst)),
  51. self.check_result(actual, expected, lengths)
  52. def test_zip(self):
  53. lst = [builtins.range(10), builtins.range(10), builtins.range(10)]
  54. actual = [zip(*lst), lzip(*lst)],
  55. expected = list(builtins.zip(*lst)),
  56. lengths = 10,
  57. self.check_result(actual, expected, lengths)
  58. def test_dict_iterators(self):
  59. assert next(itervalues({1: 2})) == 2
  60. assert next(iterkeys({1: 2})) == 1
  61. assert next(iteritems({1: 2})) == (1, 2)
  62. class TestCompatFunctions(object):
  63. @pytest.mark.parametrize(
  64. 'start,stop,step', [(0, 10, 2), (11, -2, -1), (0, -5, 1), (2, 4, 8)])
  65. def test_get_range_parameters(self, start, stop, step):
  66. rng = range(start, stop, step)
  67. if PY2 and len(rng) == 0:
  68. start_expected, stop_expected, step_expected = 0, 0, 1
  69. elif PY2 and len(rng) == 1:
  70. start_expected, stop_expected, step_expected = start, start + 1, 1
  71. else:
  72. start_expected, stop_expected, step_expected = start, stop, step
  73. start_result, stop_result, step_result = get_range_parameters(rng)
  74. assert start_result == start_expected
  75. assert stop_result == stop_expected
  76. assert step_result == step_expected
  77. def test_re_type():
  78. assert isinstance(re.compile(''), re_type)