3
3
namespace MongoDB \Tests \Model ;
4
4
5
5
use MongoDB \Model \CachingIterator ;
6
+ use Exception ;
6
7
7
8
class CachingIteratorTest extends \PHPUnit_Framework_TestCase
8
9
{
@@ -19,6 +20,15 @@ public function testTraversingGeneratorConsumesIt()
19
20
$ this ->assertSame ([1 , 2 , 3 ], iterator_to_array ($ iterator ));
20
21
}
21
22
23
+ public function testConstructorRewinds ()
24
+ {
25
+ $ iterator = new CachingIterator ($ this ->getTraversable ([1 , 2 , 3 ]));
26
+
27
+ $ this ->assertTrue ($ iterator ->valid ());
28
+ $ this ->assertSame (0 , $ iterator ->key ());
29
+ $ this ->assertSame (1 , $ iterator ->current ());
30
+ }
31
+
22
32
public function testIteration ()
23
33
{
24
34
$ iterator = new CachingIterator ($ this ->getTraversable ([1 , 2 , 3 ]));
@@ -34,13 +44,44 @@ public function testIteration()
34
44
$ this ->assertFalse ($ iterator ->valid ());
35
45
}
36
46
47
+ public function testIterationWithEmptySet ()
48
+ {
49
+ $ iterator = new CachingIterator ($ this ->getTraversable ([]));
50
+
51
+ $ iterator ->rewind ();
52
+ $ this ->assertFalse ($ iterator ->valid ());
53
+ }
54
+
55
+ public function testPartialIterationDoesNotExhaust ()
56
+ {
57
+ $ traversable = $ this ->getTraversableThatThrows ([1 , 2 , new Exception ]);
58
+ $ iterator = new CachingIterator ($ traversable );
59
+
60
+ $ expectedKey = 0 ;
61
+ $ expectedItem = 1 ;
62
+
63
+ foreach ($ iterator as $ key => $ item ) {
64
+ $ this ->assertSame ($ expectedKey ++, $ key );
65
+ $ this ->assertSame ($ expectedItem ++, $ item );
66
+
67
+ if ($ key === 1 ) {
68
+ break ;
69
+ }
70
+ }
71
+
72
+ $ this ->assertTrue ($ iterator ->valid ());
73
+ }
74
+
37
75
public function testRewindAfterPartialIteration ()
38
76
{
39
77
$ iterator = new CachingIterator ($ this ->getTraversable ([1 , 2 , 3 ]));
40
78
79
+ $ iterator ->rewind ();
80
+ $ this ->assertTrue ($ iterator ->valid ());
81
+ $ this ->assertSame (0 , $ iterator ->key ());
41
82
$ this ->assertSame (1 , $ iterator ->current ());
42
- $ iterator ->next ();
43
83
84
+ $ iterator ->next ();
44
85
$ this ->assertSame ([1 , 2 , 3 ], iterator_to_array ($ iterator ));
45
86
}
46
87
@@ -53,14 +94,37 @@ public function testCount()
53
94
public function testCountAfterPartialIteration ()
54
95
{
55
96
$ iterator = new CachingIterator ($ this ->getTraversable ([1 , 2 , 3 ]));
97
+
98
+ $ iterator ->rewind ();
99
+ $ this ->assertTrue ($ iterator ->valid ());
100
+ $ this ->assertSame (0 , $ iterator ->key ());
101
+ $ this ->assertSame (1 , $ iterator ->current ());
102
+
56
103
$ iterator ->next ();
57
104
$ this ->assertCount (3 , $ iterator );
58
105
}
59
106
107
+ public function testCountWithEmptySet ()
108
+ {
109
+ $ iterator = new CachingIterator ($ this ->getTraversable ([]));
110
+ $ this ->assertCount (0 , $ iterator );
111
+ }
112
+
60
113
private function getTraversable ($ items )
61
114
{
62
115
foreach ($ items as $ item ) {
63
116
yield $ item ;
64
117
}
65
118
}
119
+
120
+ private function getTraversableThatThrows ($ items )
121
+ {
122
+ foreach ($ items as $ item ) {
123
+ if ($ item instanceof Exception) {
124
+ throw $ item ;
125
+ } else {
126
+ yield $ item ;
127
+ }
128
+ }
129
+ }
66
130
}
0 commit comments