BiFace_Server_Lite/vendor/codeception/specify/src/Codeception/Specify/ConfigBuilder.php
2020-03-27 10:13:51 +07:00

172 lines
4.4 KiB
PHP

<?php
namespace Codeception\Specify;
/**
* Configure Specify usage.
*
* Specify copies properties of object and restores them for each specify block.
* Objects can be cloned deeply or using standard `clone` operator.
* Specify can be configured to prevent specific properties in specify blocks, to choose default cloning method,
* or cloning method for specific properties.
*
* ```php
* <?php
* $this->specifyConfig()
* ->ignore('user') // do not clone
* ?>
* ```
*/
class ConfigBuilder
{
/**
* @var Config
*/
protected $config;
public function __construct(Config $config = null)
{
$this->config = $config;
if (!$config) {
$this->config = Config::create();
}
}
/**
* Ignore cloning specific object properties in specify blocks.
*
* ```php
* <?php
* $this->user = new User;
* $this->specifyConfig()->ignore('user');
* $this->specify('change user name', function() {
* $this->user->name = 'davert';
* });
* $this->user->name == 'davert'; // name changed
* ?>
* ```
*
* @param array $properties
* @return $this
*/
public function ignore($properties = array())
{
if (!is_array($properties)) {
$properties = func_get_args();
}
$this->config->ignore = array_merge($this->config->ignore, $properties);
return $this;
}
/**
* Adds specific class to ignore list, if property is an instance of class it will not be cloned for specify block.
*
* @param array $classes
* @return $this
*/
public function ignoreClasses($classes = array())
{
$this->config->ignore_classes = array_merge($this->config->ignore_classes, $classes);
return $this;
}
/**
* Turn on/off deep cloning mode.
* Deep cloning mode can also be specified for specific properties.
*
* ```php
* <?php
* $this->user = new User;
* $this->post = new Post;
* $this->tag = new Tag;
*
* // turn on deep cloning by default
* $this->specifyConfig()->deepClone();
*
* // turn off deep cloning by default
* $this->specifyConfig()->deepClone(false);
*
* // deep clone only user and tag property
* $this->specifyConfig()->deepClone('user', 'tag');
*
* // alternatively
* $this->specifyConfig()->deepClone(['user', 'tag']);
* ?>
* ```
*
* @param bool $properties
* @return $this
*/
public function deepClone($properties = true)
{
if (is_bool($properties)) {
$this->config->is_deep = $properties;
return $this;
}
if (!is_array($properties)) {
$properties = func_get_args();
}
$this->config->deep = $properties;
return $this;
}
/**
* Disable deep cloning mode, use shallow cloning by default, which is faster.
* Deep cloning mode can also be disabled for specific properties.
*
* ```php
* <?php
* $this->user = new User;
* $this->post = new Post;
* $this->tag = new Tag;
*
* // turn off deep cloning by default
* $this->specifyConfig()->shallowClone();
*
* // turn on deep cloning by default
* $this->specifyConfig()->shallowClone(false);
*
* // shallow clone only user and tag property
* $this->specifyConfig()->shallowClone('user', 'tag');
*
* // alternatively
* $this->specifyConfig()->shallowClone(['user', 'tag']);
* ?>
* ```
*
* @param bool $properties
* @return $this
*/
public function shallowClone($properties = true)
{
if (is_bool($properties)) {
$this->config->is_deep = !$properties;
return $this;
}
if (!is_array($properties)) {
$properties = func_get_args();
}
$this->config->shallow = array_merge($this->config->shallow, $properties);
return $this;
}
/**
* Clone only specific properties
*
* ```php
* <?php
* $this->specifyConfig()->cloneOnly('user', 'post');
* ?>
* ```
*
* @param $properties
* @return $this
*/
public function cloneOnly($properties)
{
if (!is_array($properties)) {
$properties = func_get_args();
}
$this->config->only = $properties;
return $this;
}
}