public code v1
This commit is contained in:
@@ -0,0 +1,162 @@
|
||||
import pytest
|
||||
from typing import List, Any
|
||||
|
||||
from pygrex.utils.sliding_window import SlidingWindow
|
||||
|
||||
|
||||
class TestSlidingWindow:
|
||||
"""Test suite for the SlidingWindow class."""
|
||||
|
||||
def test_basic_functionality(self):
|
||||
"""Test the basic window sliding functionality."""
|
||||
data = [1, 2, 3, 4, 5]
|
||||
window_size = 3
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
# First window
|
||||
assert sliding_window.get_next_window() == [1, 2, 3]
|
||||
# Second window
|
||||
assert sliding_window.get_next_window() == [2, 3, 4]
|
||||
# Third window
|
||||
assert sliding_window.get_next_window() == [3, 4, 5]
|
||||
# No more windows
|
||||
assert sliding_window.get_next_window() is None
|
||||
|
||||
def test_window_equal_to_sequence_length(self):
|
||||
"""Test when window size equals the sequence length."""
|
||||
data = [1, 2, 3]
|
||||
window_size = 3
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
assert sliding_window.get_next_window() == [1, 2, 3]
|
||||
assert sliding_window.get_next_window() is None
|
||||
|
||||
def test_window_larger_than_sequence(self):
|
||||
"""Test when window size is larger than the sequence length."""
|
||||
data = [1, 2, 3]
|
||||
window_size = 4
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
assert sliding_window.get_next_window() is None
|
||||
|
||||
def test_empty_sequence(self):
|
||||
"""Test with an empty sequence."""
|
||||
data: List[Any] = []
|
||||
window_size = 2
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
assert sliding_window.get_next_window() is None
|
||||
|
||||
def test_invalid_window_size(self):
|
||||
"""Test with invalid window sizes."""
|
||||
data = [1, 2, 3, 4, 5]
|
||||
|
||||
# Test with zero window size
|
||||
with pytest.raises(ValueError):
|
||||
SlidingWindow(data, 0)
|
||||
|
||||
# Test with negative window size
|
||||
with pytest.raises(ValueError):
|
||||
SlidingWindow(data, -1)
|
||||
|
||||
def test_non_iterable_sequence(self):
|
||||
"""Test with a non-iterable object."""
|
||||
data = 123 # Integer is not iterable
|
||||
window_size = 2
|
||||
|
||||
with pytest.raises(TypeError):
|
||||
SlidingWindow(data, window_size)
|
||||
|
||||
def test_reset_functionality(self):
|
||||
"""Test the reset functionality."""
|
||||
data = [1, 2, 3, 4]
|
||||
window_size = 2
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
# Get first two windows
|
||||
assert sliding_window.get_next_window() == [1, 2]
|
||||
assert sliding_window.get_next_window() == [2, 3]
|
||||
|
||||
# Reset and check if we get the first window again
|
||||
sliding_window.reset()
|
||||
assert sliding_window.get_next_window() == [1, 2]
|
||||
|
||||
def test_has_next(self):
|
||||
"""Test the has_next method."""
|
||||
data = [1, 2, 3]
|
||||
window_size = 2
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
assert sliding_window.has_next() is True
|
||||
sliding_window.get_next_window() # Get first window
|
||||
assert sliding_window.has_next() is True
|
||||
sliding_window.get_next_window() # Get second window
|
||||
assert sliding_window.has_next() is False
|
||||
|
||||
def test_iterator_protocol(self):
|
||||
"""Test the iterator protocol implementation."""
|
||||
data = [1, 2, 3, 4]
|
||||
window_size = 2
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
# Using the class in a for loop
|
||||
windows = []
|
||||
for window in sliding_window:
|
||||
windows.append(window)
|
||||
|
||||
assert windows == [[1, 2], [2, 3], [3, 4]]
|
||||
|
||||
# After iteration, the index should be at the end
|
||||
assert sliding_window.has_next() is False
|
||||
|
||||
# Test that reset works after iteration
|
||||
sliding_window.reset()
|
||||
assert sliding_window.has_next() is True
|
||||
assert sliding_window.get_next_window() == [1, 2]
|
||||
|
||||
def test_len_functionality(self):
|
||||
"""Test the __len__ method."""
|
||||
# Normal case
|
||||
data = [1, 2, 3, 4, 5]
|
||||
window_size = 2
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
assert len(sliding_window) == 4
|
||||
|
||||
# Window size equals sequence length
|
||||
window_size = 5
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
assert len(sliding_window) == 1
|
||||
|
||||
# Window size greater than sequence length
|
||||
window_size = 6
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
assert len(sliding_window) == 0
|
||||
|
||||
# Empty sequence
|
||||
data = []
|
||||
window_size = 2
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
assert len(sliding_window) == 0
|
||||
|
||||
def test_with_string_data(self):
|
||||
"""Test with string data to verify generic implementation."""
|
||||
data = "abcde"
|
||||
window_size = 3
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
assert sliding_window.get_next_window() == "abc"
|
||||
assert sliding_window.get_next_window() == "bcd"
|
||||
assert sliding_window.get_next_window() == "cde"
|
||||
assert sliding_window.get_next_window() is None
|
||||
|
||||
def test_multiple_data_types(self):
|
||||
"""Test with a list containing multiple data types."""
|
||||
data = [1, "two", 3.0, [4, 5], {"six": 6}]
|
||||
window_size = 2
|
||||
sliding_window = SlidingWindow(data, window_size)
|
||||
|
||||
assert sliding_window.get_next_window() == [1, "two"]
|
||||
assert sliding_window.get_next_window() == ["two", 3.0]
|
||||
assert sliding_window.get_next_window() == [3.0, [4, 5]]
|
||||
assert sliding_window.get_next_window() == [[4, 5], {"six": 6}]
|
||||
assert sliding_window.get_next_window() is None
|
||||
Reference in New Issue
Block a user