|
20 | 20 |
|
21 | 21 | import pytest |
22 | 22 |
|
23 | | -from pyiceberg.utils.bin_packing import PackingIterator |
| 23 | +from pyiceberg.utils.bin_packing import ListPacker, PackingIterator |
| 24 | + |
| 25 | +INT_MAX = 2147483647 |
24 | 26 |
|
25 | 27 |
|
26 | 28 | @pytest.mark.parametrize( |
@@ -83,4 +85,46 @@ def test_bin_packing_lookback( |
83 | 85 | def weight_func(x: int) -> int: |
84 | 86 | return x |
85 | 87 |
|
| 88 | + packer: ListPacker[int] = ListPacker(target_weight, lookback, largest_bin_first) |
| 89 | + |
86 | 90 | assert list(PackingIterator(splits, target_weight, lookback, weight_func, largest_bin_first)) == expected_lists |
| 91 | + assert list(packer.pack(splits, weight_func)) == expected_lists |
| 92 | + |
| 93 | + |
| 94 | +@pytest.mark.parametrize( |
| 95 | + "splits, target_weight, lookback, largest_bin_first, expected_lists", |
| 96 | + [ |
| 97 | + # Single Lookback Tests |
| 98 | + ([1, 2, 3, 4, 5], 3, 1, False, [[1, 2], [3], [4], [5]]), |
| 99 | + ([1, 2, 3, 4, 5], 4, 1, False, [[1, 2], [3], [4], [5]]), |
| 100 | + ([1, 2, 3, 4, 5], 5, 1, False, [[1], [2, 3], [4], [5]]), |
| 101 | + ([1, 2, 3, 4, 5], 6, 1, False, [[1, 2, 3], [4], [5]]), |
| 102 | + ([1, 2, 3, 4, 5], 7, 1, False, [[1, 2], [3, 4], [5]]), |
| 103 | + ([1, 2, 3, 4, 5], 8, 1, False, [[1, 2], [3, 4], [5]]), |
| 104 | + ([1, 2, 3, 4, 5], 9, 1, False, [[1, 2, 3], [4, 5]]), |
| 105 | + ([1, 2, 3, 4, 5], 11, 1, False, [[1, 2, 3], [4, 5]]), |
| 106 | + ([1, 2, 3, 4, 5], 12, 1, False, [[1, 2], [3, 4, 5]]), |
| 107 | + ([1, 2, 3, 4, 5], 14, 1, False, [[1], [2, 3, 4, 5]]), |
| 108 | + ([1, 2, 3, 4, 5], 15, 1, False, [[1, 2, 3, 4, 5]]), |
| 109 | + # Unlimited Lookback Tests |
| 110 | + ([1, 2, 3, 4, 5], 3, INT_MAX, False, [[1, 2], [3], [4], [5]]), |
| 111 | + ([1, 2, 3, 4, 5], 4, INT_MAX, False, [[2], [1, 3], [4], [5]]), |
| 112 | + ([1, 2, 3, 4, 5], 5, INT_MAX, False, [[2, 3], [1, 4], [5]]), |
| 113 | + ([1, 2, 3, 4, 5], 6, INT_MAX, False, [[3], [2, 4], [1, 5]]), |
| 114 | + ([1, 2, 3, 4, 5], 7, INT_MAX, False, [[1], [3, 4], [2, 5]]), |
| 115 | + ([1, 2, 3, 4, 5], 8, INT_MAX, False, [[1, 2, 4], [3, 5]]), |
| 116 | + ([1, 2, 3, 4, 5], 9, INT_MAX, False, [[1, 2, 3], [4, 5]]), |
| 117 | + ([1, 2, 3, 4, 5], 10, INT_MAX, False, [[2, 3], [1, 4, 5]]), |
| 118 | + ([1, 2, 3, 4, 5], 11, INT_MAX, False, [[1, 3], [2, 4, 5]]), |
| 119 | + ([1, 2, 3, 4, 5], 12, INT_MAX, False, [[1, 2], [3, 4, 5]]), |
| 120 | + ([1, 2, 3, 4, 5], 13, INT_MAX, False, [[2], [1, 3, 4, 5]]), |
| 121 | + ([1, 2, 3, 4, 5], 14, INT_MAX, False, [[1], [2, 3, 4, 5]]), |
| 122 | + ([1, 2, 3, 4, 5], 15, INT_MAX, False, [[1, 2, 3, 4, 5]]), |
| 123 | + ], |
| 124 | +) |
| 125 | +def test_reverse_bin_packing_lookback( |
| 126 | + splits: List[int], target_weight: int, lookback: int, largest_bin_first: bool, expected_lists: List[List[int]] |
| 127 | +) -> None: |
| 128 | + packer: ListPacker[int] = ListPacker(target_weight, lookback, largest_bin_first) |
| 129 | + result = packer.pack_end(splits, lambda x: x) |
| 130 | + assert result == expected_lists |
0 commit comments