mirror of
https://github.com/Combodo/iTop.git
synced 2026-05-22 00:32:16 +02:00
replace eval by iTop custom evaluation classes
This commit is contained in:
@@ -1,277 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery;
|
||||
|
||||
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
||||
use ModuleFileParser;
|
||||
use ModuleFileReader;
|
||||
use PhpParser\ParserFactory;
|
||||
use SetupUtils;
|
||||
|
||||
class ModuleFileParserTest extends ItopDataTestCase
|
||||
{
|
||||
public static $STATIC_PROPERTY = 123;
|
||||
private static $PRIVATE_STATIC_PROPERTY = 123;
|
||||
private const PRIVATE_CONSTANT = 123;
|
||||
|
||||
protected function setUp(): void
|
||||
{
|
||||
parent::setUp();
|
||||
$this->RequireOnceItopFile('setup/modulediscovery/ModuleFileReader.php');
|
||||
}
|
||||
|
||||
public static function EvaluateBooleanExpressionProvider()
|
||||
{
|
||||
return [
|
||||
"true" => [ "expr" => "true", "expected" => true],
|
||||
"(true)" => [ "expr" => "(true)", "expected" => true],
|
||||
"(false|true)" => [ "expr" => "(false|true)", "expected" => true],
|
||||
"(false||true)" => [ "expr" => "(false||true)", "expected" => true],
|
||||
"false" => [ "expr" => "false", "expected" => false],
|
||||
"(false)" => [ "expr" => "(false)", "expected" => false],
|
||||
"(false&&true)" => [ "expr" => "(false&&true)", "expected" => false],
|
||||
"(false&true)" => [ "expr" => "(false&true)", "expected" => false],
|
||||
"10 * 10" => [ "expr" => "10 * 10", "expected" => 100],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider EvaluateBooleanExpressionProvider
|
||||
*/
|
||||
public function testEvaluateBooleanExpression(string $sBooleanExpression, $expected){
|
||||
$this->assertEquals($expected, ModuleFileParser::GetInstance()->EvaluateBooleanExpression($sBooleanExpression), $sBooleanExpression);
|
||||
}
|
||||
|
||||
public function testEvaluateBooleanExpression_BrokenBooleanExpression(){
|
||||
$this->expectException(\ModuleFileReaderException::class);
|
||||
$this->expectExceptionMessage('Eval of \'(a || true)\' caused an error');
|
||||
$this->assertTrue(ModuleFileParser::GetInstance()->EvaluateBooleanExpression("(a || true)"));
|
||||
}
|
||||
|
||||
|
||||
public static function EvaluateBooleanExpressionAutoselectProvider()
|
||||
{
|
||||
$sSimpleCallToModuleIsSelected = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt\")";
|
||||
$sSimpleCallToModuleIsSelected2 = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt-notselected\")";
|
||||
$sCallToModuleIsSelectedCombinedWithAndOperator = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt\") || SetupInfo::ModuleIsSelected(\"itop-virtualization-mgmt\")";
|
||||
$sCallToModuleIsSelectedCombinedWithAndOperator2 = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt-notselected\") || SetupInfo::ModuleIsSelected(\"itop-virtualization-mgmt\")";
|
||||
|
||||
return [
|
||||
"simple call to SetupInfo::ModuleIsSelected SELECTED" => [
|
||||
"expr" => $sSimpleCallToModuleIsSelected,
|
||||
"expected" => true,
|
||||
],
|
||||
"simple call to SetupInfo::ModuleIsSelected NOT SELECTED" => [
|
||||
"expr" => $sSimpleCallToModuleIsSelected2,
|
||||
"expected" => false,
|
||||
],
|
||||
"call to SetupInfo::ModuleIsSelected + OR => SELECTED" => [
|
||||
"expr" => $sCallToModuleIsSelectedCombinedWithAndOperator,
|
||||
"expected" => true,
|
||||
],
|
||||
"simple call to SetupInfo::ModuleIsSelected + OR => NOT SELECTED" => [
|
||||
"expr" => $sCallToModuleIsSelectedCombinedWithAndOperator2,
|
||||
"expected" => false,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @dataProvider EvaluateBooleanExpressionAutoselectProvider
|
||||
*/
|
||||
public function testEvaluateBooleanExpression_Autoselect(string $sBooleanExpression, bool $expected){
|
||||
\SetupInfo::SetSelectedModules(["itop-storage-mgmt" => "123"]);
|
||||
$this->assertEquals($expected, ModuleFileParser::GetInstance()->EvaluateBooleanExpression($sBooleanExpression), $sBooleanExpression);
|
||||
}
|
||||
|
||||
public function testEvaluateConstantExpression()
|
||||
{
|
||||
$sPHP = <<<PHP
|
||||
<?php
|
||||
APPROOT;
|
||||
PHP;
|
||||
$aNodes = ModuleFileParser::GetInstance()->ParsePhpCode($sPHP);
|
||||
/** @var \PhpParser\Node\Expr $oExpr */
|
||||
$oExpr = $aNodes[0];
|
||||
$val = $this->InvokeNonPublicMethod(ModuleFileParser::class, "EvaluateConstantExpression", ModuleFileParser::GetInstance(), [$oExpr->expr]);
|
||||
$this->assertEquals(APPROOT, $val);
|
||||
}
|
||||
|
||||
public function testEvaluateClassConstantExpression_PublicConstant()
|
||||
{
|
||||
$this->validateEvaluateClassConstantExpression('SetupUtils::PHP_MIN_VERSION', SetupUtils::PHP_MIN_VERSION);
|
||||
}
|
||||
|
||||
public function testEvaluateClassConstantExpression_PrivateConstantShouldNotBeFound()
|
||||
{
|
||||
$this->validateEvaluateClassConstantExpression('Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\ModuleFileParserTest::PRIVATE_CONSTANT', null);
|
||||
}
|
||||
|
||||
public function testEvaluateClassConstant_UnknownConstant()
|
||||
{
|
||||
$this->validateEvaluateClassConstantExpression('SetupUtils::UNKOWN_CONSTANT', null);
|
||||
}
|
||||
|
||||
public function testEvaluateClassConstant_UnknownClass()
|
||||
{
|
||||
$this->validateEvaluateClassConstantExpression('UnknownGaBuZoMeuClass::PHP_MIN_VERSION', null);
|
||||
}
|
||||
|
||||
public function testEvaluateClassConstant_UnknownClassGetClass()
|
||||
{
|
||||
$this->validateEvaluateClassConstantExpression('UnknownGaBuZoMeuClass::class', 'UnknownGaBuZoMeuClass');
|
||||
}
|
||||
|
||||
public function validateEvaluateClassConstantExpression($sExpression, $expected)
|
||||
{
|
||||
$sPHP = <<<PHP
|
||||
<?php
|
||||
$sExpression;
|
||||
PHP;
|
||||
$aNodes = ModuleFileParser::GetInstance()->ParsePhpCode($sPHP);
|
||||
/** @var \PhpParser\Node\Expr $oExpr */
|
||||
$oExpr = $aNodes[0];
|
||||
$val = $this->InvokeNonPublicMethod(ModuleFileParser::class, "EvaluateClassConstantExpression", ModuleFileParser::GetInstance(), [$oExpr->expr]);
|
||||
$this->assertEquals($expected, $val, "$sExpression");
|
||||
}
|
||||
|
||||
public function testEvaluateClassConstant_PublicGetStaticProperty()
|
||||
{
|
||||
$this->validateEvaluateStaticPropertyExpression('Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\ModuleFileParserTest::$STATIC_PROPERTY', ModuleFileParserTest::$STATIC_PROPERTY);
|
||||
}
|
||||
|
||||
public function testEvaluateClassConstant_PrivateGetStaticPropertyShouldNotBeFound()
|
||||
{
|
||||
$this->validateEvaluateStaticPropertyExpression('Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\ModuleFileParserTest::$PRIVATE_STATIC_PROPERTY', null);
|
||||
}
|
||||
|
||||
public function validateEvaluateStaticPropertyExpression($sExpression, $expected)
|
||||
{
|
||||
$sPHP = <<<PHP
|
||||
<?php
|
||||
$sExpression;
|
||||
PHP;
|
||||
$aNodes = ModuleFileParser::GetInstance()->ParsePhpCode($sPHP);
|
||||
/** @var \PhpParser\Node\Expr $oExpr */
|
||||
$oExpr = $aNodes[0];
|
||||
$val = $this->InvokeNonPublicMethod(ModuleFileParser::class, "EvaluateStaticPropertyExpression", ModuleFileParser::GetInstance(), [$oExpr->expr]);
|
||||
$this->assertEquals($expected, $val, "$sExpression");
|
||||
}
|
||||
|
||||
public static function EvaluateExpressionBooleanProvider() {
|
||||
$sTruePHP = <<<PHP
|
||||
<?php
|
||||
if (COND){
|
||||
echo "toto";
|
||||
}
|
||||
PHP;
|
||||
|
||||
return [
|
||||
'"true"' => [
|
||||
"code" => str_replace("COND", '"true"', $sTruePHP),
|
||||
"bool_expected" => "true",
|
||||
|
||||
],
|
||||
"true" => [
|
||||
"code" => str_replace("COND", "true", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
|
||||
],
|
||||
"false" => [
|
||||
"code" => str_replace("COND", "false", $sTruePHP),
|
||||
"bool_expected" => false,
|
||||
|
||||
],
|
||||
'"false"' => [
|
||||
"code" => str_replace("COND", '"false"', $sTruePHP),
|
||||
"bool_expected" => "false",
|
||||
|
||||
],
|
||||
"not ok" => [
|
||||
"code" => str_replace("COND", "! false", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
|
||||
],
|
||||
"not ko" => [
|
||||
"code" => str_replace("COND", "! (true)", $sTruePHP),
|
||||
"bool_expected" => false,
|
||||
|
||||
],
|
||||
"AND ko" => [
|
||||
"code" => str_replace("COND", "true && false", $sTruePHP),
|
||||
"bool_expected" => false,
|
||||
|
||||
],
|
||||
"AND ok1" => [
|
||||
"code" => str_replace("COND", "true && true", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
|
||||
],
|
||||
"AND ko2" => [
|
||||
"code" => str_replace("COND", "true && true && false", $sTruePHP),
|
||||
"bool_expected" => false,
|
||||
|
||||
],
|
||||
"OR ko" => [
|
||||
"code" => str_replace("COND", "false || false", $sTruePHP),
|
||||
"bool_expected" => false,
|
||||
|
||||
],
|
||||
"OR ok" => [
|
||||
"code" => str_replace("COND", "false ||true", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
|
||||
],
|
||||
"OR ok2" => [
|
||||
"code" => str_replace("COND", "false ||false||true", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
|
||||
],
|
||||
"function_exists('ldap_connect')" => [
|
||||
"code" => str_replace("COND", "function_exists('ldap_connect')", $sTruePHP),
|
||||
"bool_expected" => function_exists('ldap_connect'),
|
||||
|
||||
],
|
||||
"function_exists('gabuzomeushouldnotexist')" => [
|
||||
"code" => str_replace("COND", "function_exists('gabuzomeushouldnotexist')", $sTruePHP),
|
||||
"bool_expected" => function_exists('gabuzomeushouldnotexist'),
|
||||
|
||||
],
|
||||
"1 > 2" => [
|
||||
"code" => str_replace("COND", "1 > 2", $sTruePHP),
|
||||
"bool_expected" => false,
|
||||
|
||||
],
|
||||
"1 == 1" => [
|
||||
"code" => str_replace("COND", "1 == 1", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
|
||||
],
|
||||
"1 < 2" => [
|
||||
"code" => str_replace("COND", "1 < 2", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
],
|
||||
"PHP_VERSION_ID == PHP_VERSION_ID" => [
|
||||
"code" => str_replace("COND", "PHP_VERSION_ID == PHP_VERSION_ID", $sTruePHP),
|
||||
"bool_expected" => true,
|
||||
],
|
||||
"PHP_VERSION_ID != PHP_VERSION_ID" => [
|
||||
"code" => str_replace("COND", "PHP_VERSION_ID != PHP_VERSION_ID", $sTruePHP),
|
||||
"bool_expected" => false,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider EvaluateExpressionBooleanProvider
|
||||
*/
|
||||
public function testEvaluateExpression($sPHP, $bExpected)
|
||||
{
|
||||
$aNodes = ModuleFileParser::GetInstance()->ParsePhpCode($sPHP);
|
||||
/** @var \PhpParser\Node\Expr $oExpr */
|
||||
$oExpr = $aNodes[0];
|
||||
$val = $this->InvokeNonPublicMethod(ModuleFileParser::class, "EvaluateExpression", ModuleFileParser::GetInstance(), [$oExpr->cond]);
|
||||
$this->assertEquals($bExpected, $val);
|
||||
}
|
||||
}
|
||||
@@ -30,16 +30,28 @@ class ModuleFileReaderTest extends ItopDataTestCase
|
||||
|
||||
/*public function testAllReadModuleFileConfiguration()
|
||||
{
|
||||
$_SERVER=[
|
||||
'SERVER_NAME' => 'titi'
|
||||
];
|
||||
|
||||
$aErrors=[];
|
||||
foreach (glob(__DIR__.'/resources/all_factory/module.*.php') as $sModuleFilePath){
|
||||
$aRes = ModuleFileReader::GetInstance()->ReadModuleFileInformation($sModuleFilePath);
|
||||
foreach (glob(__DIR__.'/resources/all_designer/**.php') as $sModuleFilePath){
|
||||
//var_dump($sModuleFilePath);
|
||||
try{
|
||||
$aRes = ModuleFileReader::GetInstance()->ReadModuleFileInformation($sModuleFilePath);
|
||||
} catch(\Exception $e){
|
||||
$aErrors[]=basename($sModuleFilePath);
|
||||
continue;
|
||||
}
|
||||
|
||||
$aExpected = ModuleFileReader::GetInstance()->ReadModuleFileInformationUnsafe($sModuleFilePath);
|
||||
|
||||
if ($aExpected !== $aRes){
|
||||
$aErrors[]=basename($sModuleFilePath);
|
||||
continue;
|
||||
}
|
||||
//$this->assertEquals($aExpected, $aRes);
|
||||
//break;
|
||||
//$this->assertEquals($aExpected, $aRes, $sModuleFilePath);
|
||||
}
|
||||
|
||||
$this->assertEquals([], $aErrors);
|
||||
|
||||
@@ -5,9 +5,130 @@ namespace Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery;
|
||||
use Combodo\iTop\Test\UnitTest\ItopDataTestCase;
|
||||
use evaluation\expression\PhpExpressionEvaluator;
|
||||
|
||||
class PhpExpressionEvaluatorTest extends ItopDataTestCase{
|
||||
public function testEvaluateExpression(){
|
||||
$res = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateExpression('false');
|
||||
$this->assertEquals(false, $res);
|
||||
class PhpExpressionEvaluatorTest extends ItopDataTestCase {
|
||||
public static $STATIC_PROPERTY = 123;
|
||||
private static $PRIVATE_STATIC_PROPERTY = 123;
|
||||
private const PRIVATE_CONSTANT = 123;
|
||||
|
||||
public static function EvaluateExpressionProvider() {
|
||||
return [
|
||||
'ConstFetch: false' => [ 'sExpression' => 'false'],
|
||||
'ConstFetch: (false)' => [ 'sExpression' => 'false'],
|
||||
'ConstFetch: true' => [ 'sExpression' => 'true'],
|
||||
//'ConstFetch: __FILE__' => [ 'sExpression' => __FILE__],
|
||||
'ConstFetch: (true)' => [ 'sExpression' => 'true'],
|
||||
'ClassConstFetch: public existing constant' => [ 'sExpression' => 'SetupUtils::PHP_MIN_VERSION'],
|
||||
'ClassConstFetch: unknown constant' => [ 'sExpression' => 'SetupUtils::UNKNOWN_CONSTANT'],
|
||||
'ClassConstFetch: unknown class:constant' => [ 'sExpression' => 'GabuZomeuUnknownClass::UNKNOWN_CONSTANT'],
|
||||
'ClassConstFetch: unknown class:class' => [ 'sExpression' => 'GabuZomeuUnknownClass::class'],
|
||||
'ClassConstFetch: private existing constant' => [
|
||||
'sExpression' => 'Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\PhpExpressionEvaluatorTest::PRIVATE_CONSTANT',
|
||||
'forced_expected' => null
|
||||
],
|
||||
'StaticProperty: public existing constant' => [ 'sExpression' => 'Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\PhpExpressionEvaluatorTest::$STATIC_PROPERTY'],
|
||||
'StaticProperty: private existing constant' => [
|
||||
'sExpression' => 'Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\PhpExpressionEvaluatorTest::$PRIVATE_STATIC_PROPERTY',
|
||||
'forced_expected' => null
|
||||
],
|
||||
'BinaryOperator: false|true' => [ 'sExpression' => 'false|true'],
|
||||
'BinaryOperator: false||true' => [ 'sExpression' => 'false||true'],
|
||||
'BinaryOperator: false&&true' => [ 'sExpression' => 'false&&true'],
|
||||
'BinaryOperator: true&&true&&true&&false' => [ 'sExpression' => 'true&&true&&true&&false'],
|
||||
'BinaryOperator: false&true' => [ 'sExpression' => 'false&true'],
|
||||
'BinaryOperator: ! true' => [ 'sExpression' => '! true'],
|
||||
'BinaryOperator: 10 * 5' => [ 'sExpression' => '10 * 5'],
|
||||
'BinaryOperator: 1 > 2' => [ 'sExpression' => '1 > 2'],
|
||||
'BinaryOperator: 1 >= 1' => [ 'sExpression' => '1 >= 1'],
|
||||
'BinaryOperator: 1 <= 1' => [ 'sExpression' => '1 <= 1'],
|
||||
'BinaryOperator: PHP_VERSION_ID == PHP_VERSION_ID' => [ 'sExpression' => 'PHP_VERSION_ID == PHP_VERSION_ID'],
|
||||
'BinaryOperator: PHP_VERSION_ID != PHP_VERSION_ID' => [ 'sExpression' => 'PHP_VERSION_ID != PHP_VERSION_ID'],
|
||||
'FuncCall: function_exists(\'ldap_connect\')' => [ 'sExpression' => 'function_exists(\'ldap_connect\')'],
|
||||
'FuncCall: function_exists(\'gabuzomeushouldnotexist\')' => [ 'sExpression' => 'function_exists(\'gabuzomeushouldnotexist\')'],
|
||||
'UnaryMinus: -1' => ['sExpression' => '-1'],
|
||||
'Concat: "a"."b"' => ['sExpression' => '"a"."b"'],
|
||||
'ArrayDimFetch: $_SERVER[\'toto\']' => ['sExpression' => '$_SERVER[\'toto\']'],
|
||||
'Variable: $_SERVER' => ['sExpression' => '$_SERVER'],
|
||||
'Array: [1000 => "a"]' => ['sExpression' => '[1000 => "a"]'],
|
||||
'Array: ["a"]' => ['sExpression' => '["a"]'],
|
||||
'Array dict: ["a"=>"b"]' => ['sExpression' => '["a"=>"b"]'],
|
||||
'StaticCall utils::GetItopVersionWikiSyntax()' => ['sExpression' => 'utils::GetItopVersionWikiSyntax()']
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* @dataProvider EvaluateExpressionProvider
|
||||
*/
|
||||
public function testEvaluateExpression($sExpression, $forced_expected="NOTPROVIDED")
|
||||
{
|
||||
$_SERVER=[
|
||||
'toto' => 'titi'
|
||||
];
|
||||
|
||||
$res = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateExpression($sExpression);
|
||||
if ($forced_expected === "NOTPROVIDED"){
|
||||
$this->assertEquals($this->UnprotectedComputeExpression($sExpression), $res, $sExpression);
|
||||
} else {
|
||||
$this->assertEquals($forced_expected, $res, $sExpression);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $sBooleanExpr
|
||||
*
|
||||
* @return mixed
|
||||
* @throws \ModuleFileReaderException
|
||||
*/
|
||||
private function UnprotectedComputeExpression(string $sExpr) : mixed
|
||||
{
|
||||
try {
|
||||
$bResult = null;
|
||||
@eval('$bResult = '.$sExpr.';');
|
||||
|
||||
return $bResult;
|
||||
} catch (\Throwable $t){
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
public function testParseAndEvaluateBooleanExpression_BrokenBooleanExpression(){
|
||||
$this->expectException(\ModuleFileReaderException::class);
|
||||
$this->expectExceptionMessage('Eval of \'(a || true)\' caused an error');
|
||||
$this->assertTrue(PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression("(a || true)"));
|
||||
}
|
||||
|
||||
public static function ParseAndEvaluateBooleanExpression_AutoselectProvider()
|
||||
{
|
||||
$sSimpleCallToModuleIsSelected = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt\")";
|
||||
$sSimpleCallToModuleIsSelected2 = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt-notselected\")";
|
||||
$sCallToModuleIsSelectedCombinedWithAndOperator = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt\") || SetupInfo::ModuleIsSelected(\"itop-virtualization-mgmt\")";
|
||||
$sCallToModuleIsSelectedCombinedWithAndOperator2 = "SetupInfo::ModuleIsSelected(\"itop-storage-mgmt-notselected\") || SetupInfo::ModuleIsSelected(\"itop-virtualization-mgmt\")";
|
||||
|
||||
return [
|
||||
"simple call to SetupInfo::ModuleIsSelected SELECTED" => [
|
||||
"expr" => $sSimpleCallToModuleIsSelected,
|
||||
"expected" => true,
|
||||
],
|
||||
"simple call to SetupInfo::ModuleIsSelected NOT SELECTED" => [
|
||||
"expr" => $sSimpleCallToModuleIsSelected2,
|
||||
"expected" => false,
|
||||
],
|
||||
"call to SetupInfo::ModuleIsSelected + OR => SELECTED" => [
|
||||
"expr" => $sCallToModuleIsSelectedCombinedWithAndOperator,
|
||||
"expected" => true,
|
||||
],
|
||||
"simple call to SetupInfo::ModuleIsSelected + OR => NOT SELECTED" => [
|
||||
"expr" => $sCallToModuleIsSelectedCombinedWithAndOperator2,
|
||||
"expected" => false,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @dataProvider ParseAndEvaluateBooleanExpression_AutoselectProvider
|
||||
*/
|
||||
public function testEvaluateBooleanExpression_Autoselect(string $sBooleanExpression, bool $expected){
|
||||
\SetupInfo::SetSelectedModules(["itop-storage-mgmt" => "123"]);
|
||||
$this->assertEquals($expected, PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateBooleanExpression($sBooleanExpression), $sBooleanExpression);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user