%PDF- %PDF-
Direktori : /home/silvzytp/dsr_code/vendor/laravel/framework/src/Illuminate/Testing/Fluent/ |
Current File : //home/silvzytp/dsr_code/vendor/laravel/framework/src/Illuminate/Testing/Fluent/AssertableJson.php |
<?php namespace Illuminate\Testing\Fluent; use Closure; use Illuminate\Contracts\Support\Arrayable; use Illuminate\Support\Arr; use Illuminate\Support\Traits\Macroable; use Illuminate\Support\Traits\Tappable; use Illuminate\Testing\AssertableJsonString; use PHPUnit\Framework\Assert as PHPUnit; class AssertableJson implements Arrayable { use Concerns\Has, Concerns\Matching, Concerns\Debugging, Concerns\Interaction, Macroable, Tappable; /** * The properties in the current scope. * * @var array */ private $props; /** * The "dot" path to the current scope. * * @var string|null */ private $path; /** * Create a new fluent, assertable JSON data instance. * * @param array $props * @param string|null $path * @return void */ protected function __construct(array $props, string $path = null) { $this->path = $path; $this->props = $props; } /** * Compose the absolute "dot" path to the given key. * * @param string $key * @return string */ protected function dotPath(string $key = ''): string { if (is_null($this->path)) { return $key; } return rtrim(implode('.', [$this->path, $key]), '.'); } /** * Retrieve a prop within the current scope using "dot" notation. * * @param string|null $key * @return mixed */ protected function prop(string $key = null) { return Arr::get($this->props, $key); } /** * Instantiate a new "scope" at the path of the given key. * * @param string $key * @param \Closure $callback * @return $this */ protected function scope(string $key, Closure $callback): self { $props = $this->prop($key); $path = $this->dotPath($key); PHPUnit::assertIsArray($props, sprintf('Property [%s] is not scopeable.', $path)); $scope = new static($props, $path); $callback($scope); $scope->interacted(); return $this; } /** * Instantiate a new "scope" on the first child element. * * @param \Closure $callback * @return $this */ public function first(Closure $callback): self { $props = $this->prop(); $path = $this->dotPath(); PHPUnit::assertNotEmpty($props, $path === '' ? 'Cannot scope directly onto the first element of the root level because it is empty.' : sprintf('Cannot scope directly onto the first element of property [%s] because it is empty.', $path) ); $key = array_keys($props)[0]; $this->interactsWith($key); return $this->scope($key, $callback); } /** * Instantiate a new "scope" on each child element. * * @param \Closure $callback * @return $this */ public function each(Closure $callback): self { $props = $this->prop(); $path = $this->dotPath(); PHPUnit::assertNotEmpty($props, $path === '' ? 'Cannot scope directly onto each element of the root level because it is empty.' : sprintf('Cannot scope directly onto each element of property [%s] because it is empty.', $path) ); foreach (array_keys($props) as $key) { $this->interactsWith($key); $this->scope($key, $callback); } return $this; } /** * Create a new instance from an array. * * @param array $data * @return static */ public static function fromArray(array $data): self { return new static($data); } /** * Create a new instance from an AssertableJsonString. * * @param \Illuminate\Testing\AssertableJsonString $json * @return static */ public static function fromAssertableJsonString(AssertableJsonString $json): self { return static::fromArray($json->json()); } /** * Get the instance as an array. * * @return array */ public function toArray() { return $this->props; } }