2026-03-16 07:24:50 +07:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace Tests\Unit\Rules;
|
|
|
|
|
|
|
|
|
|
use App\Services\RuleExpressionService;
|
|
|
|
|
use CodeIgniter\Test\CIUnitTestCase;
|
|
|
|
|
|
|
|
|
|
class RuleExpressionCompileTest extends CIUnitTestCase
|
|
|
|
|
{
|
|
|
|
|
protected function setUp(): void
|
|
|
|
|
{
|
|
|
|
|
parent::setUp();
|
|
|
|
|
if (!class_exists('Symfony\Component\ExpressionLanguage\ExpressionLanguage')) {
|
|
|
|
|
$this->markTestSkipped('Symfony ExpressionLanguage not installed');
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-12 16:55:03 +07:00
|
|
|
public function testCompileSexCondition(): void
|
|
|
|
|
{
|
|
|
|
|
$svc = new RuleExpressionService();
|
|
|
|
|
|
2026-03-16 07:24:50 +07:00
|
|
|
$compiled = $svc->compile("if(sex('F') ? result_set(0.7) : result_set(1))");
|
2026-03-12 16:55:03 +07:00
|
|
|
|
|
|
|
|
$this->assertIsArray($compiled);
|
2026-03-16 07:24:50 +07:00
|
|
|
$this->assertEquals('patient["Sex"] == "F"', $compiled['conditionExpr']);
|
|
|
|
|
$this->assertEquals(0.7, $compiled['then'][0]['value']);
|
|
|
|
|
$this->assertEquals(1, $compiled['else'][0]['value']);
|
|
|
|
|
$this->assertStringContainsString('patient["Sex"] == "F"', $compiled['valueExpr']);
|
2026-03-12 16:55:03 +07:00
|
|
|
}
|
2026-03-16 07:24:50 +07:00
|
|
|
|
2026-03-12 16:55:03 +07:00
|
|
|
public function testCompilePriorityCondition(): void
|
|
|
|
|
{
|
|
|
|
|
$svc = new RuleExpressionService();
|
|
|
|
|
|
2026-03-16 07:24:50 +07:00
|
|
|
$compiled = $svc->compile("if(priority('S') ? result_set('urgent') : result_set('normal'))");
|
2026-03-12 16:55:03 +07:00
|
|
|
|
|
|
|
|
$this->assertIsArray($compiled);
|
|
|
|
|
$this->assertEquals('order["Priority"] == "S"', $compiled['conditionExpr']);
|
2026-03-16 07:24:50 +07:00
|
|
|
$this->assertEquals('urgent', $compiled['then'][0]['value']);
|
|
|
|
|
$this->assertEquals('normal', $compiled['else'][0]['value']);
|
2026-03-12 16:55:03 +07:00
|
|
|
}
|
2026-03-16 07:24:50 +07:00
|
|
|
|
|
|
|
|
public function testCompileInvalidSyntax(): void
|
|
|
|
|
{
|
|
|
|
|
$svc = new RuleExpressionService();
|
|
|
|
|
|
|
|
|
|
$this->expectException(\InvalidArgumentException::class);
|
|
|
|
|
$svc->compile("invalid syntax here");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function testCompileEmptyReturnsEmpty(): void
|
|
|
|
|
{
|
|
|
|
|
$svc = new RuleExpressionService();
|
|
|
|
|
|
|
|
|
|
$compiled = $svc->compile("");
|
|
|
|
|
|
|
|
|
|
$this->assertIsArray($compiled);
|
|
|
|
|
$this->assertEmpty($compiled);
|
|
|
|
|
}
|
|
|
|
|
}
|