<?php

declare(strict_types=1);
namespace Tests\git2\Internal;
use git2\git;
use git2\git_error_t;
use git2\StructMemberAccessException;
use Tests\git2\GitTestCase;

final class StructTest extends GitTestCase
{

	public function testMemberRead(): void
	{
		git::error_set_oom();
		$error = git::error_last();
		$this->assertNotNull($error);
		$this->assertTrue(isset($error->message));
		$this->assertTrue(isset($error->klass));
		$this->assertFalse(isset($error->{'foo'}));
		$this->assertSame('Out of memory', $error->message);
		$this->assertSame(git_error_t::NOMEMORY, $error->klass);
	}

	public function testMemberWrite(): void
	{
		$this->expectException(StructMemberAccessException::class);
		$this->expectExceptionMessage('Struct member git2\git_error::$message is read-only.');
		git::error_set_oom();
		git::error_last()->{'message'} = 'test';
	}

	public function testMemberNonExistent(): void
	{
		$this->expectException(StructMemberAccessException::class);
		$this->expectExceptionMessage('Struct member git2\git_error::$foo is not declared.');
		git::error_set_oom();
		git::error_last()->{'foo'};
	}

}