Skip to content

Commit

Permalink
Merge branch '4.0'
Browse files Browse the repository at this point in the history
  • Loading branch information
whatthejeff committed Mar 5, 2014
2 parents c1f7067 + e49cdc4 commit e25984f
Show file tree
Hide file tree
Showing 6 changed files with 170 additions and 5 deletions.
130 changes: 130 additions & 0 deletions Tests/Framework/Constraint/CountTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,130 @@
<?php
/**
* PHPUnit
*
* Copyright (c) 2001-2014, Sebastian Bergmann <[email protected]>.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* * Neither the name of Sebastian Bergmann nor the names of his
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
* CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* @package PHPUnit
* @author Sebastian Bergmann <[email protected]>
* @author Jeroen Versteeg <[email protected]>
* @copyright 2001-2014 Sebastian Bergmann <[email protected]>
* @license http://www.opensource.org/licenses/BSD-3-Clause The BSD 3-Clause License
* @link http://www.phpunit.de/
* @since File available since Release 3.7.30
*/

require_once __DIR__ . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '..' . DIRECTORY_SEPARATOR . '_files' . DIRECTORY_SEPARATOR . 'TestIterator.php';

class TestIterator2 implements Iterator {

protected $data;

public function __construct(array $array)
{
$this->data = $array;
}

public function current()
{
return current($this->data);
}

public function next()
{
next($this->data);
}

public function key()
{
return key($this->data);
}

public function valid()
{
return key($this->data) !== null;
}

public function rewind()
{
reset($this->data);
}
}

class CountTest extends PHPUnit_Framework_TestCase {

public function test_Count() {
$countConstraint = new PHPUnit_Framework_Constraint_Count(3);
$this->assertTrue($countConstraint->evaluate(array(1,2,3), '', true));

$countConstraint = new PHPUnit_Framework_Constraint_Count(0);
$this->assertTrue($countConstraint->evaluate(array(), '', true));

$countConstraint = new PHPUnit_Framework_Constraint_Count(2);
$it = new TestIterator(array(1, 2));
$this->assertTrue($countConstraint->evaluate($it, '', true));
}

public function test_CountDoesNotChangeIteratorKey ()
{
$countConstraint = new PHPUnit_Framework_Constraint_Count(2);

// test with 1st implementation of Iterator
$it = new TestIterator(array(1, 2));

$countConstraint->evaluate($it, '', true);
$this->assertEquals(1, $it->current());

$it->next();
$countConstraint->evaluate($it, '', true);
$this->assertEquals(2, $it->current());

$it->next();
$countConstraint->evaluate($it, '', true);
$this->assertFalse($it->valid());

// test with 2nd implementation of Iterator
$it = new TestIterator2(array(1, 2));

$countConstraint = new PHPUnit_Framework_Constraint_Count(2);
$countConstraint->evaluate($it, '', true);
$this->assertEquals(1, $it->current());

$it->next();
$countConstraint->evaluate($it, '', true);
$this->assertEquals(2, $it->current());

$it->next();
$countConstraint->evaluate($it, '', true);
$this->assertFalse($it->valid());
}
}
24 changes: 22 additions & 2 deletions src/Framework/Constraint/Count.php
Original file line number Diff line number Diff line change
Expand Up @@ -92,8 +92,28 @@ protected function getCountOf($other)
{
if ($other instanceof Countable || is_array($other)) {
return count($other);
} elseif ($other instanceof Traversable) {
return iterator_count($other);
}

else if ($other instanceof Traversable) {
if ($other instanceof IteratorAggregate) {
$iterator = $other->getIterator();
} else {
$iterator = $other;
}

$key = $iterator->key();
$count = iterator_count($iterator);

// manually rewind $iterator to previous key, since iterator_count
// moves pointer
if ($key !== null) {
$iterator->rewind();
while ($key !== $iterator->key()) {
$iterator->next();
}
}

return $count;
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/Util/Test.php
Original file line number Diff line number Diff line change
Expand Up @@ -66,8 +66,8 @@ class PHPUnit_Util_Test
const REGEX_DATA_PROVIDER = '/@dataProvider\s+([a-zA-Z0-9._:-\\\\x7f-\xff]+)/';
const REGEX_EXPECTED_EXCEPTION = '(@expectedException\s+([:.\w\\\\x7f-\xff]+)(?:[\t ]+(\S*))?(?:[\t ]+(\S*))?\s*$)m';
const REGEX_REQUIRES_VERSION = '/@requires\s+(?P<name>PHP(?:Unit)?)\s+(?P<value>[\d\.-]+(dev|(RC|alpha|beta)[\d\.])?)[ \t]*\r?$/m';
const REGEX_REQUIRES_OS = '/@requires\s+OS\s+(?P<value>.+)\r?$/m';
const REGEX_REQUIRES = '/@requires\s+(?P<name>function|extension)\s(?P<value>([^ ]+))\r?$/m';
const REGEX_REQUIRES_OS = '/@requires\s+OS\s+(?P<value>.+?)[ \t]*\r?$/m';
const REGEX_REQUIRES = '/@requires\s+(?P<name>function|extension)\s+(?P<value>([^ ]+?))[ \t]*\r?$/m';

const SMALL = 0;
const MEDIUM = 1;
Expand Down
7 changes: 7 additions & 0 deletions tests/Util/TestTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -140,6 +140,13 @@ public function provideRequirements()
array('testNine', array('functions' => array('testFunc'))),
array('testTen', array('extensions' => array('testExt'))),
array('testEleven', array('OS' => '/Linux/i')),
array(
'testSpace',
array(
'extensions' => array('spl'),
'OS' => '/.*/i'
)
),
array(
'testAllPossibleRequirements',
array(
Expand Down
8 changes: 8 additions & 0 deletions tests/_files/RequirementsTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,12 @@ public function testAlwaysSkip2()
public function testAlwaysSkip3()
{
}

/**
* @requires extension spl
* @requires OS .*
*/
public function testSpace()
{
}
}
2 changes: 1 addition & 1 deletion tests/_files/TestIterator.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
class TestIterator implements Iterator
{
protected $array;
protected $position;
protected $position = 0;

public function __construct($array = array())
{
Expand Down

0 comments on commit e25984f

Please sign in to comment.