1+ <?php namespace util \data \unittest ;
2+
3+ use lang \IllegalArgumentException ;
4+ use test \{Assert , Expect , Test , Values };
5+ use util \data \Sequence ;
6+
7+ class SequenceWindowTest extends AbstractSequenceTest {
8+
9+ #[Test]
10+ public function chunked () {
11+ $ this ->assertSequence (
12+ [[1 , 2 ], [3 , 4 ]],
13+ Sequence::of ([1 , 2 , 3 , 4 ])->chunked (2 )
14+ );
15+ }
16+
17+ #[Test]
18+ public function chunked_with_partial () {
19+ $ this ->assertSequence (
20+ [[1 , 2 ], [3 , 4 ], [5 ]],
21+ Sequence::of ([1 , 2 , 3 , 4 , 5 ])->chunked (2 )
22+ );
23+ }
24+
25+ #[Test]
26+ public function sliding_window () {
27+ $ this ->assertSequence (
28+ [[1 , 2 ], [2 , 3 ], [3 , 4 ]],
29+ Sequence::of ([1 , 2 , 3 , 4 ])->windowed (2 )
30+ );
31+ }
32+
33+ #[Test]
34+ public function window_size_equal_to_step () {
35+ $ this ->assertSequence (
36+ [[1 , 2 ], [3 , 4 ]],
37+ Sequence::of ([1 , 2 , 3 , 4 ])->windowed (2 , 2 )
38+ );
39+ }
40+
41+ #[Test]
42+ public function skip_elements () {
43+ $ this ->assertSequence (
44+ [[1 , 2 ], [4 , 5 ]],
45+ Sequence::of ([1 , 2 , 3 , 4 , 5 ])->windowed (2 , 3 )
46+ );
47+ }
48+
49+ #[Test, Values([[true , [[1 , 2 ], [3 , 4 ], [5 ]]], [false , [[1 , 2 ], [3 , 4 ]]]])]
50+ public function partial_window ($ flag , $ expected ) {
51+ $ this ->assertSequence (
52+ $ expected ,
53+ Sequence::of ([1 , 2 , 3 , 4 , 5 ])->windowed (2 , 2 , $ flag )
54+ );
55+ }
56+
57+ #[Test]
58+ public function partial_window_multiple_partials_at_end () {
59+ $ this ->assertSequence (
60+ [[1 , 2 , 3 , 4 , 5 ], [4 , 5 , 6 , 7 , 8 ], [7 , 8 , 9 , 10 ], [10 ]],
61+ Sequence::of ([1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 ])->windowed (5 , 3 , true )
62+ );
63+ }
64+
65+ #[Test]
66+ public function skip_elements_and_return_partial () {
67+ $ this ->assertSequence (
68+ [[1 , 2 ], [5 ]],
69+ Sequence::of ([1 , 2 , 3 , 4 , 5 ])->windowed (2 , 4 , true )
70+ );
71+ }
72+
73+ #[Test, Values([[[], []], [[1 ], [[1 ]]]])]
74+ public function chunked_edge_cases ($ elements , $ expected ) {
75+ $ this ->assertSequence ($ expected , Sequence::of ($ elements )->chunked (2 ));
76+ }
77+
78+ #[Test, Values([[[], []], [[1 ], []]])]
79+ public function windowed_edge_cases_without_partial ($ elements , $ expected ) {
80+ $ this ->assertSequence ($ expected , Sequence::of ($ elements )->windowed (2 , 1 , false ));
81+ }
82+
83+ #[Test, Values([[[], []], [[1 ], [[1 ]]]])]
84+ public function windowed_edge_cases_with_partial ($ elements , $ expected ) {
85+ $ this ->assertSequence ($ expected , Sequence::of ($ elements )->windowed (2 , 1 , true ));
86+ }
87+
88+ #[Test, Expect(IllegalArgumentException::class), Values([-1 , 0 ])]
89+ public function chunk_size_must_greater_than_zero ($ size ) {
90+ Sequence::of ([1 ])->chunked ($ size );
91+ }
92+
93+ #[Test, Expect(IllegalArgumentException::class), Values([-1 , 0 ])]
94+ public function window_size_must_greater_than_zero ($ size ) {
95+ Sequence::of ([1 ])->windowed ($ size );
96+ }
97+
98+ #[Test, Expect(IllegalArgumentException::class), Values([-1 , 0 ])]
99+ public function window_step_must_greater_than_zero ($ step ) {
100+ Sequence::of ([1 ])->windowed (1 , $ step );
101+ }
102+ }
0 commit comments