Skip to content

Commit

Permalink
improved operators, additional test
Browse files Browse the repository at this point in the history
  • Loading branch information
ArekX committed May 1, 2019
1 parent b50ac7d commit bafcc76
Show file tree
Hide file tree
Showing 10 changed files with 120 additions and 47 deletions.
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
vendor
.idea
coverage
untested
untested
coverage.xml
44 changes: 44 additions & 0 deletions .scrutinizer.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
build:
nodes:
coverage:
tests:
override:
- command: composer coverage-clover
coverage:
file: coverage.xml
format: clover
filter:
excluded_paths: [tests/*]
checks:
php:
code_rating: true
remove_extra_empty_lines: true
remove_php_closing_tag: true
remove_trailing_whitespace: true
fix_use_statements:
remove_unused: true
preserve_multiple: false
preserve_blanklines: true
order_alphabetically: true
fix_php_opening_tag: true
fix_linefeed: true
fix_line_ending: true
fix_identation_4spaces: true
fix_doc_comments: true
tools:
external_code_coverage:
timeout: 600
runs: 3
php_analyzer: true
php_code_coverage: false
php_code_sniffer:
config:
standard: PSR2
filter:
paths: ['src']
php_loc:
enabled: true
excluded_dirs: [vendor, tests]
php_cpd:
enabled: true
excluded_dirs: [vendor, tests]
3 changes: 2 additions & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
},
"scripts": {
"test": "php vendor/bin/phpunit",
"coverage": "php vendor/bin/phpunit --coverage-html coverage --whitelist src"
"coverage": "php vendor/bin/phpunit --coverage-html coverage --whitelist src",
"coverage-clover": "php vendor/bin/phpunit --coverage-clover coverage.xml --whitelist src"
}
}
2 changes: 1 addition & 1 deletion src/Exceptions/NotAnExpressionException.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,6 @@ class NotAnExpressionException extends \Exception
public function __construct($value)
{
$this->value = $value;
parent::__construct("Value must be a valid expression got: " . print_r($value), 0, null);
parent::__construct("Value must be a valid expression got: " . print_r($value, true), 0, null);
}
}
3 changes: 0 additions & 3 deletions src/Operators/CompareOperator.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@

namespace ArekX\ArrayExpression\Operators;

use ArekX\ArrayExpression\Exceptions\NotAnExpressionException;
use ArekX\ArrayExpression\Interfaces\Operator;
use ArekX\ArrayExpression\Interfaces\ValueParser;

Expand All @@ -27,8 +26,6 @@ class CompareOperator extends BaseOperator
const NE = '<>';
const IN = 'in';

protected $name;

/**
* Operator which will be used for comparison.
*
Expand Down
14 changes: 7 additions & 7 deletions tests/EvaluateTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public function testEvaluatorRun()
{
$i = $this->createInstance();
$result = $i->run(
['compare', 'test'],
['compare', ['get'], ['value', 'test']],
"test"
);
$this->assertTrue($result);
Expand All @@ -45,11 +45,11 @@ public function testCombinedEvaluatorRun()
$result = $i->run(
[
'and',
['compare', 'name', 'value'],
['compare', ['get', 'name'], ['value', 'value']],
[
'or',
['compare', 'name2', 'valueA'],
['compare', 'name2', 'valueB'],
['compare', ['get', 'name2'], ['value', 'valueA']],
['compare', ['get', 'name2'], ['value', 'valueB']],
],

],
Expand All @@ -68,11 +68,11 @@ public function testCombinedEvaluatorFailureRun()
$result = $i->run(
[
'and',
['compare', 'name', 'value'],
['compare', ['get', 'name'], ['value', 'value']],
[
'or',
['compare', 'name2', 'valueA'],
['compare', 'name2', 'valueB'],
['compare', ['get', 'name2'], ['value', 'valueA']],
['compare', ['get', 'name2'], ['value', 'valueB']],
],

],
Expand Down
2 changes: 2 additions & 0 deletions tests/Operators/AndOperatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@ class AndOperatorTest extends TestCase

protected $operator = AndOperatorSpy::class;



public function testAndOperatorExitsOnFirstFalseValue()
{
$operator = $this->createInstance();
Expand Down
80 changes: 50 additions & 30 deletions tests/Operators/CompareOperatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
namespace tests\Operators;


use ArekX\ArrayExpression\Exceptions\NotAnExpressionException;
use ArekX\ArrayExpression\ExpressionParser;
use ArekX\ArrayExpression\Operators\GetOperator;
use ArekX\ArrayExpression\Operators\ValueOperator;
use ArekX\ArrayExpression\ValueParsers\ArrayValueParser;
use ArekX\ArrayExpression\ValueParsers\SingleValueParser;
use tests\Mocks\MockOperator;
use tests\Spies\CompareOperatorSpy;
use tests\TestCase;
Expand All @@ -30,49 +32,65 @@ public function testParserIsSet()
$this->assertSame($parser, $i->getParser());
}

public function testNameIsTakenFromValue()
public function testValidGetName()
{
$i = $this->createInstance();
$i->configure(['compare', 'name', 'value']);
$i->configure(['compare', ['get', 'name'], ['value', 'value']]);
$this->assertEquals('compare', $i->getName());
}

public function testEquationCompare()
{
$i = $this->createInstance();
$i->configure(['compare', ['get', 'name'], ['value', 'value']]);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}

public function testErrorIfTheConfigIsNotComplete()
public function testSettingInvalidOperatorsDefersToEqOperator()
{
$i = $this->createInstance();
$i->configure(['compare', ['get', 'name'], '!!!', ['value', 'value']]);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}

public function testInvalidArgumentExceptionOnInvalidConfig()
{
$i = $this->createInstance();
$this->expectException(\InvalidArgumentException::class);
$i->configure(['compare']);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}

public function testSingleValueCompare()
public function testNotValidExpressionInFirstParam()
{
$i = $this->createInstance();
$i->configure(['compare', 'value']);
$this->assertTrue($i->evaluate(SingleValueParser::from("value")));
$this->expectException(NotAnExpressionException::class);
$i->configure(['compare', 'test', ['get']]);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}


public function test4ValuesSetAnOperator()
public function testNotValidExpressionInFirstParamFullStyle()
{
$i = $this->createInstance();
$i->configure(['compare', 'name', '<>', 'value']);
$this->assertFalse($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
$this->expectException(NotAnExpressionException::class);
$i->configure(['compare', 'test', '=', ['get']]);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}


public function testSettingInvalidOperatorsDefersToEqOperator()
public function testNotValidExpressionInSecondParam()
{
$i = $this->createInstance();
$i->configure(['compare', 'name', '!!!', 'value']);
$this->expectException(NotAnExpressionException::class);
$i->configure(['compare', ['get'], 'test']);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}


public function testUseDefaultValue()
public function testNotValidExpressionInSecondParamFullStyle()
{
$i = $this->createInstance();
$i->configure(['compare', 'unknownKey', 'value', 'default' => 'value']);
$this->expectException(NotAnExpressionException::class);
$i->configure(['compare', ['get'], '=', 'test']);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}

Expand All @@ -82,20 +100,20 @@ public function testOperators()
$value = ArrayValueParser::from(['name' => 'value', 'number' => 5]);

$maps = [
[['compare', 'name', '<>', 'value'], false],
[['compare', 'name', '<>', 'value1'], true],
[['compare', 'name', '=', 'value'], true],
[['compare', 'name', '=', 'value1'], false],
[['compare', 'number', '>', 5], false],
[['compare', 'number', '>', 4], true],
[['compare', 'number', '>=', 5], true],
[['compare', 'number', '>=', 6], false],
[['compare', 'number', '<', 6], true],
[['compare', 'number', '<', 4], false],
[['compare', 'number', '<=', 5], true],
[['compare', 'number', '<=', 4], false],
[['compare', 'number', 'in', [4,5,6]], true],
[['compare', 'number', 'in', [1,2]], false],
[['compare', ['get', 'name'], '<>', ['value', 'value']], false],
[['compare', ['get', 'name'], '<>', ['value', 'value1']], true],
[['compare', ['get', 'name'], '=', ['value', 'value']], true],
[['compare', ['get', 'name'], '=', ['value', 'value1']], false],
[['compare', ['get', 'number'], '>', ['value', 5]], false],
[['compare', ['get', 'number'], '>', ['value', 4]], true],
[['compare', ['get', 'number'], '>=', ['value', 5]], true],
[['compare', ['get', 'number'], '>=', ['value', 6]], false],
[['compare', ['get', 'number'], '<', ['value', 6]], true],
[['compare', ['get', 'number'], '<', ['value', 4]], false],
[['compare', ['get', 'number'], '<=', ['value', 5]], true],
[['compare', ['get', 'number'], '<=', ['value', 4]], false],
[['compare', ['get', 'number'], 'in', ['value', [4,5,6]]], true],
[['compare', ['get', 'number'], 'in', ['value', [1,2]]], false],
];

foreach ($maps as $map) {
Expand All @@ -108,6 +126,8 @@ protected function createInstance(): CompareOperatorSpy
{
$parser = new ExpressionParser();
$parser->setType('mock', MockOperator::class);
$parser->setType('get', GetOperator::class);
$parser->setType('value', ValueOperator::class);
$operator = new CompareOperatorSpy();
$operator->setParser($parser);

Expand Down
7 changes: 7 additions & 0 deletions tests/Operators/OperatorTestTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,13 @@ public function testSetConfig()
$this->assertEquals(['group', ['mock']], $operator->getConfig());
}

public function testValidGetName()
{
$i = $this->createInstance();
$i->configure(['group', ['get', 'name'], ['value', 'value']]);
$this->assertEquals('group', $i->getName());
}

public function testConfigMustHaveAtLeastOneSubExpression()
{
$operator = $this->createInstance();
Expand Down
9 changes: 5 additions & 4 deletions tests/Operators/RegexOperatorTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@


use ArekX\ArrayExpression\ExpressionParser;
use ArekX\ArrayExpression\Operators\GetOperator;
use ArekX\ArrayExpression\ValueParsers\ArrayValueParser;
use ArekX\ArrayExpression\ValueParsers\SingleValueParser;
use tests\Mocks\MockOperator;
use tests\Spies\CompareOperatorSpy;
use tests\Spies\RegexOperatorSpy;
use tests\TestCase;

Expand Down Expand Up @@ -43,30 +43,31 @@ public function testErrorIfTheConfigIsNotComplete()
public function testMatchesSingleValue()
{
$i = $this->createInstance();
$i->configure(['regex', '/a+/']);
$i->configure(['regex', ['get'], '/a+/']);
$this->assertTrue($i->evaluate(SingleValueParser::from("aaaaaaa")));
}


public function testChecksByByName()
{
$i = $this->createInstance();
$i->configure(['regex', 'name', '/^a+$/']);
$i->configure(['regex', ['get', 'name'], '/^a+$/']);
$this->assertFalse($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}


public function testUseDefaultValue()
{
$i = $this->createInstance();
$i->configure(['regex', 'unknownKey', '/value/', 'default' => 'value']);
$i->configure(['regex', ['get', 'name'], '/value/']);
$this->assertTrue($i->evaluate(ArrayValueParser::from(['name' => 'value'])));
}

protected function createInstance(): RegexOperatorSpy
{
$parser = new ExpressionParser();
$parser->setType('mock', MockOperator::class);
$parser->setType('get', GetOperator::class);
$operator = new RegexOperatorSpy();
$operator->setParser($parser);

Expand Down

0 comments on commit bafcc76

Please sign in to comment.