Skip to content

Commit b08645f

Browse files
authored
Merge pull request #662 from ergebnis/feature/extract
Enhancement: Extract `TestDuration` and `MaximumDuration`
2 parents d874fcb + 9459516 commit b08645f

File tree

13 files changed

+332
-135
lines changed

13 files changed

+332
-135
lines changed

phpstan-baseline.neon

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,16 @@ parameters:
265265
count: 1
266266
path: test/Unit/Formatter/DefaultDurationFormatterTest.php
267267

268+
-
269+
message: "#^Method Ergebnis\\\\PHPUnit\\\\SlowTestDetector\\\\Test\\\\Unit\\\\MaximumDurationTest\\:\\:testDefaultReturnsMaximumDuration\\(\\) has no return type specified\\.$#"
270+
count: 1
271+
path: test/Unit/MaximumDurationTest.php
272+
273+
-
274+
message: "#^Method Ergebnis\\\\PHPUnit\\\\SlowTestDetector\\\\Test\\\\Unit\\\\MaximumDurationTest\\:\\:testFromDurationReturnsMaximumDuration\\(\\) has no return type specified\\.$#"
275+
count: 1
276+
path: test/Unit/MaximumDurationTest.php
277+
268278
-
269279
message: "#^Method Ergebnis\\\\PHPUnit\\\\SlowTestDetector\\\\Test\\\\Unit\\\\PhaseIdentifierTest\\:\\:testFromStringRejectsInvalidValue\\(\\) has no return type specified\\.$#"
270280
count: 1
@@ -310,6 +320,11 @@ parameters:
310320
count: 1
311321
path: test/Unit/TestDescriptionTest.php
312322

323+
-
324+
message: "#^Method Ergebnis\\\\PHPUnit\\\\SlowTestDetector\\\\Test\\\\Unit\\\\TestDurationTest\\:\\:testFromDurationReturnsTestDuration\\(\\) has no return type specified\\.$#"
325+
count: 1
326+
path: test/Unit/TestDurationTest.php
327+
313328
-
314329
message: "#^Method Ergebnis\\\\PHPUnit\\\\SlowTestDetector\\\\Test\\\\Unit\\\\TestIdentifierTest\\:\\:testFromStringRejectsInvalidValue\\(\\) has no return type specified\\.$#"
315330
count: 1

src/Collector/DefaultCollector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public function collectSlowTest(SlowTest $slowTest)
3232
if (\array_key_exists($key, $this->slowTests)) {
3333
$previousSlowTest = $this->slowTests[$key];
3434

35-
if (!$slowTest->duration()->isGreaterThan($previousSlowTest->duration())) {
35+
if (!$slowTest->testDuration()->toDuration()->isGreaterThan($previousSlowTest->testDuration()->toDuration())) {
3636
return;
3737
}
3838

src/Extension.php

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ final class Extension implements Framework\TestListener
3737
private $suites = 0;
3838

3939
/**
40-
* @var Duration
40+
* @var MaximumDuration
4141
*/
4242
private $maximumDuration;
4343

@@ -59,10 +59,10 @@ public function __construct(array $options = [])
5959
$maximumCount = Count::fromInt((int) $options['maximum-count']);
6060
}
6161

62-
$maximumDuration = Duration::fromMilliseconds(500);
62+
$maximumDuration = MaximumDuration::default();
6363

6464
if (\array_key_exists('maximum-duration', $options)) {
65-
$maximumDuration = Duration::fromMilliseconds((int) $options['maximum-duration']);
65+
$maximumDuration = MaximumDuration::fromDuration(Duration::fromMilliseconds((int) $options['maximum-duration']));
6666
}
6767

6868
$this->maximumDuration = $maximumDuration;
@@ -159,14 +159,14 @@ public function endTest(
159159
$seconds = (int) \floor($time);
160160
$nanoseconds = (int) (($time - $seconds) * 1000000000);
161161

162-
$duration = Duration::fromSecondsAndNanoseconds(
162+
$testDuration = TestDuration::fromDuration(Duration::fromSecondsAndNanoseconds(
163163
$seconds,
164164
$nanoseconds
165-
);
165+
));
166166

167167
$maximumDuration = $this->resolveMaximumDuration($test);
168168

169-
if (!$duration->isGreaterThan($maximumDuration)) {
169+
if (!$testDuration->toDuration()->isGreaterThan($maximumDuration->toDuration())) {
170170
return;
171171
}
172172

@@ -181,14 +181,14 @@ public function endTest(
181181
\get_class($test),
182182
$test->getName()
183183
)),
184-
$duration,
184+
$testDuration,
185185
$maximumDuration
186186
);
187187

188188
$this->collector->collectSlowTest($slowTest);
189189
}
190190

