ENH PHP 8.1 compatibility

This commit is contained in:
Steve Boyd 2022-04-13 17:37:24 +12:00
parent 261f88dd19
commit 1f9fc6db05
13 changed files with 130 additions and 130 deletions

View File

@ -63,7 +63,7 @@ class CoreInitializationPass implements CompilerPassInterface
$container->setParameter('paths.modules.'.$module->getShortName(), $module->getPath());
$composerName = $module->getComposerName();
if ($composerName) {
list($vendor,$name) = explode('/', $composerName);
list($vendor,$name) = explode('/', $composerName ?? '');
$container->setParameter('paths.modules.'.$vendor.'.'.$name, $module->getPath());
}
}

View File

@ -97,7 +97,7 @@ class BasicContext implements Context
{
$result = [];
foreach (get_declared_classes() as $class) {
if (is_subclass_of($class, $parent)) {
if (is_subclass_of($class, $parent ?? '')) {
$result[] = $class;
}
}
@ -211,9 +211,9 @@ JS;
}
try {
$ajaxEnabledSteps = $this->getMainContext()->getAjaxSteps();
$ajaxEnabledSteps = implode('|', array_filter($ajaxEnabledSteps));
$ajaxEnabledSteps = implode('|', array_filter($ajaxEnabledSteps ?? []));
if (empty($ajaxEnabledSteps) || !preg_match('/(' . $ajaxEnabledSteps . ')/i', $event->getStep()->getText())) {
if (empty($ajaxEnabledSteps) || !preg_match('/(' . $ajaxEnabledSteps . ')/i', $event->getStep()->getText() ?? '')) {
return;
}
@ -264,9 +264,9 @@ JS;
}
try {
$ajaxEnabledSteps = $this->getMainContext()->getAjaxSteps();
$ajaxEnabledSteps = implode('|', array_filter($ajaxEnabledSteps));
$ajaxEnabledSteps = implode('|', array_filter($ajaxEnabledSteps ?? []));
if (empty($ajaxEnabledSteps) || !preg_match('/(' . $ajaxEnabledSteps . ')/i', $event->getStep()->getText())) {
if (empty($ajaxEnabledSteps) || !preg_match('/(' . $ajaxEnabledSteps . ')/i', $event->getStep()->getText() ?? '')) {
return;
}
@ -377,7 +377,7 @@ JS;
{
$page = $this->getSession()->getPage();
// See https://mathiasbynens.be/notes/css-escapes
$escapedTitle = addcslashes($title, '!"#$%&\'()*+,-./:;<=>?@[\]^`{|}~');
$escapedTitle = addcslashes($title ?? '', '!"#$%&\'()*+,-./:;<=>?@[\]^`{|}~');
$matchedEl = null;
$searches = [
['named', ['link_or_button', "'{$title}'"]],
@ -406,7 +406,7 @@ JS;
public function iShouldSeeAButton($negative, $text)
{
$button = $this->findNamedButton($text);
if (trim($negative)) {
if (trim($negative ?? '')) {
Assert::assertNull($button, sprintf('%s button found', $text));
} else {
Assert::assertNotNull($button, sprintf('%s button not found', $text));
@ -430,9 +430,9 @@ JS;
*/
public function stepIPressTheButtons($text)
{
$buttonNames = explode('|', $text);
$buttonNames = explode('|', $text ?? '');
foreach ($buttonNames as $name) {
$button = $this->findNamedButton(trim($name));
$button = $this->findNamedButton(trim($name ?? ''));
if ($button) {
break;
}
@ -718,14 +718,14 @@ JS;
*/
public function castRelativeToAbsoluteTime($prefix, $val)
{
$timestamp = strtotime($val);
$timestamp = strtotime($val ?? '');
if (!$timestamp) {
throw new InvalidArgumentException(sprintf(
"Can't resolve '%s' into a valid datetime value",
$val
));
}
return date($this->timeFormat, $timestamp);
return date($this->timeFormat ?? '', $timestamp);
}
/**
@ -740,14 +740,14 @@ JS;
*/
public function castRelativeToAbsoluteDatetime($prefix, $val)
{
$timestamp = strtotime($val);
$timestamp = strtotime($val ?? '');
if (!$timestamp) {
throw new InvalidArgumentException(sprintf(
"Can't resolve '%s' into a valid datetime value",
$val
));
}
return date($this->datetimeFormat, $timestamp);
return date($this->datetimeFormat ?? '', $timestamp);
}
/**
@ -762,14 +762,14 @@ JS;
*/
public function castRelativeToAbsoluteDate($prefix, $val)
{
$timestamp = strtotime($val);
$timestamp = strtotime($val ?? '');
if (!$timestamp) {
throw new InvalidArgumentException(sprintf(
"Can't resolve '%s' into a valid datetime value",
$val
));
}
return date($this->dateFormat, $timestamp);
return date($this->dateFormat ?? '', $timestamp);
}
public function getDateFormat()
@ -828,7 +828,7 @@ JS;
Assert::assertNotNull($element, sprintf("Element '%s' not found", $name));
$disabledAttribute = $element->getAttribute('disabled');
if (trim($negate)) {
if (trim($negate ?? '')) {
Assert::assertNull($disabledAttribute, sprintf("Failed asserting element '%s' is not disabled", $name));
} else {
Assert::assertNotNull($disabledAttribute, sprintf("Failed asserting element '%s' is disabled", $name));
@ -929,11 +929,11 @@ JS;
Assert::assertNotNull($regionObj);
$actual = $regionObj->getText();
$actual = preg_replace('/\s+/u', ' ', $actual);
$regex = '/' . preg_quote($text, '/') . '/ui';
$actual = preg_replace('/\s+/u', ' ', $actual ?? '');
$regex = '/' . preg_quote($text ?? '', '/') . '/ui';
if (trim($negate)) {
if (preg_match($regex, $actual)) {
if (trim($negate ?? '')) {
if (preg_match($regex ?? '', $actual ?? '')) {
$message = sprintf(
'The text "%s" was found in the text of the "%s" region on the page %s.',
$text,
@ -944,7 +944,7 @@ JS;
throw new \Exception($message);
}
} else {
if (!preg_match($regex, $actual)) {
if (!preg_match($regex ?? '', $actual ?? '')) {
$message = sprintf(
'The text "%s" was not found anywhere in the text of the "%s" region on the page %s.',
$text,
@ -1079,15 +1079,15 @@ JS;
// Check both of the texts exist in the element
$text = $ele->getText();
Assert::assertTrue(strpos($text, $textBefore) !== 'FALSE', sprintf('%s not found in the element %s', $textBefore, $element));
Assert::assertTrue(strpos($text, $textAfter) !== 'FALSE', sprintf('%s not found in the element %s', $textAfter, $element));
Assert::assertTrue(strpos($text ?? '', $textBefore ?? '') !== 'FALSE', sprintf('%s not found in the element %s', $textBefore, $element));
Assert::assertTrue(strpos($text ?? '', $textAfter ?? '') !== 'FALSE', sprintf('%s not found in the element %s', $textAfter, $element));
/// Use strpos to get the position of the first occurrence of the two texts (case-sensitive)
// and compare them with the given order (before or after)
if ($order === 'before') {
Assert::assertTrue(strpos($text, $textBefore) < strpos($text, $textAfter));
Assert::assertTrue(strpos($text ?? '', $textBefore ?? '') < strpos($text ?? '', $textAfter ?? ''));
} else {
Assert::assertTrue(strpos($text, $textBefore) > strpos($text, $textAfter));
Assert::assertTrue(strpos($text ?? '', $textBefore ?? '') > strpos($text ?? '', $textAfter ?? ''));
}
}
@ -1302,7 +1302,7 @@ JS;
$not = '';
$cssSelector = $not;
}
$sel = str_replace('"', '\\"', $cssSelector);
$sel = str_replace('"', '\\"', $cssSelector ?? '');
$js = <<<JS
return document.querySelector("$sel");
JS;
@ -1330,8 +1330,8 @@ JS;
$field->selectOption($value);
} else {
$xpath = $field->getXpath();
$xpath = str_replace(['"', "\n"], ['\"', ''], $xpath);
$value = str_replace('"', '\"', $value);
$xpath = str_replace(['"', "\n"], ['\"', ''], $xpath ?? '');
$value = str_replace('"', '\"', $value ?? '');
$js = <<<JS
return (function() {
let select = document.evaluate("{$xpath}", document).iterateNext();
@ -1360,8 +1360,8 @@ JS;
public function theRenderedHtmlShouldContain($not, $htmlFragment)
{
$html = $this->getSession()->getPage()->getOuterHtml();
$htmlFragment = str_replace('\"', '"', $htmlFragment);
$contains = strpos($html, $htmlFragment) !== false;
$htmlFragment = str_replace('\"', '"', $htmlFragment ?? '');
$contains = strpos($html ?? '', $htmlFragment ?? '') !== false;
if ($not) {
Assert::assertFalse($contains, "HTML fragment {$htmlFragment} was in rendered HTML when it should not have been");
} else {
@ -1463,18 +1463,18 @@ JS;
return;
}
$modifier = null;
$pos = strpos($keyCombo, '-');
$pos = strpos($keyCombo ?? '', '-');
if ($pos !== false && $pos !== 0) {
list($modifier, $char) = explode('-', $keyCombo);
list($modifier, $char) = explode('-', $keyCombo ?? '');
} else {
$char = $keyCombo;
}
// handle special chars e.g. "space"
if (defined(WebDriverKeys::class . '::' . strtoupper($char))) {
$char = constant(WebDriverKeys::class . '::' . strtoupper($char));
if (defined(WebDriverKeys::class . '::' . strtoupper($char ?? ''))) {
$char = constant(WebDriverKeys::class . '::' . strtoupper($char ?? ''));
}
if ($modifier) {
$modifier = strtoupper($modifier);
$modifier = strtoupper($modifier ?? '');
if (defined(WebDriverKeys::class . '::' . $modifier)) {
$modifier = constant(WebDriverKeys::class . '::' . $modifier);
} else {
@ -1495,13 +1495,13 @@ JS;
{
Assert::assertNotNull($this->fixtureContext, 'FixtureContext was not found so cannot know location of fixture files');
$path = $this->fixtureContext->getFilesPath() . '/' . $filename;
$path = str_replace('//', '/', $path);
$path = str_replace('//', '/', $path ?? '');
Assert::assertNotEmpty($path, 'Fixture files path is empty');
$field = $this->getElement($locator);
$filesPath = $this->fixtureContext->getFilesPath();
if ($filesPath) {
$fullPath = rtrim(realpath($filesPath), DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $path;
if (is_file($fullPath)) {
$fullPath = rtrim(realpath($filesPath ?? '') ?? '', DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $path;
if (is_file($fullPath ?? '')) {
$path = $fullPath;
}
}
@ -1526,12 +1526,12 @@ JS;
}
Assert::assertNotNull($link, "Link {$locator} was not found");
$html = $link->getOuterHtml();
preg_match('#href=([\'"])#', $html, $m);
preg_match('#href=([\'"])#', $html ?? '', $m);
$q = $m[1];
preg_match("#href={$q}(.+?){$q}#", $html, $m);
$href = str_replace("'", "\\'", $m[1]);
if (strpos($href, 'http') !== 0) {
$href = rtrim($href, '/');
preg_match("#href={$q}(.+?){$q}#", $html ?? '', $m);
$href = str_replace("'", "\\'", $m[1] ?? '');
if (strpos($href ?? '', 'http') !== 0) {
$href = rtrim($href ?? '', '/');
$href = "/{$href}";
}
$this->getSession()->executeScript("document.location.href = '{$href}';");

View File

@ -66,7 +66,7 @@ class EmailContext implements Context
$to = ($direction == 'to') ? $email : null;
$from = ($direction == 'from') ? $email : null;
$match = $this->mailer->findEmail($to, $from);
if (trim($negate)) {
if (trim($negate ?? '')) {
Assert::assertNull($match);
} else {
Assert::assertNotNull($match);
@ -90,7 +90,7 @@ class EmailContext implements Context
$allTitles = $allMails ? '"' . implode('","', array_map(function ($email) {
return $email->Subject;
}, $allMails)) . '"' : null;
if (trim($negate)) {
if (trim($negate ?? '')) {
Assert::assertNull($match);
} else {
$msg = sprintf(
@ -130,7 +130,7 @@ class EmailContext implements Context
$emailContent = $email->PlainContent;
}
if (trim($negate)) {
if (trim($negate ?? '')) {
Assert::assertStringNotContainsString($content, $emailContent);
} else {
Assert::assertStringContainsString($content, $emailContent);
@ -154,8 +154,8 @@ class EmailContext implements Context
$email = $this->lastMatchedEmail;
$emailContent = ($email->Content) ? ($email->Content) : ($email->PlainContent);
$emailPlainText = strip_tags($emailContent);
$emailPlainText = preg_replace("/\h+/", " ", $emailPlainText);
$emailPlainText = strip_tags($emailContent ?? '');
$emailPlainText = preg_replace("/\h+/", " ", $emailPlainText ?? '');
Assert::assertStringContainsString($content, $emailPlainText);
}
@ -259,12 +259,12 @@ class EmailContext implements Context
$emailContent = $email->PlainContent;
}
// Convert html content to plain text
$emailContent = strip_tags($emailContent);
$emailContent = preg_replace("/\h+/", " ", $emailContent);
$emailContent = strip_tags($emailContent ?? '');
$emailContent = preg_replace("/\h+/", " ", $emailContent ?? '');
$rows = $table->getRows();
// For "should not contain"
if (trim($negate)) {
if (trim($negate ?? '')) {
foreach ($rows as $row) {
Assert::assertStringNotContainsString($row[0], $emailContent);
}
@ -283,7 +283,7 @@ class EmailContext implements Context
public function thereIsAnEmailTitled($negate, $subject)
{
$match = $this->mailer->findEmail(null, null, $subject);
if (trim($negate)) {
if (trim($negate ?? '')) {
Assert::assertNull($match);
} else {
$msg = sprintf(
@ -307,7 +307,7 @@ class EmailContext implements Context
}
$match = $this->lastMatchedEmail;
if (trim($negate)) {
if (trim($negate ?? '')) {
Assert::assertStringNotContainsString($from, $match->From);
} else {
Assert::assertStringContainsString($from, $match->From);
@ -326,7 +326,7 @@ class EmailContext implements Context
}
$match = $this->lastMatchedEmail;
if (trim($negate)) {
if (trim($negate ?? '')) {
Assert::assertStringNotContainsString($to, $match->To);
} else {
Assert::assertStringContainsString($to, $match->To);
@ -355,7 +355,7 @@ class EmailContext implements Context
$href = null;
foreach ($tags as $tag) {
$linkText = $tag->nodeValue;
if (strpos($linkText, $httpText) !== false) {
if (strpos($linkText ?? '', $httpText ?? '') !== false) {
$href = $linkText;
break;
}

View File

@ -257,12 +257,12 @@ class FixtureContext implements Context
$class = $this->convertTypeToClass($type);
preg_match_all(
'/"(?<key>[^"]+)"\s*=\s*"(?<value>[^"]+)"/',
$data,
$data ?? '',
$matches
);
$fields = $this->convertFields(
$class,
array_combine($matches['key'], $matches['value'])
array_combine($matches['key'] ?? [], $matches['value'] ?? [])
);
$fields = $this->prepareFixture($class, $id, $fields);
// We should check if this fixture object already exists - if it does, we update it. If not, we create it
@ -403,20 +403,20 @@ class FixtureContext implements Context
$manyField = null;
$oneField = null;
if ($relationObj->manyMany()) {
$manyField = array_search($class, $relationObj->manyMany());
if ($manyField && strlen($relationName) > 0) {
$manyField = array_search($class, $relationObj->manyMany() ?? []);
if ($manyField && strlen($relationName ?? '') > 0) {
$manyField = $relationName;
}
}
if (empty($manyField) && $relationObj->hasMany(true)) {
$manyField = array_search($class, $relationObj->hasMany());
if ($manyField && strlen($relationName) > 0) {
$manyField = array_search($class, $relationObj->hasMany() ?? []);
if ($manyField && strlen($relationName ?? '') > 0) {
$manyField = $relationName;
}
}
if (empty($manyField) && $relationObj->hasOne()) {
$oneField = array_search($class, $relationObj->hasOne());
if ($oneField && strlen($relationName) > 0) {
$oneField = array_search($class, $relationObj->hasOne() ?? []);
if ($oneField && strlen($relationName ?? '') > 0) {
$oneField = $relationName;
}
}
@ -555,12 +555,12 @@ class FixtureContext implements Context
{
preg_match_all(
'/"(?<key>[^"]+)"\s*=\s*"(?<value>[^"]+)"/',
$data,
$data ?? '',
$matches
);
$fields = $this->convertFields(
Member::class,
array_combine($matches['key'], $matches['value'])
array_combine($matches['key'] ?? [], $matches['value'] ?? [])
);
/** @var Group $group */
@ -587,7 +587,7 @@ class FixtureContext implements Context
public function stepCreateGroupWithPermissions($id, $permissionStr)
{
// Convert natural language permissions to codes
preg_match_all('/"([^"]+)"/', $permissionStr, $matches);
preg_match_all('/"([^"]+)"/', $permissionStr ?? '', $matches);
$permissions = $matches[1];
$codes = Permission::get_codes(false);
@ -652,7 +652,7 @@ class FixtureContext implements Context
{
// Validate the extension
Assert::assertTrue(
class_exists($extension) && is_subclass_of($extension, Extension::class),
class_exists($extension ?? '') && is_subclass_of($extension, Extension::class),
'Given extension does not extend Extension'
);
@ -662,7 +662,7 @@ class FixtureContext implements Context
$targetClass::add_extension($extension);
// Write config for this extension too...
$snakedExtension = strtolower(str_replace('\\', '-', $extension));
$snakedExtension = strtolower(str_replace('\\', '-', $extension ?? '') ?? '');
$config = <<<YAML
---
Name: testonly-enable-extension-$snakedExtension
@ -674,7 +674,7 @@ YAML;
$filename = 'enable-' . $snakedExtension . '.yml';
$destPath = $this->getDestinationConfigFolder($filename);
file_put_contents($destPath, $config);
file_put_contents($destPath ?? '', $config);
// Remember to cleanup...
$this->activatedConfigFiles[] = $destPath;
@ -741,8 +741,8 @@ YAML;
*/
public function lookupFixtureReference($string)
{
if (preg_match('/^=>/', $string)) {
list($className, $identifier) = explode('.', preg_replace('/^=>/', '', $string), 2);
if (preg_match('/^=>/', $string ?? '')) {
list($className, $identifier) = explode('.', preg_replace('/^=>/', '', $string ?? '') ?? '', 2);
$id = $this->getFixtureFactory()->getId($className, $identifier);
if (!$id) {
throw new InvalidArgumentException(sprintf(
@ -768,7 +768,7 @@ YAML;
$class = $this->convertTypeToClass($type);
$fields = $this->prepareFixture($class, $id);
$record = $this->getFixtureFactory()->createObject($class, $id, $fields);
$date = date("Y-m-d H:i:s", strtotime($time));
$date = date("Y-m-d H:i:s", strtotime($time ?? ''));
$table = $record->baseTable();
$field = ($mod == 'created') ? 'Created' : 'LastEdited';
DB::prepared_query(
@ -821,8 +821,8 @@ YAML;
$relativeTargetPath = (isset($data['Filename'])) ? $data['Filename'] : $identifier;
$relativeTargetPath = preg_replace('/^' . ASSETS_DIR . '\/?/', '', $relativeTargetPath);
$sourcePath = $this->joinPaths($this->getFilesPath(), basename($relativeTargetPath));
$relativeTargetPath = preg_replace('/^' . ASSETS_DIR . '\/?/', '', $relativeTargetPath ?? '');
$sourcePath = $this->joinPaths($this->getFilesPath(), basename($relativeTargetPath ?? ''));
// Create file or folder on filesystem
if ($class == 'SilverStripe\\Assets\\Folder' || is_subclass_of($class, 'SilverStripe\\Assets\\Folder')) {
@ -830,7 +830,7 @@ YAML;
$data['ID'] = $parent->ID;
} else {
// Check file exists
if (!file_exists($sourcePath)) {
if (!file_exists($sourcePath ?? '')) {
throw new InvalidArgumentException(sprintf(
'Source file for "%s" cannot be found in "%s"',
$relativeTargetPath,
@ -840,8 +840,8 @@ YAML;
// Get parent
$parentID = 0;
if (strstr($relativeTargetPath, '/')) {
$folderName = dirname($relativeTargetPath);
if (strstr($relativeTargetPath ?? '', '/')) {
$folderName = dirname($relativeTargetPath ?? '');
$parent = Folder::find_or_make($folderName);
if ($parent) {
$parentID = $parent->ID;
@ -865,7 +865,7 @@ YAML;
$data['FileVariant'] = $asset['Variant'];
}
if (!isset($data['Name'])) {
$data['Name'] = basename($relativeTargetPath);
$data['Name'] = basename($relativeTargetPath ?? '');
}
// Save assets
@ -894,17 +894,17 @@ YAML;
*/
protected function convertTypeToClass($type)
{
$type = trim($type);
$type = trim($type ?? '');
// Try direct mapping
$class = str_replace(' ', '', ucwords($type));
if (class_exists($class) && is_subclass_of($class, DataObject::class)) {
$class = str_replace(' ', '', ucwords($type ?? ''));
if (class_exists($class ?? '') && is_subclass_of($class, DataObject::class)) {
return ClassInfo::class_name($class);
}
// Fall back to singular names
foreach (array_values(ClassInfo::subclassesFor(DataObject::class)) as $candidate) {
if (class_exists($candidate) && strcasecmp(singleton($candidate)->singular_name(), $type) === 0) {
foreach (array_values(ClassInfo::subclassesFor(DataObject::class) ?? []) as $candidate) {
if (class_exists($candidate ?? '') && strcasecmp(singleton($candidate)->singular_name() ?? '', $type ?? '') === 0) {
return $candidate;
}
}
@ -927,7 +927,7 @@ YAML;
{
$labels = singleton($class)->fieldLabels();
foreach ($fields as $fieldName => $fieldVal) {
if ($fieldLabelKey = array_search($fieldName, $labels)) {
if ($fieldLabelKey = array_search($fieldName, $labels ?? [])) {
unset($fields[$fieldName]);
$fields[$labels[$fieldLabelKey]] = $fieldVal;
}
@ -943,9 +943,9 @@ YAML;
$paths = array_merge($paths, (array)$arg);
}
foreach ($paths as &$path) {
$path = trim($path, '/');
$path = trim($path ?? '', '/');
}
if (substr($args[0], 0, 1) == '/') {
if (substr($args[0] ?? '', 0, 1) == '/') {
$paths[0] = '/' . $paths[0];
}
return join('/', $paths);
@ -959,8 +959,8 @@ YAML;
}
foreach ($this->activatedConfigFiles as $configFile) {
if (file_exists($configFile)) {
unlink($configFile);
if (file_exists($configFile ?? '')) {
unlink($configFile ?? '');
}
}
$this->activatedConfigFiles = [];

View File

@ -32,7 +32,7 @@ class LoginContext implements Context
$this->getMainContext()->getSession()->visit($adminUrl);
if (0 == strpos($this->getMainContext()->getSession()->getCurrentUrl(), $loginUrl)) {
if (0 == strpos($this->getMainContext()->getSession()->getCurrentUrl() ?? '', $loginUrl ?? '')) {
$this->stepILogInWith('admin', 'password');
Assert::assertStringStartsWith($adminUrl, $this->getMainContext()->getSession()->getCurrentUrl());
}

View File

@ -191,7 +191,7 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
$regionObj = $this->getSession()->getPage()->find(
'css',
// Escape CSS selector
(false !== strpos($region, "'")) ? str_replace("'", "\\'", $region) : $region
(false !== strpos($region ?? '', "'")) ? str_replace("'", "\\'", $region) : $region
);
if ($regionObj) {
return $regionObj;
@ -203,7 +203,7 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
// Fall back to region identified by data-title.
// Only apply if no double quotes exist in search string,
// which would break the CSS selector.
if (false === strpos($region, '"')) {
if (false === strpos($region ?? '', '"')) {
$regionObj = $this->getSession()->getPage()->find(
'css',
'[data-title="' . $region . '"]'
@ -217,7 +217,7 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
if (!$this->regionMap) {
throw new \LogicException("Cannot find 'region_map' in the behat.yml");
}
if (!array_key_exists($region, $this->regionMap)) {
if (!array_key_exists($region, $this->regionMap ?? [])) {
throw new \LogicException("Cannot find the specified region in the behat.yml");
}
$regionObj = $this->getSession()->getPage()->find('css', $region);
@ -265,7 +265,7 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
}
if ($screenSize = Environment::getEnv('BEHAT_SCREEN_SIZE')) {
list($screenWidth, $screenHeight) = explode('x', $screenSize);
list($screenWidth, $screenHeight) = explode('x', $screenSize ?? '');
$this->getSession()->resizeWindow((int)$screenWidth, (int)$screenHeight);
} else {
$this->getSession()->resizeWindow(1024, 768);
@ -312,7 +312,7 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
public function getTestSessionState()
{
$extraParams = array();
parse_str(Environment::getEnv('TESTSESSION_PARAMS'), $extraParams);
parse_str(Environment::getEnv('TESTSESSION_PARAMS') ?? '', $extraParams);
return array_merge(
array(
'database' => $this->databaseName,
@ -330,13 +330,13 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
*/
public function parseUrl($url)
{
$url = parse_url($url);
$url = parse_url($url ?? '');
$url['vars'] = array();
if (!isset($url['fragment'])) {
$url['fragment'] = null;
}
if (isset($url['query'])) {
parse_str($url['query'], $url['vars']);
parse_str($url['query'] ?? '', $url['vars']);
}
return $url;
@ -401,7 +401,7 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
$parts = func_get_args();
$trimSlashes = function (&$part) {
$part = trim($part, '/');
$part = trim($part ?? '', '/');
};
array_walk($parts, $trimSlashes);
@ -600,7 +600,7 @@ abstract class SilverStripeContext extends MinkContext implements SilverStripeAw
$value = $field->getValue();
$newValue = $opt->getAttribute('value');
if (is_array($value)) {
if (!in_array($newValue, $value)) {
if (!in_array($newValue, $value ?? [])) {
$value[] = $newValue;
}
} else {

View File

@ -17,8 +17,8 @@ trait ModuleCommandTrait
*/
protected function getModule($name, $error = true)
{
if (strpos($name, '@') === 0) {
$name = substr($name, 1);
if (strpos($name ?? '', '@') === 0) {
$name = substr($name ?? '', 1);
}
$module = ModuleLoader::inst()->getManifest()->getModule($name);
if (!$module && $error) {

View File

@ -139,10 +139,10 @@ class ModuleInitialisationController implements Controller
// Create feature_path
$features = $this->container->getParameter('silverstripe_extension.context.features_path');
$fullPath = $module->getResourcePath($features);
if (is_dir($fullPath)) {
if (is_dir($fullPath ?? '')) {
return;
}
mkdir($fullPath, 0777, true);
mkdir($fullPath ?? '', 0777, true);
$output->writeln(
"<info>{$fullPath}</info> - <comment>place your *.feature files here</comment>"
);
@ -165,13 +165,13 @@ class ModuleInitialisationController implements Controller
{
$classesPath = $this->container->getParameter('silverstripe_extension.context.class_path');
$dirPath = $module->getResourcePath($classesPath);
if (!is_dir($dirPath)) {
mkdir($dirPath, 0777, true);
if (!is_dir($dirPath ?? '')) {
mkdir($dirPath ?? '', 0777, true);
}
// Scaffold base context file
$classPath = "{$dirPath}/FeatureContext.php";
if (is_file($classPath)) {
if (is_file($classPath ?? '')) {
return;
}
@ -185,7 +185,7 @@ class ModuleInitialisationController implements Controller
'ClassName' => $class,
]);
$classContent = $obj->renderWith(__DIR__.'/../../templates/FeatureContext.ss');
file_put_contents($classPath, $classContent);
file_put_contents($classPath ?? '', $classContent);
// Log
$output->writeln(
@ -194,12 +194,12 @@ class ModuleInitialisationController implements Controller
// Add to composer json
$composerFile = $module->getResourcePath('composer.json');
if (!file_exists($composerFile)) {
if (!file_exists($composerFile ?? '')) {
return;
}
// Add autoload directive to composer
$composerData = json_decode(file_get_contents($composerFile), true);
$composerData = json_decode(file_get_contents($composerFile ?? '') ?? '', true);
if (json_last_error()) {
throw new Exception(json_last_error_msg());
}
@ -211,7 +211,7 @@ class ModuleInitialisationController implements Controller
}
$composerData['autoload']['psr-4']["{$fullNamespace}\\"] = $classesPath;
file_put_contents(
$composerFile,
$composerFile ?? '',
json_encode($composerData, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES)
);
@ -239,7 +239,7 @@ class ModuleInitialisationController implements Controller
protected function getFixtureNamespace($namespaceRoot)
{
$namespaceSuffix = $this->container->getParameter('silverstripe_extension.context.namespace_suffix');
return trim($namespaceRoot, '/\\') . '\\' . $namespaceSuffix;
return trim($namespaceRoot ?? '', '/\\') . '\\' . $namespaceSuffix;
}
/**
@ -252,7 +252,7 @@ class ModuleInitialisationController implements Controller
protected function initConfig($output, $module, $namespaceRoot)
{
$configPath = $module->getResourcePath('behat.yml');
if (file_exists($configPath)) {
if (file_exists($configPath ?? '')) {
return;
}
$class = $this->getFixtureClass($namespaceRoot);
@ -279,7 +279,7 @@ class ModuleInitialisationController implements Controller
]
]
];
file_put_contents($configPath, Yaml::dump($data, 99999999, 2));
file_put_contents($configPath ?? '', Yaml::dump($data, 99999999, 2));
$output->writeln(
"<info>{$configPath}</info> - <comment>default behat.yml created</comment>"

View File

@ -158,7 +158,7 @@ class ModuleSuiteLocator implements Controller
// Find all candidate paths
foreach ([ "{$path}/", "{$path}/{$pathSuffix}"] as $parent) {
foreach ([$parent.'behat.yml', $parent.'.behat.yml'] as $candidate) {
if (file_exists($candidate)) {
if (file_exists($candidate ?? '')) {
return $candidate;
}
}
@ -178,7 +178,7 @@ class ModuleSuiteLocator implements Controller
{
$path = $this->findModuleConfig($module);
$yamlParser = new Parser();
$config = $yamlParser->parse(file_get_contents($path));
$config = $yamlParser->parse(file_get_contents($path ?? ''));
if (empty($config['default']['suites'][$suite])) {
throw new Exception("Path {$path} does not contain default.suites.{$suite} config");
}

View File

@ -63,7 +63,7 @@ class Extension implements ExtensionInterface
];
foreach ($options as $file) {
if (file_exists($file)) {
if (file_exists($file ?? '')) {
require_once $file;
$found = true;
break;

View File

@ -118,9 +118,9 @@ trait DebugTools
// prefix with zz_ so that it alpha sorts in the directory lower than screenshots which
// will typically be referred to far more often. This is mainly for when you have
// enabled `dumpRenderedHtmlAfterEveryStep`
$path = sprintf('%s/zz_%s_%d.html', $path, basename($feature->getFile()), $step->getLine());
$path = sprintf('%s/zz_%s_%d.html', $path, basename($feature->getFile() ?? ''), $step->getLine());
$html = $this->getSession()->getPage()->getOuterHtml();
file_put_contents($path, $html);
file_put_contents($path ?? '', $html);
$this->logMessage(sprintf('Saving HTML into %s', $path));
}
@ -143,9 +143,9 @@ trait DebugTools
if (!$path) {
return;
}
$path = sprintf('%s/%s_%d.png', $path, basename($feature->getFile()), $step->getLine());
$path = sprintf('%s/%s_%d.png', $path, basename($feature->getFile() ?? ''), $step->getLine());
$screenshot = $driver->getScreenshot();
file_put_contents($path, $screenshot);
file_put_contents($path ?? '', $screenshot);
$this->logMessage(sprintf('Saving screenshot into %s', $path));
}
@ -161,16 +161,16 @@ trait DebugTools
return;
}
Filesystem::makeFolder($path);
$path = realpath($path);
if (!file_exists($path)) {
$path = realpath($path ?? '');
if (!file_exists($path ?? '')) {
$this->logMessage(sprintf('"%s" is not valid directory and failed to create it', $path));
return;
}
if (file_exists($path) && !is_dir($path)) {
if (file_exists($path ?? '') && !is_dir($path ?? '')) {
$this->logMessage(sprintf('"%s" is not valid directory', $path));
return;
}
if (file_exists($path) && !is_writable($path)) {
if (file_exists($path ?? '') && !is_writable($path ?? '')) {
$this->logMessage(sprintf('"%s" directory is not writable', $path));
return;
}

View File

@ -112,10 +112,10 @@ class RetryableCallHandler implements CallHandler
// Determine whether to call with retries
if ($retry) {
$return = $this->retryThrowable(function () use ($callable, $arguments) {
return call_user_func_array($callable, $arguments);
return call_user_func_array($callable, $arguments ?? []);
}, $this->retrySeconds);
} else {
$return = call_user_func_array($callable, $arguments);
$return = call_user_func_array($callable, $arguments ?? []);
}
} catch (Exception $caught) {
$exception = $caught;
@ -144,7 +144,7 @@ class RetryableCallHandler implements CallHandler
private function startErrorAndOutputBuffering(Call $call)
{
$errorReporting = $call->getErrorReportingLevel() ? : $this->errorReportingLevel;
set_error_handler(array($this, 'handleError'), $errorReporting);
set_error_handler(array($this, 'handleError'), $errorReporting ?? 0);
$this->obStarted = ob_start();
}

View File

@ -38,7 +38,7 @@ class TestMailer extends BaseTestMailer
{
$matches = $this->findEmails($to, $from, $subject, $content);
//got the count of matches emails
$emailCount = count($matches);
$emailCount = count($matches ?? []);
//get the last(latest) one
return $matches ? $matches[$emailCount-1] : null;
}
@ -70,7 +70,7 @@ class TestMailer extends BaseTestMailer
$value = (isset($args[$i])) ? $args[$i] : null;
if ($value) {
if ($value[0] == '/') {
$matched = preg_match($value, $email->$field);
$matched = preg_match($value ?? '', $email->$field ?? '');
} else {
$matched = ($value == $email->$field);
}
@ -93,7 +93,7 @@ class TestMailer extends BaseTestMailer
if (!isset($state->emails)) {
$state->emails = array();
}
$state->emails[] = array_filter($data);
$state->emails[] = array_filter($data ?? []);
$this->testSessionEnvironment->applyState($state);
}
}