Skip to content

Commit

Permalink
Add settings to TrueValue mutator and disabling mutating "true" -> "f…
Browse files Browse the repository at this point in the history
…alse" in in_array and array_search functions.

Add json schema validation for TrueValue mutator in infection.json
  • Loading branch information
maks-rafalko committed Jan 5, 2019
1 parent 7894cf5 commit 2382469
Show file tree
Hide file tree
Showing 86 changed files with 438 additions and 101 deletions.
28 changes: 27 additions & 1 deletion resources/schema.json
Expand Up @@ -90,7 +90,33 @@
},
"mutators": {
"type": "object",
"description": "Contains the settings for different mutations and profiles"
"description": "Contains the settings for different mutations and profiles",
"properties": {
"TrueValue": {
"type": {
"anyOf": [
{
"type": "boolean"
},
{
"type": "object",
"additionalProperties": false,
"properties": {
"ignore": {"type": "array", "items": {"type": "string"}},
"settings": {
"type": "object",
"additionalProperties": false,
"properties": {
"in_array": {"type": "boolean"},
"array_search": {"type": "boolean"}
}
}
}
}
]
}
}
}
},
"testFramework": {
"type": "string",
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Assignment.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\Assign($node->var, $node->expr, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\AssignOp;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/AssignmentEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\Assign($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Equal && $node->left instanceof Node\Expr\Variable;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/BitwiseAnd.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\BitwiseOr($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\BitwiseAnd;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/BitwiseNot.php
Expand Up @@ -51,7 +51,7 @@ public function mutate(Node $node)
return $node->expr;
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BitwiseNot;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/BitwiseOr.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\BitwiseAnd($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\BitwiseOr;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/BitwiseXor.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\BitwiseAnd($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\BitwiseXor;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Decrement.php
Expand Up @@ -64,7 +64,7 @@ public function mutate(Node $node)
}
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof PreDec || $node instanceof PostDec;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/DivEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\AssignOp\Mul($node->var, $node->expr, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\AssignOp\Div;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Division.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Mul($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Div;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Exponentiation.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Div($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Pow;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Increment.php
Expand Up @@ -64,7 +64,7 @@ public function mutate(Node $node)
}
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof PreInc || $node instanceof PostInc;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Minus.php
Expand Up @@ -53,7 +53,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Plus($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Minus;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/MinusEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\AssignOp\Plus($node->var, $node->expr, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\AssignOp\Minus;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/ModEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\AssignOp\Mul($node->var, $node->expr, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\AssignOp\Mod;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Modulus.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Mul($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Mod;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/MulEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\AssignOp\Div($node->var, $node->expr, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\AssignOp\Mul;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Multiplication.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Div($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Mul;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/Plus.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Minus($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
if (!($node instanceof Node\Expr\BinaryOp\Plus)) {
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/PlusEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\AssignOp\Minus($node->var, $node->expr, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\AssignOp\Plus;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/PowEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\AssignOp\Div($node->var, $node->expr, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\AssignOp\Pow;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/RoundingFamily.php
Expand Up @@ -74,7 +74,7 @@ public function mutate(Node $node)
}
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
if (!$node instanceof Node\Expr\FuncCall) {
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/ShiftLeft.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\ShiftRight($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\ShiftLeft;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Arithmetic/ShiftRight.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\ShiftLeft($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\ShiftRight;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/ArrayItem.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Greater($node->key, $node->value, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\ArrayItem && $node->key && ($this->isNodeWithSideEffects($node->value) || $this->isNodeWithSideEffects($node->key));
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/EqualIdentical.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Identical($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Equal;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/FalseValue.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\ConstFetch(new Node\Name('true'));
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
if (!($node instanceof Node\Expr\ConstFetch)) {
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/IdenticalEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\Equal($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\Identical;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/LogicalAnd.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\BooleanOr($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\BooleanAnd;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/LogicalLowerAnd.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\LogicalOr($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\LogicalAnd;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/LogicalLowerOr.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\LogicalAnd($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\LogicalOr;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/LogicalNot.php
Expand Up @@ -51,7 +51,7 @@ public function mutate(Node $node)
return $node->expr;
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
if (!($node instanceof Node\Expr\BooleanNot)) {
return false;
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/LogicalOr.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\BooleanAnd($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\BooleanOr;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/NotEqualNotIdentical.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\NotIdentical($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\NotEqual;
}
Expand Down
2 changes: 1 addition & 1 deletion src/Mutator/Boolean/NotIdenticalNotEqual.php
Expand Up @@ -54,7 +54,7 @@ public function mutate(Node $node)
return new Node\Expr\BinaryOp\NotEqual($node->left, $node->right, $node->getAttributes());
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
return $node instanceof Node\Expr\BinaryOp\NotIdentical;
}
Expand Down
27 changes: 25 additions & 2 deletions src/Mutator/Boolean/TrueValue.php
Expand Up @@ -36,13 +36,19 @@
namespace Infection\Mutator\Boolean;

use Infection\Mutator\Util\Mutator;
use Infection\Visitor\ParentConnectorVisitor;
use PhpParser\Node;

/**
* @internal
*/
final class TrueValue extends Mutator
{
private const DEFAULT_SETTINGS = [
'in_array' => false,
'array_search' => false,
];

/**
* Replaces "true" with "false"
*
Expand All @@ -54,12 +60,29 @@ public function mutate(Node $node)
return new Node\Expr\ConstFetch(new Node\Name('false'));
}

protected function mutatesNode(Node $node): bool
protected function mutatesNode(Node $node, array $mutatorSettings): bool
{
if (!($node instanceof Node\Expr\ConstFetch)) {
return false;
}

return $node->name->toLowerString() === 'true';
if ($node->name->toLowerString() !== 'true') {
return false;
}

$parentNode = $node->getAttribute(ParentConnectorVisitor::PARENT_KEY);
$grandParentNode = $parentNode !== null ? $parentNode->getAttribute(ParentConnectorVisitor::PARENT_KEY) : null;

if ($grandParentNode instanceof Node\Expr\FuncCall) {
$resultSettings = array_merge(self::DEFAULT_SETTINGS, $mutatorSettings);

$functionName = $grandParentNode->name->toLowerString();

if (array_key_exists($functionName, $resultSettings) && $resultSettings[$functionName] === false) {
return false;
}
}

return true;
}
}

0 comments on commit 2382469

Please sign in to comment.