diff --git a/CHANGELOG.md b/CHANGELOG.md index 56b10c6b..72848ac6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ For a full diff see [`2.3.2...main`][2.3.2...main]. ### Changed - Extracted `Duration` ([#351]), by [@localheinz] +- Merged `MaximumDuration` into `Duration` ([#352]), by [@localheinz] ### Fixed @@ -174,5 +175,6 @@ For a full diff see [`7afa59c...1.0.0`][7afa59c...1.0.0]. [#343]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/343 [#350]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/350 [#351]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/351 +[#352]: https://github.com/ergebnis/phpunit-slow-test-detector/pull/352 [@localheinz]: https://github.com/localheinz diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 81881ebb..3c62e3e1 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -71,14 +71,14 @@ provideMillisecondsGreaterThanDefaultMaximumDuration - + - provideDurationAndFormattedDuration + provideMillisecondsSecondsAndNanoseconds - + - provideMillisecondsAndDuration + provideDurationAndFormattedDuration diff --git a/src/Duration.php b/src/Duration.php index a7460f6d..6ef6bd6d 100644 --- a/src/Duration.php +++ b/src/Duration.php @@ -50,6 +50,28 @@ public static function fromSecondsAndNanoseconds( ); } + /** + * @throws Exception\InvalidMilliseconds + */ + public static function fromMilliseconds(int $milliseconds): self + { + if (0 >= $milliseconds) { + throw Exception\InvalidMilliseconds::notGreaterThanZero($milliseconds); + } + + $seconds = \intdiv( + $milliseconds, + 1_000, + ); + + $nanoseconds = ($milliseconds - $seconds * 1_000) * 1_000_000; + + return new self( + $seconds, + $nanoseconds, + ); + } + public function seconds(): int { return $this->seconds; diff --git a/src/Extension.php b/src/Extension.php index 9e125929..6fc36fbb 100644 --- a/src/Extension.php +++ b/src/Extension.php @@ -33,10 +33,10 @@ public function bootstrap( $maximumCount = MaximumCount::fromInt((int) $parameters->get('maximum-count')); } - $maximumDuration = MaximumDuration::fromMilliseconds(500); + $maximumDuration = Duration::fromMilliseconds(500); if ($parameters->has('maximum-duration')) { - $maximumDuration = MaximumDuration::fromMilliseconds((int) $parameters->get('maximum-duration')); + $maximumDuration = Duration::fromMilliseconds((int) $parameters->get('maximum-duration')); } $collector = new Collector\DefaultCollector(); diff --git a/src/MaximumDuration.php b/src/MaximumDuration.php deleted file mode 100644 index bfd94fdf..00000000 --- a/src/MaximumDuration.php +++ /dev/null @@ -1,66 +0,0 @@ -= $seconds) { - throw Exception\InvalidSeconds::notGreaterThanZero($seconds); - } - - return new self(Duration::fromSecondsAndNanoseconds( - $seconds, - 0, - )); - } - - /** - * @throws Exception\InvalidMilliseconds - */ - public static function fromMilliseconds(int $milliseconds): self - { - if (0 >= $milliseconds) { - throw Exception\InvalidMilliseconds::notGreaterThanZero($milliseconds); - } - - $seconds = \intdiv( - $milliseconds, - 1_000, - ); - - $nanoseconds = ($milliseconds - $seconds * 1_000) * 1_000_000; - - return new self(Duration::fromSecondsAndNanoseconds( - $seconds, - $nanoseconds, - )); - } - - public function toDuration(): Duration - { - return $this->duration; - } -} diff --git a/src/Reporter/DefaultReporter.php b/src/Reporter/DefaultReporter.php index 833c3c2f..34d41e38 100644 --- a/src/Reporter/DefaultReporter.php +++ b/src/Reporter/DefaultReporter.php @@ -17,7 +17,6 @@ use Ergebnis\PHPUnit\SlowTestDetector\Duration; use Ergebnis\PHPUnit\SlowTestDetector\Formatter; use Ergebnis\PHPUnit\SlowTestDetector\MaximumCount; -use Ergebnis\PHPUnit\SlowTestDetector\MaximumDuration; use Ergebnis\PHPUnit\SlowTestDetector\SlowTest; /** @@ -29,7 +28,7 @@ final class DefaultReporter implements Reporter public function __construct( private readonly Formatter\DurationFormatter $durationFormatter, - private readonly MaximumDuration $maximumDuration, + private readonly Duration $maximumDuration, private readonly MaximumCount $maximumCount, ) { $this->durationComparator = new Comparator\DurationComparator(); @@ -105,7 +104,7 @@ static function (Duration $maximumDuration, SlowTest $slowTest): Duration { return $maximumDuration; }, - $this->maximumDuration->toDuration(), + $this->maximumDuration, ); $durationFormatter = $this->durationFormatter; diff --git a/src/Subscriber/TestPassedSubscriber.php b/src/Subscriber/TestPassedSubscriber.php index 28ad3db7..9049b39e 100644 --- a/src/Subscriber/TestPassedSubscriber.php +++ b/src/Subscriber/TestPassedSubscriber.php @@ -15,7 +15,6 @@ use Ergebnis\PHPUnit\SlowTestDetector\Collector; use Ergebnis\PHPUnit\SlowTestDetector\Duration; -use Ergebnis\PHPUnit\SlowTestDetector\MaximumDuration; use Ergebnis\PHPUnit\SlowTestDetector\SlowTest; use Ergebnis\PHPUnit\SlowTestDetector\TimeKeeper; use PHPUnit\Event; @@ -27,7 +26,7 @@ final class TestPassedSubscriber implements Event\Test\PassedSubscriber { public function __construct( - private readonly MaximumDuration $maximumDuration, + private readonly Duration $maximumDuration, private readonly TimeKeeper $timeKeeper, private readonly Collector\Collector $collector, ) { @@ -85,9 +84,9 @@ private function resolveMaximumDuration(Event\Code\Test $test): Duration continue; } - return MaximumDuration::fromMilliseconds((int) $maximumDuration)->toDuration(); + return Duration::fromMilliseconds((int) $maximumDuration); } - return $this->maximumDuration->toDuration(); + return $this->maximumDuration; } } diff --git a/test/Unit/DurationTest.php b/test/Unit/DurationTest.php index 3e760c2c..af10e7d6 100644 --- a/test/Unit/DurationTest.php +++ b/test/Unit/DurationTest.php @@ -80,6 +80,60 @@ public function testFromSecondsAndNanosecondsReturnsDuration(): void self::assertSame($nanoseconds, $duration->nanoseconds()); } + #[Framework\Attributes\DataProviderExternal(DataProvider\IntProvider::class, 'lessThanZero')] + #[Framework\Attributes\DataProviderExternal(DataProvider\IntProvider::class, 'zero')] + public function testFromMillisecondsRejectsInvalidValue(int $milliseconds): void + { + $this->expectException(Exception\InvalidMilliseconds::class); + + Duration::fromMilliseconds($milliseconds); + } + + #[Framework\Attributes\DataProvider('provideMillisecondsSecondsAndNanoseconds')] + public function testFromMillisecondsReturnsDuration( + int $milliseconds, + int $seconds, + int $nanoseconds, + ): void { + $duration = Duration::fromMilliseconds($milliseconds); + + self::assertSame($seconds, $duration->seconds()); + self::assertSame($nanoseconds, $duration->nanoseconds()); + } + + /** + * @return \Generator + */ + public static function provideMillisecondsSecondsAndNanoseconds(): \Generator + { + $values = [ + 1 => [ + 0, + 1_000_000, + ], + 999 => [ + 0, + 999_000_000, + ], + 1_000 => [ + 1, + 0, + ], + 1_234 => [ + 1, + 234_000_000, + ], + ]; + + foreach ($values as $milliseconds => [$seconds, $nanoseconds]) { + yield $milliseconds => [ + $milliseconds, + $seconds, + $nanoseconds, + ]; + } + } + public function testIsLessThanReturnsFalseWhenSecondsAreGreater(): void { $one = Duration::fromSecondsAndNanoseconds(123, 456); diff --git a/test/Unit/MaximumDurationTest.php b/test/Unit/MaximumDurationTest.php deleted file mode 100644 index 41f82a23..00000000 --- a/test/Unit/MaximumDurationTest.php +++ /dev/null @@ -1,89 +0,0 @@ -expectException(Exception\InvalidMilliseconds::class); - - MaximumDuration::fromMilliseconds($milliseconds); - } - - #[Framework\Attributes\DataProvider('provideMillisecondsAndDuration')] - public function testFromMillisecondsReturnsMaximumDuration( - int $milliseconds, - Duration $duration, - ): void { - $maximumDuration = MaximumDuration::fromMilliseconds($milliseconds); - - self::assertEquals($duration, $maximumDuration->toDuration()); - } - - /** - * @return \Generator - */ - public static function provideMillisecondsAndDuration(): \Generator - { - $values = [ - 1 => Duration::fromSecondsAndNanoseconds(0, 1_000_000), - 999 => Duration::fromSecondsAndNanoseconds(0, 999_000_000), - 1_000 => Duration::fromSecondsAndNanoseconds(1, 0), - 1_234 => Duration::fromSecondsAndNanoseconds(1, 234_000_000), - ]; - - foreach ($values as $milliseconds => $duration) { - yield $milliseconds => [ - $milliseconds, - $duration, - ]; - } - } - - #[Framework\Attributes\DataProviderExternal(DataProvider\IntProvider::class, 'lessThanZero')] - #[Framework\Attributes\DataProviderExternal(DataProvider\IntProvider::class, 'zero')] - public function testFromSecondsRejectsInvalidValue(int $seconds): void - { - $this->expectException(Exception\InvalidSeconds::class); - - MaximumDuration::fromSeconds($seconds); - } - - #[Framework\Attributes\DataProviderExternal(DataProvider\IntProvider::class, 'greaterThanZero')] - public function testFromSecondsReturnsMaximumDuration(int $seconds): void - { - $maximumDuration = MaximumDuration::fromSeconds($seconds); - - $expected = Duration::fromSecondsAndNanoseconds( - $seconds, - 0, - ); - - self::assertEquals($expected, $maximumDuration->toDuration()); - } -}