From 9538001a42988507a29aa55eef7f59f0462665ab Mon Sep 17 00:00:00 2001 From: madman-81 <50033071+madman-81@users.noreply.github.com> Date: Thu, 4 Aug 2022 14:07:41 +0200 Subject: [PATCH] Throw an IncorrectNumberOfFunctionParametersException if a function gets more arguments than it supports (#117) * Throw an IncorrectNumberOfFunctionParametersException if a function gets more arguments than it supports * Update CustomFunction.php Code Style Co-authored-by: Bruce Wells --- src/NXP/Classes/CustomFunction.php | 10 +++++++++- tests/MathTest.php | 10 ++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/NXP/Classes/CustomFunction.php b/src/NXP/Classes/CustomFunction.php index 6e9ffc5..43c5b55 100644 --- a/src/NXP/Classes/CustomFunction.php +++ b/src/NXP/Classes/CustomFunction.php @@ -15,6 +15,8 @@ class CustomFunction */ public $function; + private bool $isVariadic; + private int $totalParamCount; private int $requiredParamCount; /** @@ -26,7 +28,10 @@ public function __construct(string $name, callable $function) { $this->name = $name; $this->function = $function; - $this->requiredParamCount = (new ReflectionFunction($function))->getNumberOfRequiredParameters(); + $reflection = (new ReflectionFunction($function)); + $this->isVariadic = $reflection->isVariadic(); + $this->totalParamCount = $reflection->getNumberOfParameters(); + $this->requiredParamCount = $reflection->getNumberOfRequiredParameters(); } @@ -40,6 +45,9 @@ public function execute(array &$stack, int $paramCountInStack) : Token if ($paramCountInStack < $this->requiredParamCount) { throw new IncorrectNumberOfFunctionParametersException($this->name); } + if ($paramCountInStack > $this->totalParamCount && ! $this->isVariadic) { + throw new IncorrectNumberOfFunctionParametersException($this->name); + } $args = []; if ($paramCountInStack > 0) { diff --git a/tests/MathTest.php b/tests/MathTest.php index 94a14d4..59ce207 100644 --- a/tests/MathTest.php +++ b/tests/MathTest.php @@ -674,6 +674,16 @@ public function testFunctionIncorrectNumberOfParameters() : void $calculator->execute('myfunc(1)'); } + public function testFunctionIncorrectNumberOfParametersTooMany() : void + { + $calculator = new MathExecutor(); + $this->expectException(IncorrectNumberOfFunctionParametersException::class); + $calculator->addFunction('myfunc', static function($arg1, $arg2) { + return $arg1 + $arg2; + }); + $calculator->execute('myfunc(1,2,3)'); + } + public function testFunctionIf() : void { $calculator = new MathExecutor();