Exemple #1
0
 /**
  * @throws \RuntimeException
  * @param array $stack
  * @return boolean
  */
 protected function evaluateStack(array $stack)
 {
     $stackCount = count($stack);
     if (0 === $stackCount) {
         return FALSE;
     } elseif (1 === $stackCount) {
         return BooleanNode::convertToBoolean(reset($stack));
     } elseif (3 === $stackCount) {
         list($leftSide, $operator, $rightSide) = array_values($stack);
         if (TRUE === is_string($operator) && TRUE === isset($this->comparisonOperators[$operator])) {
             $operator = $this->comparisonOperators[$operator];
             return BooleanNode::evaluateComparator($operator, $leftSide, $rightSide);
         }
     }
     $operator = FALSE;
     $operatorPrecedence = PHP_INT_MAX;
     $operatorIndex = FALSE;
     foreach ($stack as $index => $element) {
         if (TRUE === is_string($element) && TRUE === isset($this->logicalOperators[$element])) {
             $currentOperator = $this->logicalOperators[$element];
             $currentOperatorPrecedence = $this->operatorPrecedence[$currentOperator];
             if ($currentOperatorPrecedence <= $operatorPrecedence) {
                 $operator = $currentOperator;
                 $operatorPrecedence = $currentOperatorPrecedence;
                 $operatorIndex = $index;
             }
         }
     }
     if (FALSE === $operator) {
         throw new \RuntimeException('The stack was not comparable and did not include any logical operators.', 1385071197);
     }
     $operatorIndex = array_search($operatorIndex, array_keys($stack));
     if (0 === $operatorIndex || $operatorIndex + 1 >= $stackCount) {
         throw new \RuntimeException('The stack may not contain a logical operator at the first or last element.', 1385072228);
     }
     $leftSide = array_slice($stack, 0, $operatorIndex);
     $rightSide = array_slice($stack, $operatorIndex + 1);
     return $this->evaluateLogicalOperator($leftSide, $operator, $rightSide);
 }
 /**
  * @test
  */
 public function convertToBooleanProperlyConvertsObjects()
 {
     $this->assertFalse(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\BooleanNode::convertToBoolean(NULL));
     $this->assertTrue(\TYPO3\CMS\Fluid\Core\Parser\SyntaxTree\BooleanNode::convertToBoolean(new \stdClass()));
 }