import pytest
from dataloader_rs import PyDataloader as DataLoader
from tests.py_dataloader_test_utils import ListDataset
def test_iter_len_decrements_as_consumed():
loader = DataLoader(ListDataset(range(7)), batch_size=3, drop_last=False)
it = iter(loader)
assert len(it) == 3 next(it)
assert len(it) == 2
next(it)
assert len(it) == 1
next(it)
assert len(it) == 0
def test_parallel_iter_len_decrements():
loader = DataLoader(ListDataset(range(8)), batch_size=2, num_workers=2)
it = iter(loader)
expected = 4 assert len(it) == expected
consumed = 0
while True:
try:
next(it)
consumed += 1
assert len(it) == expected - consumed
except StopIteration:
break
assert consumed == expected
def test_loader_len_after_drop_last():
loader_keep = DataLoader(ListDataset(range(10)), batch_size=3, drop_last=False)
assert len(loader_keep) == 4
loader_drop = DataLoader(ListDataset(range(10)), batch_size=3, drop_last=True)
assert len(loader_drop) == 3
def test_iter_is_exhausted_only_once():
loader = DataLoader(ListDataset(range(6)), batch_size=3)
it = iter(loader)
next(it)
next(it)
with pytest.raises(StopIteration):
next(it) with pytest.raises(StopIteration):
next(it)
def test_loader_reusable_across_epochs():
loader = DataLoader(ListDataset(range(8)), batch_size=3)
epoch1 = list(loader)
epoch2 = list(loader)
assert epoch1 == epoch2
def test_iter_returns_self():
loader = DataLoader(ListDataset(range(4)), batch_size=2)
it = iter(loader)
assert iter(it) is it
def test_multiple_iters_independent():
n = 8
bs = 2
loader = DataLoader(ListDataset(range(n)), batch_size=bs)
it1 = iter(loader)
it2 = iter(loader)
items1 = []
for batch in it1:
items1.extend(batch)
items2 = []
for batch in it2:
items2.extend(batch)
assert sorted(items1) == list(range(n)), "iter1 must cover all items"
assert sorted(items2) == list(range(n)), "iter2 must cover all items independently"