enhance nikic evaluators + test with/without nikic lib

This commit is contained in:
odain
2025-09-04 22:42:02 +02:00
parent af790269f0
commit 11f142b782
2 changed files with 390 additions and 58 deletions

View File

@@ -12,23 +12,10 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
public static function EvaluateExpressionProvider() {
return [
'ConstFetch: false' => [ 'sExpression' => 'false'],
'ConstFetch: (false)' => [ 'sExpression' => 'false'],
'ConstFetch: true' => [ 'sExpression' => 'true'],
'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,
],
'Array: [1000 => "a"]' => ['sExpression' => '[1000 => "a"]'],
'Array: ["a"]' => ['sExpression' => '["a"]'],
'Array dict: ["a"=>"b"]' => ['sExpression' => '["a"=>"b"]'],
'ArrayDimFetch: $_SERVER[\'toto\']' => ['sExpression' => '$_SERVER[\'toto\']'],
'BinaryOperator: false|true' => [ 'sExpression' => 'false|true'],
'BinaryOperator: false||true' => [ 'sExpression' => 'false||true'],
'BinaryOperator: false&&true' => [ 'sExpression' => 'false&&true'],
@@ -41,36 +28,8 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
'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'],
'UnaryPlus: +1' => ['sExpression' => '+1'],
'Concat: "a"."b"' => ['sExpression' => '"a"."b"'],
'ArrayDimFetch: $_SERVER[\'toto\']' => ['sExpression' => '$_SERVER[\'toto\']'],
//'Variable: $_SERVER' => ['sExpression' => '$_SERVER'],
'Variable: $oNonNullVar' => ['sExpression' => '$oNonNullVar'],
'Array: [1000 => "a"]' => ['sExpression' => '[1000 => "a"]'],
'Array: ["a"]' => ['sExpression' => '["a"]'],
'Array dict: ["a"=>"b"]' => ['sExpression' => '["a"=>"b"]'],
'StaticCall utils::GetItopVersionWikiSyntax()' => ['sExpression' => 'utils::GetItopVersionWikiSyntax()'],
'NullsafePropertyFetch: $oNullVar?->b' => ['sExpression' => '$oNullVar?->b'],
'NullsafePropertyFetch: $oEvaluationFakeClass?->bIsOk' => ['sExpression' => '$oEvaluationFakeClass?->bIsOk'],
'PropertyFetch: $oEvaluationFakeClass->bIsOk' => ['sExpression' => '$oEvaluationFakeClass->bIsOk'],
'NullsafeMethodCall: $oEvaluationFakeClass?->GetName()' => ['sExpression' => '$oEvaluationFakeClass?->GetName()'],
'NullsafeMethodCall: $oEvaluationFakeClass?->GetLongName("aa")' => ['sExpression' => '$oEvaluationFakeClass?->GetLongName("aa")'],
'MethodCall: $oEvaluationFakeClass->GetName()' => ['sExpression' => '$oEvaluationFakeClass->GetName()'],
'MethodCall: $oEvaluationFakeClass->GetLongName("aa")' => ['sExpression' => '$oEvaluationFakeClass->GetLongName("aa")'],
'Coalesce: $oNullVar ?? 1' => ['sExpression' => '$oNullVar ?? 1'],
'Coalesce: $oNonNullVar ?? 1' => ['sExpression' => '$oNonNullVar ?? 1'],
'Isset: isset($a)' => ['sExpression' => 'isset($a)'],
'Isset: isset($a, $_SERVER)' => ['sExpression' => 'isset($a, $_SERVER)'],
'Isset: isset($_SERVER)' => ['sExpression' => 'isset($_SERVER)'],
'Isset: isset($_SERVER, $a)' => ['sExpression' => 'isset($_SERVER, $a)'],
'BitwiseNot: ~3' => ['sExpression' => '~3'],
'Mod: 3%2' => ['sExpression' => '3%2'],
'BitwiseXor: 3^2' => ['sExpression' => '3^2'],
'Ternary: (true) ? 1 : 2' => ['sExpression' => '(true) ? 1 : 2'],
'Ternary: (false) ? 1 : 2' => ['sExpression' => '(false) ? 1 : 2'],
'Cast: (array)3' => ['sExpression' => '(array)3'],
'Cast: (bool)1' => ['sExpression' => '(bool)1'],
'Cast: (bool)0' => ['sExpression' => '(bool)0'],
@@ -78,24 +37,96 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
'Cast: (float)3' => ['sExpression' => '(float)3'],
'Cast: (int)3' => ['sExpression' => '(int)3'],
'Cast: (object)3' => ['sExpression' => '(object)3'],
'Cast: (string)$oEvaluationFakeClass' => ['sExpression' => '(string)$oEvaluationFakeClass'],
'Cast: (string) $oEvaluationFakeClass' => ['sExpression' => '(string) $oEvaluationFakeClass', "toString"],
'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,
],
'Coalesce: $oNullVar ?? 1' => ['sExpression' => '$oNullVar ?? 1', 1],
'Coalesce: $oNonNullVar ?? 1' => ['sExpression' => '$oNonNullVar ?? 1', 1],
'Coalesce: $oGlobalNonNullVar ?? 1' => ['sExpression' => '$oGlobalNonNullVar ?? 1', "a"],
'Concat: "a"."b"' => ['sExpression' => '"a"."b"'],
'ConstFetch: false' => [ 'sExpression' => 'false'],
'ConstFetch: (false)' => [ 'sExpression' => 'false'],
'ConstFetch: true' => [ 'sExpression' => 'true'],
'ConstFetch: (true)' => [ 'sExpression' => 'true'],
'FuncCall: function_exists(\'ldap_connect\')' => [ 'sExpression' => 'function_exists(\'ldap_connect\')'],
'FuncCall: function_exists(\'gabuzomeushouldnotexist\')' => [ 'sExpression' => 'function_exists(\'gabuzomeushouldnotexist\')'],
'Isset: isset($oNonNullVar)' => ['sExpression' => 'isset($oNonNullVar)', false],
'Isset: isset($oGlobalNonNullVar)' => ['sExpression' => 'isset($oGlobalNonNullVar)', true],
'Isset: isset($a, $_SERVER)' => ['sExpression' => 'isset($a, $_SERVER)', false],
'Isset: isset($_SERVER)' => ['sExpression' => 'isset($_SERVER)', true],
'Isset: isset($_SERVER, $a)' => ['sExpression' => 'isset($_SERVER, $a)', false],
'Isset: isset($oGlobalNonNullVar, $_SERVER)' => ['sExpression' => 'isset($oGlobalNonNullVar, $_SERVER)', true],
'MethodCall: $oEvaluationFakeClass->GetName()' => ['sExpression' => '$oEvaluationFakeClass->GetName()', "gabuzomeu"],
'MethodCall: $oEvaluationFakeClass->GetLongName("aa")' => ['sExpression' => '$oEvaluationFakeClass->GetLongName("aa")', "gabuzomeu_aa"],
'Mod: 3%2' => ['sExpression' => '3%2'],
'NullsafeMethodCall: $oNullVar?->GetName()' => ['sExpression' => '$oNullVar?->GetName()', null],
'NullsafeMethodCall: $oNullVar?->GetLongName("aa")' => ['sExpression' => '$oNullVar?->GetLongName("aa")', null],
'NullsafeMethodCall: $oEvaluationFakeClass?->GetName()' => ['sExpression' => '$oEvaluationFakeClass?->GetName()', "gabuzomeu"],
'NullsafeMethodCall: $oEvaluationFakeClass?->GetLongName("aa")' => ['sExpression' => '$oEvaluationFakeClass?->GetLongName("aa")', "gabuzomeu_aa"],
'NullsafePropertyFetch: $oNullVar?->b' => ['sExpression' => '$oNullVar?->b', null],
'NullsafePropertyFetch: $oEvaluationFakeClass?->iIsOk' => ['sExpression' => '$oEvaluationFakeClass?->iIsOk', "IsOkValue"],
'PropertyFetch: $oEvaluationFakeClass->iIsOk' => ['sExpression' => '$oEvaluationFakeClass->iIsOk', "IsOkValue"],
'StaticCall utils::GetItopVersionWikiSyntax()' => ['sExpression' => 'utils::GetItopVersionWikiSyntax()'],
'StaticProperty: public existing constant' => [ 'sExpression' => 'Combodo\iTop\Test\UnitTest\Sources\PhpParser\Evaluation\PhpExpressionEvaluatorTest::$STATIC_PROPERTY'],
'StaticProperty: private existing constant' => [
'sExpression' => 'Combodo\iTop\Test\UnitTest\Setup\ModuleDiscovery\PhpExpressionEvaluatorTest::$PRIVATE_STATIC_PROPERTY',
'forced_expected' => null,
],
'Ternary: (true) ? 1 : 2' => ['sExpression' => '(true) ? 1 : 2'],
'Ternary: (false) ? 1 : 2' => ['sExpression' => '(false) ? 1 : 2'],
'UnaryMinus: -1' => ['sExpression' => '-1'],
'UnaryPlus: +1' => ['sExpression' => '+1'],
'Variable: $_SERVER' => ['sExpression' => '$_SERVER', ['toto' => 'titi']],
'Variable: $oNonNullVar' => ['sExpression' => '$oNonNullVar', null],
'Variable: $oGlobalNonNullVar' => ['sExpression' => '$oGlobalNonNullVar', "a"],
];
}
/**
* @dataProvider EvaluateExpressionProvider
*/
public function testEvaluateExpression($sExpression, $forced_expected="NOTPROVIDED")
public function testEvaluateExpressionWithItopAlgo($sExpression, $forced_expected="NOTPROVIDED")
{
$oNullVar=null;
$this->evaluateExpressionWithMode($sExpression, $forced_expected, PhpExpressionEvaluator::ITOP_ALGO);
}
/**
* @dataProvider EvaluateExpressionProvider
*/
public function testEvaluateExpressionWithLibAndItopFallback($sExpression, $forced_expected="NOTPROVIDED")
{
$this->evaluateExpressionWithMode($sExpression, $forced_expected, PhpExpressionEvaluator::LIB_AND_FALLBACK);
}
/**
* @dataProvider EvaluateExpressionProvider
*/
public function testEvaluateExpressionWithLibOnly($sExpression, $forced_expected="NOTPROVIDED")
{
$this->evaluateExpressionWithMode($sExpression, $forced_expected, PhpExpressionEvaluator::LIB_ONLY);
}
public function evaluateExpressionWithMode($sExpression, $forced_expected, $iMode)
{
global $oGlobalNonNullVar;
$oGlobalNonNullVar="a";
$oNonNullVar="a";
$oNullVar=null;
$_SERVER=[
'toto' => 'titi',
];
global $oEvaluationFakeClass;
$oEvaluationFakeClass = new EvaluationFakeClass();
$res = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateExpression($sExpression);
$res = PhpExpressionEvaluator::GetInstance()->ParseAndEvaluateExpression($sExpression, $iMode);
if ($forced_expected === "NOTPROVIDED"){
$this->assertEquals($this->UnprotectedComputeExpression($sExpression), $res, $sExpression);
} else {
@@ -159,7 +190,7 @@ class PhpExpressionEvaluatorTest extends ItopDataTestCase {
}
class EvaluationFakeClass {
public bool $bIsOk=true;
public string $iIsOk="IsOkValue";
public function GetName()
{
@@ -173,6 +204,6 @@ class EvaluationFakeClass {
public function __toString(): string
{
return "a";
return "toString";
}
}