Skip to content

Commit 8af0e0e

Browse files
committed
TASK: Add test cases for complex bracketed expressions
1 parent fb4b6c5 commit 8af0e0e

File tree

2 files changed

+104
-0
lines changed

2 files changed

+104
-0
lines changed

scripts/test

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@
1414

1515
./vendor/bin/phpunit \
1616
--enforce-time-limit \
17+
--display-deprecations \
18+
--display-errors \
19+
--display-notices \
1720
--testdox \
1821
--coverage-html build/coverage-report \
1922
--coverage-filter src $@

test/Unit/Language/Parser/Expression/ExpressionParserTest.php

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1362,6 +1362,7 @@ public function parsesNestedBracketedTernaryOperation(): void
13621362
$expressionParser->parse($tokens)
13631363
);
13641364
}
1365+
13651366
/**
13661367
* @test
13671368
*/
@@ -1436,6 +1437,62 @@ public function parsesNestedUnbracketedTernaryOperation(): void
14361437
);
14371438
}
14381439

1440+
/**
1441+
* @test
1442+
*/
1443+
public function parsesTernaryOperationWithComplexParentheses(): void
1444+
{
1445+
$expressionParser = new ExpressionParser();
1446+
$tokens = $this->createTokenIterator('(((foo)) === ((null))) ? 1 : (((0)))');
1447+
1448+
$expectedExpressioNode = new ExpressionNode(
1449+
rangeInSource: $this->range([0, 0], [0, 35]),
1450+
root: new TernaryOperationNode(
1451+
condition: new ExpressionNode(
1452+
rangeInSource: $this->range([0, 0], [0, 21]),
1453+
root: new BinaryOperationNode(
1454+
rangeInSource: $this->range([0, 1], [0, 20]),
1455+
leftOperand: new ExpressionNode(
1456+
rangeInSource: $this->range([0, 1], [0, 7]),
1457+
root: new ValueReferenceNode(
1458+
rangeInSource: $this->range([0, 3], [0, 5]),
1459+
name: VariableName::from('foo')
1460+
)
1461+
),
1462+
operator: BinaryOperator::EQUAL,
1463+
rightOperand: new ExpressionNode(
1464+
rangeInSource: $this->range([0, 13], [0, 20]),
1465+
root: new NullLiteralNode(
1466+
rangeInSource: $this->range([0, 15], [0, 18])
1467+
)
1468+
),
1469+
)
1470+
),
1471+
trueBranch: new ExpressionNode(
1472+
rangeInSource: $this->range([0, 25], [0, 25]),
1473+
root: new IntegerLiteralNode(
1474+
rangeInSource: $this->range([0, 25], [0, 25]),
1475+
format: IntegerFormat::DECIMAL,
1476+
value: '1'
1477+
)
1478+
),
1479+
falseBranch: new ExpressionNode(
1480+
rangeInSource: $this->range([0, 29], [0, 35]),
1481+
root: new IntegerLiteralNode(
1482+
rangeInSource: $this->range([0, 32], [0, 32]),
1483+
format: IntegerFormat::DECIMAL,
1484+
value: '0'
1485+
),
1486+
)
1487+
)
1488+
);
1489+
1490+
$this->assertEquals(
1491+
$expectedExpressioNode,
1492+
$expressionParser->parse($tokens)
1493+
);
1494+
}
1495+
14391496
/**
14401497
* @test
14411498
*/
@@ -1608,4 +1665,48 @@ public function parsesValueReference(): void
16081665
$expressionParser->parse($tokens)
16091666
);
16101667
}
1668+
1669+
/**
1670+
* @test
1671+
*/
1672+
public function parsesMultipleParenthesesAroundValureReferenceCorrecly(): void
1673+
{
1674+
$expressionParser = new ExpressionParser();
1675+
1676+
$tokens = $this->createTokenIterator('(foo)');
1677+
$this->assertEquals(
1678+
new ExpressionNode(
1679+
rangeInSource: $this->range([0, 0], [0, 4]),
1680+
root: new ValueReferenceNode(
1681+
rangeInSource: $this->range([0, 1], [0, 3]),
1682+
name: VariableName::from('foo')
1683+
)
1684+
),
1685+
$expressionParser->parse($tokens)
1686+
);
1687+
1688+
$tokens = $this->createTokenIterator('((foo))');
1689+
$this->assertEquals(
1690+
new ExpressionNode(
1691+
rangeInSource: $this->range([0, 0], [0, 6]),
1692+
root: new ValueReferenceNode(
1693+
rangeInSource: $this->range([0, 2], [0, 4]),
1694+
name: VariableName::from('foo')
1695+
)
1696+
),
1697+
$expressionParser->parse($tokens)
1698+
);
1699+
1700+
$tokens = $this->createTokenIterator('(((foo)))');
1701+
$this->assertEquals(
1702+
new ExpressionNode(
1703+
rangeInSource: $this->range([0, 0], [0, 8]),
1704+
root: new ValueReferenceNode(
1705+
rangeInSource: $this->range([0, 3], [0, 5]),
1706+
name: VariableName::from('foo')
1707+
)
1708+
),
1709+
$expressionParser->parse($tokens)
1710+
);
1711+
}
16111712
}

0 commit comments

Comments
 (0)