/core/attributedef.class.inc.php) * * @return void * @since 2.7.9 3.0.3 3.1.0 N°5608 Add method after PHPUnit directory moving */ protected function RequireOnceItopFile(string $sFileRelPath): void { require_once APPROOT . $sFileRelPath; } /** * Require once a unit test file (eg. a mock class) from its relative path from the *current* dir. * This ensure that required files don't crash when unit tests dir is moved in the iTop structure (see N°5608) * * @param string $sFileRelPath Rel. path (from the *current* dir) of the unit test file to require (eg. './WeeklyScheduledProcessMockConfig.php' for /tests/php-unit-tests/unitary-tests/core/WeeklyScheduledProcessMockConfig.php in Combodo\iTop\Test\UnitTest\Core\WeeklyScheduledProcessTest) * * @return void * @since 2.7.9 3.0.3 3.1.0 N°5608 Add method after PHPUnit directory moving */ protected function RequireOnceUnitTestFile(string $sFileRelPath): void { $aStack = debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS, 2); $sCallerDirAbsPath = dirname($aStack[0]['file']); require_once $sCallerDirAbsPath . DIRECTORY_SEPARATOR . $sFileRelPath; } protected function debug($sMsg) { if (DEBUG_UNIT_TEST) { if (is_string($sMsg)) { echo "$sMsg\n"; } else { /** @noinspection ForgottenDebugOutputInspection */ print_r($sMsg); } } } public function GetMicroTime() { list($uSec, $sec) = explode(" ", microtime()); return ((float)$uSec + (float)$sec); } public function WriteToCsvHeader($sFilename, $aHeader) { $sResultFile = APPROOT.'log/'.$sFilename; if (is_file($sResultFile)) { @unlink($sResultFile); } SetupUtils::builddir(dirname($sResultFile)); file_put_contents($sResultFile, implode(';', $aHeader)."\n"); } public function WriteToCsvData($sFilename, $aData) { $sResultFile = APPROOT.'log/'.$sFilename; $file = fopen($sResultFile, 'a'); fputs($file, implode(';', $aData)."\n"); fclose($file); } public function GetTestId() { $sId = str_replace('"', '', $this->getName()); $sId = str_replace(' ', '_', $sId); return $sId; } /** * @since 2.7.4 3.0.0 */ public function InvokeNonPublicStaticMethod($sObjectClass, $sMethodName, $aArgs) { return $this->InvokeNonPublicMethod($sObjectClass, $sMethodName, null, $aArgs); } /** * @param string $sObjectClass for example DBObject::class * @param string $sMethodName * @param object $oObject * @param array $aArgs * * @return mixed method result * * @throws \ReflectionException * * @since 2.7.4 3.0.0 */ public function InvokeNonPublicMethod($sObjectClass, $sMethodName, $oObject, $aArgs) { $class = new \ReflectionClass($sObjectClass); $method = $class->getMethod($sMethodName); $method->setAccessible(true); return $method->invokeArgs($oObject, $aArgs); } /** * @param object $oObject * @param string $sProperty * * @return mixed property * * @throws \ReflectionException * @since 2.7.8 3.0.3 3.1.0 */ public function GetNonPublicProperty(object $oObject, string $sProperty) { $class = new \ReflectionClass(get_class($oObject)); $property = $class->getProperty($sProperty); $property->setAccessible(true); return $property->getValue($oObject); } /** * @param object $oObject * @param string $sProperty * @param $value * * @throws \ReflectionException * @since 2.7.8 3.0.3 3.1.0 */ public function SetNonPublicProperty(object $oObject, string $sProperty, $value) { $class = new \ReflectionClass(get_class($oObject)); $property = $class->getProperty($sProperty); $property->setAccessible(true); $property->setValue($oObject, $value); } }