diff --git a/tests/test_utils_xrange.py b/tests/test_utils_xrange.py new file mode 100644 index 000000000..3687726cc --- /dev/null +++ b/tests/test_utils_xrange.py @@ -0,0 +1,37 @@ +import pytest +from itertools import count +import sys +import os +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from slic.utils.xrange import * + + +def is_count_iterator(obj): + return isinstance(obj, type(count())) + +@pytest.mark.parametrize("args, kwargs, expected", [ + ((10,), {}, list(range(10))), # xrange(10) + ((0, 10), {}, list(range(0, 10))), # xrange(0, 10) + ((0, 10, 2), {}, list(range(0, 10, 2))), # xrange(0, 10, 2) + ((10,), {"step": 2}, list(range(0, 10, 2))), # xrange(10, step=2) +]) +def test_xrange_finite(args, kwargs, expected): + assert list(xrange(*args, **kwargs)) == expected + +@pytest.mark.parametrize("args, kwargs, expected_repr", [ + ((), {}, repr(count(0))), # xrange() + ((), {"step": 2}, repr(count(0, 2))), # xrange(step=2) +]) +def test_xrange_infinite(args, kwargs, expected_repr): + # Only test first few elements to avoid infinite loop + result = xrange(*args, **kwargs) + assert is_count_iterator(result) + for i, val in zip(range(20), result): + assert val == i * kwargs.get("step", 1) + +@pytest.mark.parametrize("args", [ + (1, 2, 3, 4), # too many positional arguments +]) +def test_xrange_too_many_args(args): + with pytest.raises(TypeError, match="xrange takes from 2 to 3 positional arguments"): + xrange(*args)