| 
<?php
 /*
 * This file is part of Chevere.
 *
 * (c) Rodolfo Berrios <[email protected]>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */
 
 declare(strict_types=1);
 
 namespace Chevere\Xr\Tests;
 
 use Chevere\Writer\Interfaces\WriterInterface;
 use function Chevere\Writer\streamTemp;
 use Chevere\Writer\StreamWriter;
 use function Chevere\Xr\getWriter;
 use Chevere\Xr\XrMessage;
 use PHPUnit\Framework\TestCase;
 use Ramsey\Uuid\Rfc4122\Validator;
 
 final class XrMessageTest extends TestCase
 {
 private WriterInterface $writer;
 
 private function filterArray(array $array, string ...$filterKey): array
 {
 return array_intersect_key($array, array_flip($filterKey));
 }
 
 protected function setUp(): void
 {
 $this->writer = new StreamWriter(streamTemp(''));
 }
 
 public function testEmptyBacktrace(): void
 {
 $message = new XrMessage();
 $line = __LINE__ - 1;
 $this->assertTrue((new Validator())->validate($message->id()));
 $this->assertSame(__FILE__, $message->filePath());
 $this->assertSame($line, $message->fileLine());
 $this->assertInstanceOf(WriterInterface::class, $message->writer());
 $this->assertSame(
 [
 'body' => '',
 'file_path' => __FILE__,
 'file_line' => strval($line),
 'emote' => '',
 'topic' => '',
 'id' => $message->id(),
 ],
 $message->toArray()
 );
 }
 
 public function testDeclaredBacktrace(): void
 {
 $testFile = 'test';
 $testLine = 1234;
 $trace = [
 [
 'file' => $testFile,
 'line' => $testLine,
 ],
 ];
 $message = new XrMessage($trace);
 $this->assertSame($testFile, $message->filePath());
 $this->assertSame($testLine, $message->fileLine());
 $this->assertSame(
 [
 'file_path' => $testFile,
 'file_line' => strval($testLine),
 ],
 $this->filterArray($message->toArray(), 'file_path', 'file_line')
 );
 }
 
 public function testWithBody(): void
 {
 $message = new XrMessage();
 $body = 'the body';
 $withBody = $message->withBody($body);
 $this->assertNotSame($message, $withBody);
 $this->assertSame($body, $withBody->body());
 $this->assertSame($body, $withBody->toArray()['body']);
 }
 
 public function testWithTopic(): void
 {
 $message = new XrMessage();
 $topic = 'Topic';
 $withTopic = $message->withTopic($topic);
 $this->assertNotSame($message, $withTopic);
 $this->assertSame(
 $topic,
 $withTopic->topic()
 );
 $this->assertSame(
 $topic,
 $withTopic->toArray()['topic']
 );
 }
 
 public function testWithEmote(): void
 {
 $message = new XrMessage();
 $emote = '?';
 $withEmote = $message->withEmote($emote);
 $this->assertNotSame($message, $withEmote);
 $this->assertSame(
 $emote,
 $withEmote->emote()
 );
 $this->assertSame(
 $emote,
 $withEmote->toArray()['emote']
 );
 }
 
 public function testWithWriter(): void
 {
 $message = new XrMessage();
 $writer = new StreamWriter(streamTemp('test'));
 $withWriter = $message->withWriter($writer);
 $this->assertNotSame($message, $withWriter);
 $this->assertSame(
 $writer,
 $withWriter->writer()
 );
 }
 
 public function testWithVars(): void
 {
 $message = (new XrMessage())->withWriter(getWriter());
 $var = 'Hola, mundo!';
 $length = strlen($var);
 $withVars = $message->withVars($var);
 $this->assertNotSame($message, $withVars);
 $this->assertSame(
 $var,
 $withVars->vars()[0]
 );
 $this->assertSame('<div class="dump"><pre>
 Arg:0 <span style="color:#ff8700">string</span> ' . $var . ' <em><span style="color:rgb(108 108 108 / 65%);">(length=' . $length . ')</span></em></pre></div>', $withVars->toArray()['body']);
 }
 
 public function testWithBacktraceFlag(): void
 {
 $message = new XrMessage();
 $line = strval(__LINE__ - 1);
 $this->assertFalse($message->isEnableBacktrace());
 $withBacktraceFlag = $message->withFlags(XR_BACKTRACE);
 $this->assertNotSame($message, $withBacktraceFlag);
 $this->assertTrue($withBacktraceFlag->isEnableBacktrace());
 $this->assertStringContainsString(
 '<div class="backtrace">',
 $withBacktraceFlag->toArray()['body']
 );
 $this->assertStringContainsString(
 __FILE__ . ':' . $line,
 $withBacktraceFlag->toArray()['body']
 );
 }
 }
 
 |