<?php

namespace Doctrine\Tests\DBAL\Driver;

use Doctrine\DBAL\Driver\Statement;
use Doctrine\DBAL\Driver\StatementIterator;

class StatementIteratorTest extends \Doctrine\Tests\DbalTestCase
{
    public function testGettingIteratorDoesNotCallFetch()
    {
        $stmt = $this->createMock(Statement::class);
        $stmt->expects($this->never())->method('fetch');
        $stmt->expects($this->never())->method('fetchAll');
        $stmt->expects($this->never())->method('fetchColumn');

        $stmtIterator = new StatementIterator($stmt);
        $stmtIterator->getIterator();
    }

    public function testIterationCallsFetchOncePerStep()
    {
        $values = ['foo', '', 'bar', '0', 'baz', 0, 'qux', null, 'quz', false, 'impossible'];
        $calls = 0;

        $stmt = $this->createMock(Statement::class);
        $stmt->expects($this->exactly(10))
            ->method('fetch')
            ->willReturnCallback(function() use ($values, &$calls) {
                $value = $values[$calls];
                $calls++;
                return $value;
            });

        $stmtIterator = new StatementIterator($stmt);
        foreach ($stmtIterator as $i => $_) {
            $this->assertEquals($i + 1, $calls);
        }
    }
}