From 5a1b6f55f80c9a9fd9796609dff939ce146fd4b4 Mon Sep 17 00:00:00 2001 From: Oliver Vogel Date: Sat, 28 Dec 2024 10:52:08 +0100 Subject: [PATCH] Refactor RemoveAnimationModifier::class, Add tests --- .../Gd/Modifiers/RemoveAnimationModifier.php | 2 +- .../Modifiers/RemoveAnimationModifier.php | 2 +- src/Modifiers/RemoveAnimationModifier.php | 27 +++++++++--- .../Modifiers/RemoveAnimationModifierTest.php | 44 +++++++++++++++++++ 4 files changed, 68 insertions(+), 7 deletions(-) create mode 100644 tests/Unit/Modifiers/RemoveAnimationModifierTest.php diff --git a/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php b/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php index 6160cab4..2ef1d89a 100644 --- a/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php +++ b/src/Drivers/Gd/Modifiers/RemoveAnimationModifier.php @@ -18,7 +18,7 @@ class RemoveAnimationModifier extends GenericRemoveAnimationModifier implements public function apply(ImageInterface $image): ImageInterface { $image->core()->setNative( - $this->chosenFrame($image, $this->position)->native() + $this->selectedFrame($image)->native() ); return $image; diff --git a/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php b/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php index 787524fa..61c884c1 100644 --- a/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php +++ b/src/Drivers/Imagick/Modifiers/RemoveAnimationModifier.php @@ -15,7 +15,7 @@ class RemoveAnimationModifier extends GenericRemoveAnimationModifier implements { // create new imagick with just one image $imagick = new Imagick(); - $frame = $this->chosenFrame($image, $this->position); + $frame = $this->selectedFrame($image); $imagick->addImage($frame->native()->getImage()); // set new imagick to image diff --git a/src/Modifiers/RemoveAnimationModifier.php b/src/Modifiers/RemoveAnimationModifier.php index 15459a4f..c20983ce 100644 --- a/src/Modifiers/RemoveAnimationModifier.php +++ b/src/Modifiers/RemoveAnimationModifier.php @@ -19,13 +19,30 @@ class RemoveAnimationModifier extends SpecializableModifier /** * @throws RuntimeException */ - public function chosenFrame(ImageInterface $image, int|string $position): FrameInterface + protected function selectedFrame(ImageInterface $image): FrameInterface { - if (is_int($position)) { - return $image->core()->frame($position); + return $image->core()->frame($this->normalizePosition($image)); + } + + /** + * Return the position of the selected frame as integer + * + * @param ImageInterface $image + * @throws InputException + * @return int + */ + protected function normalizePosition(ImageInterface $image): int + { + if (is_int($this->position)) { + return $this->position; } - if (preg_match("/^(?P[0-9]{1,3})%$/", $position, $matches) != 1) { + if (is_numeric($this->position)) { + return (int) $this->position; + } + + // calculate position from percentage value + if (preg_match("/^(?P[0-9]{1,3})%$/", $this->position, $matches) != 1) { throw new InputException( 'Position must be either integer or a percent value as string.' ); @@ -35,6 +52,6 @@ class RemoveAnimationModifier extends SpecializableModifier $position = intval(round($total / 100 * intval($matches['percent']))); $position = $position == $total ? $position - 1 : $position; - return $image->core()->frame($position); + return $position; } } diff --git a/tests/Unit/Modifiers/RemoveAnimationModifierTest.php b/tests/Unit/Modifiers/RemoveAnimationModifierTest.php new file mode 100644 index 00000000..cb92e896 --- /dev/null +++ b/tests/Unit/Modifiers/RemoveAnimationModifierTest.php @@ -0,0 +1,44 @@ +makePartial(); + $image->shouldReceive('count')->andReturn($frames); + + return $this->normalizePosition($image); + } + }; + + $this->assertEquals($normalized, $modifier->testResult($frames)); + } + + public static function normalizePositionProvider(): Generator + { + yield [0, 100, 0]; + yield [10, 100, 10]; + yield ['10', 100, 10]; + yield ['0%', 100, 0]; + yield ['50%', 100, 50]; + yield ['100%', 100, 99]; + } +}