Skip to content

Commit 481166c

Browse files
authored
feature: added 'not in' basic rule (#19)
* feature: added 'not in' basic rule * cleanup comments * style: small code styling
1 parent 658e1d0 commit 481166c

File tree

8 files changed

+91
-1
lines changed

8 files changed

+91
-1
lines changed

src/Expression/ExpressionFactory.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ class ExpressionFactory implements ExpressionFactoryInterface
2121
Token\TokenSmaller::class => LessThanExpression::class,
2222
Token\TokenSmallerEqual::class => LessThanEqualExpression::class,
2323
Token\TokenGreaterEqual::class => GreaterThanEqualExpression::class,
24-
Token\TokenIn::class => InExpression::class
24+
Token\TokenIn::class => InExpression::class,
25+
Token\TokenNotIn::class => NotInExpression::class,
2526
];
2627

2728
public function createFromOperator(Token\BaseToken $operator): BaseExpression

src/Expression/NotInExpression.php

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?php declare(strict_types=1);
2+
3+
/**
4+
* @license http://opensource.org/licenses/mit-license.php MIT
5+
* @link https://github.com/nicoSWD
6+
* @author Nicolas Oelgart <[email protected]>
7+
*/
8+
namespace nicoSWD\Rule\Expression;
9+
10+
use nicoSWD\Rule\TokenStream\TokenCollection;
11+
use nicoSWD\Rule\Parser\Exception\ParserException;
12+
13+
final class NotInExpression extends BaseExpression
14+
{
15+
public function evaluate($leftValue, $rightValue): bool
16+
{
17+
if ($rightValue instanceof TokenCollection) {
18+
$rightValue = $rightValue->toArray();
19+
}
20+
21+
if (!is_array($rightValue)) {
22+
throw new ParserException(sprintf(
23+
'Expected array, got "%s"',
24+
gettype($rightValue)
25+
));
26+
}
27+
28+
return !in_array($leftValue, $rightValue, true);
29+
}
30+
}

src/Grammar/JavaScript/JavaScript.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public function getDefinition(): array
2222
[Token::EQUAL_STRICT, '===', 125],
2323
[Token::EQUAL, '==', 120],
2424
[Token::IN, '\bin\b', 115],
25+
[Token::NOT_IN, '\bnot in\b', 116],
2526
[Token::BOOL, '\b(?:true|false)\b', 110],
2627
[Token::NULL, '\bnull\b', 105],
2728
[Token::METHOD, '\.\s*[a-zA-Z_]\w*\s*\(', 100],

src/TokenStream/Token/Token.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ class Token
1515
const NOT_EQUAL = 'NotEqual';
1616
const EQUAL_STRICT = 'EqualStrict';
1717
const EQUAL = 'Equal';
18+
const NOT_IN = 'NotIn';
1819
const IN = 'In';
1920
const BOOL = 'Bool';
2021
const NULL = 'Null';

src/TokenStream/Token/TokenFactory.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class TokenFactory
2020
Token::NOT_EQUAL => TokenNotEqual::class,
2121
Token::EQUAL_STRICT => TokenEqualStrict::class,
2222
Token::EQUAL => TokenEqual::class,
23+
Token::NOT_IN => TokenNotIn::class,
2324
Token::IN => TokenIn::class,
2425
Token::BOOL => TokenBool::class,
2526
Token::NULL => TokenNull::class,

src/TokenStream/Token/TokenNotIn.php

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php declare(strict_types=1);
2+
3+
/**
4+
* @license http://opensource.org/licenses/mit-license.php MIT
5+
* @link https://github.com/nicoSWD
6+
* @author Nicolas Oelgart <[email protected]>
7+
*/
8+
namespace nicoSWD\Rule\TokenStream\Token;
9+
10+
final class TokenNotIn extends BaseToken
11+
{
12+
public function getType(): int
13+
{
14+
return TokenType::OPERATOR;
15+
}
16+
}

tests/integration/RuleTest.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,43 @@ public function isValidReturnsTrueOnValidSyntax(): void
6161
$this->assertEmpty($rule->getError());
6262
$this->assertTrue($rule->isTrue());
6363
}
64+
/** @test */
65+
public function basicInRule(): void
66+
{
67+
$ruleStr = '4 in [4, 6, 7]';
68+
69+
$rule = new Rule\Rule($ruleStr);
70+
71+
$this->assertTrue($rule->isValid());
72+
$this->assertEmpty($rule->getError());
73+
$this->assertTrue($rule->isTrue());
74+
75+
$ruleStr = '5 in [4, 6, 7]';
76+
77+
$rule = new Rule\Rule($ruleStr);
78+
79+
$this->assertTrue($rule->isValid());
80+
$this->assertEmpty($rule->getError());
81+
$this->assertFalse($rule->isTrue());
82+
}
83+
84+
/** @test */
85+
public function basicNotInRule(): void
86+
{
87+
$ruleStr = '5 not in [4, 6, 7]';
88+
89+
$rule = new Rule\Rule($ruleStr);
90+
91+
$this->assertTrue($rule->isValid());
92+
$this->assertEmpty($rule->getError());
93+
$this->assertTrue($rule->isTrue());
94+
95+
$ruleStr = '4 not in [4, 6, 7]';
96+
97+
$rule = new Rule\Rule($ruleStr);
98+
99+
$this->assertTrue($rule->isValid());
100+
$this->assertEmpty($rule->getError());
101+
$this->assertFalse($rule->isTrue());
102+
}
64103
}

tests/unit/Expression/ExpressionFactoryTest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public function expressionProvider(): array
4848
[Expression\LessThanEqualExpression::class, new Token\TokenSmallerEqual('<=')],
4949
[Expression\GreaterThanEqualExpression::class, new Token\TokenGreaterEqual('>=')],
5050
[Expression\InExpression::class, new Token\TokenIn('in')],
51+
[Expression\NotInExpression::class, new Token\TokenNotIn('not in')],
5152
];
5253
}
5354
}

0 commit comments

Comments
 (0)