Skip to content

Commit 070e1f8

Browse files
authored
Merge pull request #352 from ergebnis/feature/merge
Enhancement: Merge `MaximumDuration` into `Duration`
2 parents 3cbb31d + fafb632 commit 070e1f8

9 files changed

+89
-168
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ For a full diff see [`2.3.2...main`][2.3.2...main].
1111
### Changed
1212

1313
- Extracted `Duration` ([#351]), by [@localheinz]
14+
- Merged `MaximumDuration` into `Duration` ([#352]), by [@localheinz]
1415

1516
### Fixed
1617

@@ -174,5 +175,6 @@ For a full diff see [`7afa59c...1.0.0`][7afa59c...1.0.0].
174175
[#343]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/343
175176
[#350]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/350
176177
[#351]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/351
178+
[#352]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/352
177179

178180
[@localheinz]: https://github.com/localheinz

psalm-baseline.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -71,14 +71,14 @@
7171
<code>provideMillisecondsGreaterThanDefaultMaximumDuration</code>
7272
</PossiblyUnusedMethod>
7373
</file>
74-
<file src="test/Unit/Formatter/DefaultDurationFormatterTest.php">
74+
<file src="test/Unit/DurationTest.php">
7575
<PossiblyUnusedMethod>
76-
<code>provideDurationAndFormattedDuration</code>
76+
<code>provideMillisecondsSecondsAndNanoseconds</code>
7777
</PossiblyUnusedMethod>
7878
</file>
79-
<file src="test/Unit/MaximumDurationTest.php">
79+
<file src="test/Unit/Formatter/DefaultDurationFormatterTest.php">
8080
<PossiblyUnusedMethod>
81-
<code>provideMillisecondsAndDuration</code>
81+
<code>provideDurationAndFormattedDuration</code>
8282
</PossiblyUnusedMethod>
8383
</file>
8484
</files>

src/Duration.php

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,28 @@ public static function fromSecondsAndNanoseconds(
5050
);
5151
}
5252

53+
/**
54+
* @throws Exception\InvalidMilliseconds
55+
*/
56+
public static function fromMilliseconds(int $milliseconds): self
57+
{
58+
if (0 >= $milliseconds) {
59+
throw Exception\InvalidMilliseconds::notGreaterThanZero($milliseconds);
60+
}
61+
62+
$seconds = \intdiv(
63+
$milliseconds,
64+
1_000,
65+
);
66+
67+
$nanoseconds = ($milliseconds - $seconds * 1_000) * 1_000_000;
68+
69+
return new self(
70+
$seconds,
71+
$nanoseconds,
72+
);
73+
}
74+
5375
public function seconds(): int
5476
{
5577
return $this->seconds;

src/Extension.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,10 +33,10 @@ public function bootstrap(
3333
$maximumCount = MaximumCount::fromInt((int) $parameters->get('maximum-count'));
3434
}
3535

36-
$maximumDuration = MaximumDuration::fromMilliseconds(500);
36+
$maximumDuration = Duration::fromMilliseconds(500);
3737

3838
if ($parameters->has('maximum-duration')) {
39-
$maximumDuration = MaximumDuration::fromMilliseconds((int) $parameters->get('maximum-duration'));
39+
$maximumDuration = Duration::fromMilliseconds((int) $parameters->get('maximum-duration'));
4040
}
4141

4242
$collector = new Collector\DefaultCollector();

src/MaximumDuration.php

Lines changed: 0 additions & 66 deletions
This file was deleted.

src/Reporter/DefaultReporter.php

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
use Ergebnis\PHPUnit\SlowTestDetector\Duration;
1818
use Ergebnis\PHPUnit\SlowTestDetector\Formatter;
1919
use Ergebnis\PHPUnit\SlowTestDetector\MaximumCount;
20-
use Ergebnis\PHPUnit\SlowTestDetector\MaximumDuration;
2120
use Ergebnis\PHPUnit\SlowTestDetector\SlowTest;
2221

2322
/**
@@ -29,7 +28,7 @@ final class DefaultReporter implements Reporter
2928

3029
public function __construct(
3130
private readonly Formatter\DurationFormatter $durationFormatter,
32-
private readonly MaximumDuration $maximumDuration,
31+
private readonly Duration $maximumDuration,
3332
private readonly MaximumCount $maximumCount,
3433
) {
3534
$this->durationComparator = new Comparator\DurationComparator();
@@ -105,7 +104,7 @@ static function (Duration $maximumDuration, SlowTest $slowTest): Duration {
105104

106105
return $maximumDuration;
107106
},
108-
$this->maximumDuration->toDuration(),
107+
$this->maximumDuration,
109108
);
110109

111110
$durationFormatter = $this->durationFormatter;

src/Subscriber/TestPassedSubscriber.php

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515

1616
use Ergebnis\PHPUnit\SlowTestDetector\Collector;
1717
use Ergebnis\PHPUnit\SlowTestDetector\Duration;
18-
use Ergebnis\PHPUnit\SlowTestDetector\MaximumDuration;
1918
use Ergebnis\PHPUnit\SlowTestDetector\SlowTest;
2019
use Ergebnis\PHPUnit\SlowTestDetector\TimeKeeper;
2120
use PHPUnit\Event;
@@ -27,7 +26,7 @@
2726
final class TestPassedSubscriber implements Event\Test\PassedSubscriber
2827
{
2928
public function __construct(
30-
private readonly MaximumDuration $maximumDuration,
29+
private readonly Duration $maximumDuration,
3130
private readonly TimeKeeper $timeKeeper,
3231
private readonly Collector\Collector $collector,
3332
) {
@@ -85,9 +84,9 @@ private function resolveMaximumDuration(Event\Code\Test $test): Duration
8584
continue;
8685
}
8786

88-
return MaximumDuration::fromMilliseconds((int) $maximumDuration)->toDuration();
87+
return Duration::fromMilliseconds((int) $maximumDuration);
8988
}
9089

91-
return $this->maximumDuration->toDuration();
90+
return $this->maximumDuration;
9291
}
9392
}

test/Unit/DurationTest.php

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,60 @@ public function testFromSecondsAndNanosecondsReturnsDuration(): void
8080
self::assertSame($nanoseconds, $duration->nanoseconds());
8181
}
8282

83+
#[Framework\Attributes\DataProviderExternal(DataProvider\IntProvider::class, 'lessThanZero')]
84+
#[Framework\Attributes\DataProviderExternal(DataProvider\IntProvider::class, 'zero')]
85+
public function testFromMillisecondsRejectsInvalidValue(int $milliseconds): void
86+
{
87+
$this->expectException(Exception\InvalidMilliseconds::class);
88+
89+
Duration::fromMilliseconds($milliseconds);
90+
}
91+
92+
#[Framework\Attributes\DataProvider('provideMillisecondsSecondsAndNanoseconds')]
93+
public function testFromMillisecondsReturnsDuration(
94+
int $milliseconds,
95+
int $seconds,
96+
int $nanoseconds,
97+
): void {
98+
$duration = Duration::fromMilliseconds($milliseconds);
99+
100+
self::assertSame($seconds, $duration->seconds());
101+
self::assertSame($nanoseconds, $duration->nanoseconds());
102+
}
103+
104+
/**
105+
* @return \Generator<int, array{0: int, 1: int, 2: int}>
106+
*/
107+
public static function provideMillisecondsSecondsAndNanoseconds(): \Generator
108+
{
109+
$values = [
110+
1 => [
111+
0,
112+
1_000_000,
113+
],
114+
999 => [
115+
0,
116+
999_000_000,
117+
],
118+
1_000 => [
119+
1,
120+
0,
121+
],
122+
1_234 => [
123+
1,
124+
234_000_000,
125+
],
126+
];
127+
128+
foreach ($values as $milliseconds => [$seconds, $nanoseconds]) {
129+
yield $milliseconds => [
130+
$milliseconds,
131+
$seconds,
132+
$nanoseconds,
133+
];
134+
}
135+
}
136+
83137
public function testIsLessThanReturnsFalseWhenSecondsAreGreater(): void
84138
{
85139
$one = Duration::fromSecondsAndNanoseconds(123, 456);

test/Unit/MaximumDurationTest.php

Lines changed: 0 additions & 89 deletions
This file was deleted.

0 commit comments

Comments
 (0)