1<?php
2/*
3 * This file is part of PHPUnit.
4 *
5 * (c) Sebastian Bergmann <sebastian@phpunit.de>
6 *
7 * For the full copyright and license information, please view the LICENSE
8 * file that was distributed with this source code.
9 */
10
11class CountTest extends PHPUnit_Framework_TestCase
12{
13    public function testCount()
14    {
15        $countConstraint = new PHPUnit_Framework_Constraint_Count(3);
16        $this->assertTrue($countConstraint->evaluate([1, 2, 3], '', true));
17
18        $countConstraint = new PHPUnit_Framework_Constraint_Count(0);
19        $this->assertTrue($countConstraint->evaluate([], '', true));
20
21        $countConstraint = new PHPUnit_Framework_Constraint_Count(2);
22        $it              = new TestIterator([1, 2]);
23
24        $this->assertTrue($countConstraint->evaluate($it, '', true));
25    }
26
27    public function testCountDoesNotChangeIteratorKey()
28    {
29        $countConstraint = new PHPUnit_Framework_Constraint_Count(2);
30
31        // test with 1st implementation of Iterator
32        $it = new TestIterator([1, 2]);
33
34        $countConstraint->evaluate($it, '', true);
35        $this->assertEquals(1, $it->current());
36
37        $it->next();
38        $countConstraint->evaluate($it, '', true);
39        $this->assertEquals(2, $it->current());
40
41        $it->next();
42        $countConstraint->evaluate($it, '', true);
43        $this->assertFalse($it->valid());
44
45        // test with 2nd implementation of Iterator
46        $it = new TestIterator2([1, 2]);
47
48        $countConstraint = new PHPUnit_Framework_Constraint_Count(2);
49        $countConstraint->evaluate($it, '', true);
50        $this->assertEquals(1, $it->current());
51
52        $it->next();
53        $countConstraint->evaluate($it, '', true);
54        $this->assertEquals(2, $it->current());
55
56        $it->next();
57        $countConstraint->evaluate($it, '', true);
58        $this->assertFalse($it->valid());
59    }
60
61    public function testCountGeneratorsDoNotRewind()
62    {
63        $generatorMaker = new TestGeneratorMaker();
64
65        $countConstraint = new PHPUnit_Framework_Constraint_Count(3);
66
67        $generator = $generatorMaker->create([1, 2, 3]);
68        $this->assertEquals(1, $generator->current());
69        $countConstraint->evaluate($generator, '', true);
70        $this->assertEquals(null, $generator->current());
71
72        $countConstraint = new PHPUnit_Framework_Constraint_Count(2);
73
74        $generator = $generatorMaker->create([1, 2, 3]);
75        $this->assertEquals(1, $generator->current());
76        $generator->next();
77        $this->assertEquals(2, $generator->current());
78        $countConstraint->evaluate($generator, '', true);
79        $this->assertEquals(null, $generator->current());
80
81        $countConstraint = new PHPUnit_Framework_Constraint_Count(1);
82
83        $generator = $generatorMaker->create([1, 2, 3]);
84        $this->assertEquals(1, $generator->current());
85        $generator->next();
86        $this->assertEquals(2, $generator->current());
87        $generator->next();
88        $this->assertEquals(3, $generator->current());
89        $countConstraint->evaluate($generator, '', true);
90        $this->assertEquals(null, $generator->current());
91    }
92}
93