<?php

declare(strict_types=1);
namespace Tests\Adawolfa\ISDOC;
use Adawolfa\ISDOC\RuntimeException;
use PHPUnit\Framework\TestCase;
use Adawolfa\ISDOC\Data;

final class DataTest extends TestCase
{

	public function testGetValue(): void
	{
		$data = Data::create(['value' => 'string']);
		$this->assertTrue($data->hasValue('value'));
		$value = $data->getValue('value');
		$this->assertSame('string', $value->toString());
	}

	public function testNonExistentValue(): void
	{
		$data = Data::create([]);
		$this->assertFalse($data->hasValue('value'));
		$value = $data->getValue('value');
		$this->assertNull($value->toString());
	}

	public function testGetChild(): void
	{
		$data = Data::create(['child' => ['value' => 'string']]);
		$this->assertTrue($data->hasChild('child'));
		$child = $data->getChild('child');
		$value = $child->getValue('value');
		$this->assertSame('string', $value->toString());
	}

	public function testNonExistentChild(): void
	{
		$this->expectException(RuntimeException::class);
		$data = Data::create([]);
		$this->assertFalse($data->hasChild('child'));
		$data->getChild('child');
	}

	public function testGetChildListFromOne(): void
	{
		$data = Data::create(['item' => ['a' => 'string']]);
		$list = $data->getChildList('item');
		$this->assertCount(1, $list);
		$this->assertSame('string', $list[0]->getValue('a')->toString());
	}

	public function testGetChildListFromMultiple(): void
	{
		$data = Data::create(['item' => [['a' => 'string1'], ['a' => 'string2']]]);
		$list = $data->getChildList('item');
		$this->assertCount(2, $list);
		$this->assertSame('string1', $list[0]->getValue('a')->toString());
		$this->assertSame('string2', $list[1]->getValue('a')->toString());
	}

	public function testPath(): void
	{
		$data = Data::create(['child' => ['child2' => ['value' => 'string']]]);
		$this->assertSame('', $data->getPath());
		$this->assertSame('child', $data->getChild('child')->getPath());
		$this->assertSame('child/child2', $data->getChild('child')->getChild('child2')->getPath());
	}

}