Skip to content

Commit

Permalink
Fixed function parameter order (#42)
Browse files Browse the repository at this point in the history
* Fixed parsing for ()

* sync (#5)

* Documentation fixes (#34)

Fixing typos in and clarifying documentation.

* MathExecutor allow override default operators, functions and vars (#36)

* Added simple coc (#37)

* Added simple coc

* Fix

* Replaceable operators (#38)

* Updated from NeonXP/MathExecutor

* Fixed function in () block issue

* Fixing typos in and clarifying documentation.

* Syncing from origin (#3)

* Documentation fixes (#34)

Fixing typos in and clarifying documentation.

* MathExecutor allow override default operators, functions and vars (#36)

* Allow for operators to be replaced based on regex expression

* Fix md typo (#39)

* Updated from NeonXP/MathExecutor

* Fixed function in () block issue

* Fixing typos in and clarifying documentation.

* Syncing from origin (#3)

* Documentation fixes (#34)

Fixing typos in and clarifying documentation.

* MathExecutor allow override default operators, functions and vars (#36)

* Syncing to origin (#4)

* Documentation fixes (#34)

Fixing typos in and clarifying documentation.

* MathExecutor allow override default operators, functions and vars (#36)

* Added simple coc (#37)

* Added simple coc

* Fix

* Replaceable operators (#38)

* Updated from NeonXP/MathExecutor

* Fixed function in () block issue

* Fixing typos in and clarifying documentation.

* Syncing from origin (#3)

* Documentation fixes (#34)

Fixing typos in and clarifying documentation.

* MathExecutor allow override default operators, functions and vars (#36)

* Allow for operators to be replaced based on regex expression

* \\ instead of \

* Update README.md

Some small fixes

* Fix single quotes parsing (#41)

* Fix single quotes parsing
Fix e-mails
Some small fixes

* Mistake in test

* More PHP versions

* Update README.md

Deleted `dev` branch

* Fixed function parameter order

Corrected $places default value for addFunction to match TokenFactory
Added function order test and put expected order first in assertEquals
If else blocks in calculator
Updated docs
  • Loading branch information
phpfui authored and Alexander Kiryukhin committed Jan 12, 2019
1 parent 92445b5 commit 816c112
Show file tree
Hide file tree
Showing 5 changed files with 28 additions and 27 deletions.
9 changes: 4 additions & 5 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# MathExecutor [![Stories in Ready](https://badge.waffle.io/NeonXP/MathExecutor.png?label=ready&title=Ready)](https://waffle.io/NeonXP/MathExecutor) [![Build Status](https://travis-ci.org/NeonXP/MathExecutor.png?branch=master)](https://travis-ci.org/NeonXP/MathExecutor)

A simple math expressions calculator
# A simple and extensible math expressions calculator

## Features:
* Built in support for +, -, *, / and power (^) operators plus ()
Expand All @@ -11,7 +11,7 @@ A simple math expressions calculator
* Exceptions on divide by zero, or treat as zero
* Unary Minus (e.g. -3)
* Pi ($pi) and Euler's number ($e) support to 11 decimal places
* Easily extendable
* Easily extensible

## Install via Composer:
```
Expand Down Expand Up @@ -41,10 +41,9 @@ Default functions:

Add custom function to executor:
```php
$executor->addFunction('abs', function($arg) {
return abs($arg);
}, 1);
$executor->addFunction('abs', function($arg) {return abs($arg);});
```
Function default parameters are not supported at this time.

## Operators:
Default operators: `+ - * / ^`
Expand Down
12 changes: 4 additions & 8 deletions src/NXP/Classes/Calculator.php
Original file line number Diff line number Diff line change
Expand Up @@ -38,22 +38,18 @@ public function calculate($tokens, $variables)
foreach ($tokens as $token) {
if ($token instanceof TokenNumber) {
array_push($stack, $token);
}
if ($token instanceof TokenStringDoubleQuoted) {
} else if ($token instanceof TokenStringDoubleQuoted) {
array_push($stack, $token);
}
if ($token instanceof TokenStringSingleQuoted) {
} else if ($token instanceof TokenStringSingleQuoted) {
array_push($stack, $token);
}
if ($token instanceof TokenVariable) {
} else if ($token instanceof TokenVariable) {
$variable = $token->getValue();
if (!array_key_exists($variable, $variables)) {
throw new UnknownVariableException($variable);
}
$value = $variables[$variable];
array_push($stack, new TokenNumber($value));
}
if ($token instanceof InterfaceOperator || $token instanceof TokenFunction) {
} else if ($token instanceof InterfaceOperator || $token instanceof TokenFunction) {
array_push($stack, $token->execute($stack));
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/NXP/Classes/Token/TokenFunction.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,9 @@ public function execute(&$stack)
$args = [];
list($places, $function) = $this->value;
for ($i = 0; $i < $places; $i++) {
array_push($args, array_pop($stack)->getValue());
$args[] = array_pop($stack)->getValue();
}
$result = call_user_func_array($function, $args);
$result = call_user_func_array($function, array_reverse($args));

return new TokenNumber($result);
}
Expand Down
2 changes: 1 addition & 1 deletion src/NXP/MathExecutor.php
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ public function getOperators()
* @return MathExecutor
* @throws \ReflectionException
*/
public function addFunction($name, $function = null, $places = 1)
public function addFunction($name, $function = null, $places = null)
{
$this->tokenFactory->addFunction($name, $function, $places);

Expand Down
28 changes: 17 additions & 11 deletions tests/MathTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ public function testCalculating($expression)

/** @var float $phpResult */
eval('$phpResult = ' . $expression . ';');
$this->assertEquals($calculator->execute($expression), $phpResult, "Expression was: ${expression}");
$this->assertEquals($phpResult, $calculator->execute($expression), "Expression was: ${expression}");
}

/**
Expand Down Expand Up @@ -117,7 +117,7 @@ public function testIncorrectExpressionException()
public function testZeroDivision()
{
$calculator = new MathExecutor();
$this->assertEquals($calculator->execute('10 / 0'), 0);
$this->assertEquals(0, $calculator->execute('10 / 0'));
}

public function testZeroDivisionException()
Expand All @@ -131,29 +131,35 @@ public function testZeroDivisionException()
public function testExponentiation()
{
$calculator = new MathExecutor();
$this->assertEquals($calculator->execute('10 ^ 2'), 100);
$this->assertEquals(100, $calculator->execute('10 ^ 2'));
}

public function testFunctionParameterOrder()
{
$calculator = new MathExecutor();

$calculator->addFunction('concat', function ($arg1, $arg2) {return $arg1.$arg2;});
$this->assertEquals('testing', $calculator->execute('concat("test","ing")'));
$this->assertEquals('testing', $calculator->execute("concat('test','ing')"));
}

public function testFunction()
{
$calculator = new MathExecutor();

$calculator->addFunction('round', function ($arg) {
return round($arg);
}, 1);
$calculator->addFunction('round', function ($arg) {return round($arg);});
/** @var float $phpResult */
eval('$phpResult = round(100/30);');
$this->assertEquals($calculator->execute('round(100/30)'), $phpResult);
$this->assertEquals($phpResult, $calculator->execute('round(100/30)'));
}

public function testQuotes()
{
$calculator = new MathExecutor();
$testString = "some, long. arg; with: different-separators!";
$calculator->addFunction('test', function ($arg) use ($testString) {
$this->assertEquals($arg, $testString);
return 0;
}, 1);
$this->assertEquals($testString, $arg);
return 0;}
);
$calculator->execute('test("' . $testString . '")'); // single quotes
$calculator->execute("test('" . $testString . "')"); // double quotes
}
Expand Down

0 comments on commit 816c112

Please sign in to comment.