191-
private function resolveMaximumDuration(Framework\Test $test): Duration
191+
private function resolveMaximumDuration(Framework\Test $test): MaximumDuration
192192
{
193193
$annotations = [
194194
'maximumDuration',
@@ -219,7 +219,7 @@ private function resolveMaximumDuration(Framework\Test $test): Duration
219219
continue;
220220
}
221221

222-
return Duration::fromMilliseconds((int) $maximumDuration);
222+
return MaximumDuration::fromDuration(Duration::fromMilliseconds((int) $maximumDuration));
223223
}
224224

225225
return $this->maximumDuration;
@@ -267,10 +267,10 @@ public function __construct(array $options = [])
267267
$maximumCount = Count::fromInt((int) $options['maximum-count']);
268268
}
269269

270-
$maximumDuration = Duration::fromMilliseconds(500);
270+
$maximumDuration = MaximumDuration::default();
271271

272272
if (\array_key_exists('maximum-duration', $options)) {
273-
$maximumDuration = Duration::fromMilliseconds((int) $options['maximum-duration']);
273+
$maximumDuration = MaximumDuration::fromDuration(Duration::fromMilliseconds((int) $options['maximum-duration']));
274274
}
275275

276276
$this->maximumDuration = $maximumDuration;
@@ -306,21 +306,21 @@ public function executeAfterTest(
306306
$seconds = (int) \floor($time);
307307
$nanoseconds = (int) (($time - $seconds) * 1000000000);
308308

309-
$duration = Duration::fromSecondsAndNanoseconds(
309+
$testDuration = TestDuration::fromDuration(Duration::fromSecondsAndNanoseconds(
310310
$seconds,
311311
$nanoseconds
312-
);
312+
));
313313

314314
$maximumDuration = $this->resolveMaximumDuration($test);
315315

316-
if (!$duration->isGreaterThan($maximumDuration)) {
316+
if (!$testDuration->toDuration()->isGreaterThan($maximumDuration->toDuration())) {
317317
return;
318318
}
319319

320320
$slowTest = SlowTest::create(
321321
TestIdentifier::fromString($test),
322322
TestDescription::fromString($test),
323-
$duration,
323+
$testDuration,
324324
$maximumDuration
325325
);
326326

@@ -354,7 +354,7 @@ public function executeAfterLastTest(): void
354354
TXT;
355355
}
356356

357-
private function resolveMaximumDuration(string $test): Duration
357+
private function resolveMaximumDuration(string $test): MaximumDuration
358358
{
359359
list($testClassName, $testMethodName) = \explode(
360360
'::',
@@ -390,7 +390,7 @@ private function resolveMaximumDuration(string $test): Duration
390390
continue;
391391
}
392392

393-
return Duration::fromMilliseconds((int) $maximumDuration);
393+
return MaximumDuration::fromDuration(Duration::fromMilliseconds((int) $maximumDuration));
394394
}
395395

396396
return $this->maximumDuration;
@@ -421,10 +421,10 @@ public function bootstrap(
421421
$maximumCount = Count::fromInt((int) $parameters->get('maximum-count'));
422422
}
423423

424-
$maximumDuration = Duration::fromMilliseconds(500);
424+
$maximumDuration = MaximumDuration::default();
425425

426426
if ($parameters->has('maximum-duration')) {
427-
$maximumDuration = Duration::fromMilliseconds((int) $parameters->get('maximum-duration'));
427+
$maximumDuration = MaximumDuration::fromDuration(Duration::fromMilliseconds((int) $parameters->get('maximum-duration')));
428428
}
429429

430430
$timeKeeper = new TimeKeeper();

src/MaximumDuration.php

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* Copyright (c) 2021-2025 Andreas Möller
7+
*
8+
* For the full copyright and license information, please view
9+
* the LICENSE.md file that was distributed with this source code.
10+
*
11+
* @see https://github.com/ergebnis/phpunit-slow-test-detector
12+
*/
13+
14+
namespace Ergebnis\PHPUnit\SlowTestDetector;
15+
16+
/**
17+
* @internal
18+
*/
19+
final class MaximumDuration
20+
{
21+
private $duration;
22+
23+
private function __construct(Duration $duration)
24+
{
25+
$this->duration = $duration;
26+
}
27+
28+
public static function fromDuration(Duration $duration): self
29+
{
30+
return new self($duration);
31+
}
32+
33+
public static function default(): self
34+
{
35+
return new self(Duration::fromMilliseconds(500));
36+
}
37+
38+
public function toDuration(): Duration
39+
{
40+
return $this->duration;
41+
}
42+
}

src/Reporter/DefaultReporter.php

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@
1515

1616
use Ergebnis\PHPUnit\SlowTestDetector\Comparator;
1717
use Ergebnis\PHPUnit\SlowTestDetector\Count;
18-
use Ergebnis\PHPUnit\SlowTestDetector\Duration;
1918
use Ergebnis\PHPUnit\SlowTestDetector\Formatter;
19+
use Ergebnis\PHPUnit\SlowTestDetector\MaximumDuration;
2020
use Ergebnis\PHPUnit\SlowTestDetector\SlowTest;
2121

2222
/**
@@ -30,7 +30,7 @@ final class DefaultReporter implements Reporter
3030
private $durationFormatter;
3131

3232
/**
33-
* @var Duration
33+
* @var MaximumDuration
3434
*/
3535
private $maximumDuration;
3636

@@ -46,7 +46,7 @@ final class DefaultReporter implements Reporter
4646

4747
public function __construct(
4848
Formatter\DurationFormatter $durationFormatter,
49-
Duration $maximumDuration,
49+
MaximumDuration $maximumDuration,
5050
Count $maximumCount
5151
) {
5252
$this->durationFormatter = $durationFormatter;
@@ -102,8 +102,8 @@ private function list(SlowTest ...$slowTests): string
102102

103103
\usort($slowTests, static function (SlowTest $one, SlowTest $two) use ($durationComparator): int {
104104
return $durationComparator->compare(
105-
$two->duration(),
106-
$one->duration()
105+
$two->testDuration()->toDuration(),
106+
$one->testDuration()->toDuration()
107107
);
108108
});
109109

@@ -113,13 +113,13 @@ private function list(SlowTest ...$slowTests): string
113113
$this->maximumCount->toInt()
114114
);
115115

116-
/** @var SlowTest $slowTestWithLongestDuration */
117-
$slowTestWithLongestDuration = \reset($slowTestsToReport);
116+
/** @var SlowTest $slowTestWithLongestTestDuration */
117+
$slowTestWithLongestTestDuration = \reset($slowTestsToReport);
118118

119119
$longestMaximumDuration = \array_reduce(
120120
$slowTestsToReport,
121-
static function (Duration $maximumDuration, SlowTest $slowTest): Duration {
122-
if ($maximumDuration->isLessThan($slowTest->maximumDuration())) {
121+
static function (MaximumDuration $maximumDuration, SlowTest $slowTest): MaximumDuration {
122+
if ($maximumDuration->toDuration()->isLessThan($slowTest->maximumDuration()->toDuration())) {
123123
return $slowTest->maximumDuration();
124124
}
125125

@@ -131,8 +131,8 @@ static function (Duration $maximumDuration, SlowTest $slowTest): Duration {
131131
$durationFormatter = $this->durationFormatter;
132132

133133
$numberWidth = \strlen((string) \count($slowTestsToReport));
134-
$durationWidth = \strlen($durationFormatter->format($slowTestWithLongestDuration->duration()));
135-
$maximumDurationWidth = \strlen($durationFormatter->format($longestMaximumDuration));
134+
$durationWidth = \strlen($durationFormatter->format($slowTestWithLongestTestDuration->testDuration()->toDuration()));
135+
$maximumDurationWidth = \strlen($durationFormatter->format($longestMaximumDuration->toDuration()));
136136

137137
$items = \array_map(static function (int $number, SlowTest $slowTest) use ($numberWidth, $durationFormatter, $durationWidth, $maximumDurationWidth): string {
138138
$formattedNumber = \str_pad(
@@ -143,7 +143,7 @@ static function (Duration $maximumDuration, SlowTest $slowTest): Duration {
143143
);
144144

145145
$formattedDuration = \str_pad(
146-
$durationFormatter->format($slowTest->duration()),
146+
$durationFormatter->format($slowTest->testDuration()->toDuration()),
147147
$durationWidth,
148148
' ',
149149
\STR_PAD_LEFT
@@ -152,7 +152,7 @@ static function (Duration $maximumDuration, SlowTest $slowTest): Duration {
152152
$formattedMaximumDuration = \sprintf(
153153
'(%s)',
154154
\str_pad(
155-
$durationFormatter->format($slowTest->maximumDuration()),
155+
$durationFormatter->format($slowTest->maximumDuration()->toDuration()),
156156
$maximumDurationWidth,
157157
' ',
158158
\STR_PAD_LEFT

src/SlowTest.php

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -29,37 +29,37 @@ final class SlowTest
2929
private $testDescription;
3030

3131
/**
32-
* @var Duration
32+
* @var TestDuration
3333
*/
34-
private $duration;
34+
private $testDuration;
3535

3636
/**
37-
* @var Duration
37+
* @var MaximumDuration
3838
*/
3939
private $maximumDuration;
4040

4141
private function __construct(
4242
TestIdentifier $testIdentifier,
4343
TestDescription $testDescription,
44-
Duration $duration,
45-
Duration $maximumDuration
44+
TestDuration $testDuration,
45+
MaximumDuration $maximumDuration
4646
) {
4747
$this->testIdentifier = $testIdentifier;
4848
$this->testDescription = $testDescription;
49-
$this->duration = $duration;
49+
$this->testDuration = $testDuration;
5050
$this->maximumDuration = $maximumDuration;
5151
}
5252

5353
public static function create(
5454
TestIdentifier $testIdentifier,
5555
TestDescription $testDescription,
56-
Duration $duration,
57-
Duration $maximumDuration
56+
TestDuration $testDuration,
57+
MaximumDuration $maximumDuration
5858
): self {
5959
return new self(
6060
$testIdentifier,
6161
$testDescription,
62-
$duration,
62+
$testDuration,
6363
$maximumDuration
6464
);
6565
}
@@ -74,12 +74,12 @@ public function testDescription(): TestDescription
7474
return $this->testDescription;
7575
}
7676

77-
public function duration(): Duration
77+
public function testDuration(): TestDuration
7878
{
79-
return $this->duration;
79+
return $this->testDuration;
8080
}
8181

82-
public function maximumDuration(): Duration
82+
public function maximumDuration(): MaximumDuration
8383
{
8484
return $this->maximumDuration;
8585
}

0 commit comments

Comments
 (0)