Skip to content

Commit c2597c0

Browse files
committed
Merge remote-tracking branch 'origin/0.6.x' into sql-platform-refactor
2 parents 38cc1c8 + 0c68dac commit c2597c0

File tree

2 files changed

+73
-3
lines changed

2 files changed

+73
-3
lines changed

src/Adapter/Driver/Pdo/Result.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class Result implements Iterator, ResultInterface
8181
/** @var string|int|false|null */
8282
protected $generatedValue;
8383

84-
protected Closure|int $rowCount;
84+
protected Closure|int|null $rowCount = null;
8585

8686
/**
8787
* Initialize
@@ -91,7 +91,7 @@ class Result implements Iterator, ResultInterface
9191
public function initialize(
9292
PDOStatement $resource,
9393
$generatedValue,
94-
Closure|int $rowCount = 0
94+
Closure|int|null $rowCount = null
9595
): ResultInterface&Result {
9696
$this->resource = $resource;
9797
$this->generatedValue = $generatedValue;
@@ -250,7 +250,6 @@ public function count()
250250
if (is_int($this->rowCount)) {
251251
return $this->rowCount;
252252
}
253-
/** @phpstan-ignore instanceof.alwaysTrue */
254253
if ($this->rowCount instanceof Closure) {
255254
$this->rowCount = (int) ($this->rowCount)();
256255
} else {

test/unit/Adapter/Driver/Pdo/ResultTest.php

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
use function uniqid;
1818

1919
#[CoversMethod(Result::class, 'current')]
20+
#[CoversMethod(Result::class, 'count')]
2021
#[Group('result-pdo')]
2122
final class ResultTest extends TestCase
2223
{
@@ -108,4 +109,74 @@ public function testMultipleRewind(): void
108109
$this->assertEquals(2, $position);
109110
$this->assertEquals($data[1], $result->current());
110111
}
112+
113+
public function testCountWithNoRowCountFallsBackToStatementRowCount(): void
114+
{
115+
$stub = $this->getMockBuilder(PDOStatement::class)->getMock();
116+
$stub->expects($this->once())
117+
->method('rowCount')
118+
->willReturn(5);
119+
120+
$result = new Result();
121+
$result->initialize($stub, null);
122+
123+
self::assertSame(5, $result->count());
124+
}
125+
126+
public function testCountWithClosureInvokesClosureAndReturnsValue(): void
127+
{
128+
$stub = $this->getMockBuilder(PDOStatement::class)->getMock();
129+
$stub->expects($this->never())->method('rowCount');
130+
131+
$rowCount = static fn(): int => 42;
132+
133+
$result = new Result();
134+
$result->initialize($stub, null, $rowCount);
135+
136+
self::assertSame(42, $result->count());
137+
}
138+
139+
public function testCountWithIntReturnsProvidedValue(): void
140+
{
141+
$stub = $this->getMockBuilder(PDOStatement::class)->getMock();
142+
$stub->expects($this->never())->method('rowCount');
143+
144+
$result = new Result();
145+
$result->initialize($stub, null, 10);
146+
147+
self::assertSame(10, $result->count());
148+
}
149+
150+
public function testCountCachesResultFromClosure(): void
151+
{
152+
$callCount = 0;
153+
$rowCount = static function () use (&$callCount): int {
154+
$callCount++;
155+
return 7;
156+
};
157+
158+
$stub = $this->getMockBuilder(PDOStatement::class)->getMock();
159+
160+
$result = new Result();
161+
$result->initialize($stub, null, $rowCount);
162+
163+
$result->count();
164+
$result->count();
165+
166+
self::assertSame(1, $callCount);
167+
}
168+
169+
public function testCountCachesResultFromStatementRowCount(): void
170+
{
171+
$stub = $this->getMockBuilder(PDOStatement::class)->getMock();
172+
$stub->expects($this->once())->method('rowCount')->willReturn(3);
173+
174+
$result = new Result();
175+
$result->initialize($stub, null);
176+
177+
$result->count();
178+
$result->count();
179+
180+
self::assertSame(3, $result->count());
181+
}
111182
}

0 commit comments

Comments
 (0)