<?php

declare(strict_types=1);
namespace Tests\git2;
use git2\git;
use git2\git_blob;
use git2\git_blob_filter_flag_t;
use git2\git_blob_filter_options;
use git2\git_repository;
use git2\git_writestream;

final class BlobTest extends GitTestCase
{

	public function testCreateFromBuffer(): void
	{
		$dir = $this->mkdir('create_from_buffer');
		git::repository_init($repo, $dir, false);
		$this->assertOK(git::blob_create_from_buffer($id, $repo, 'foo'));
		$this->assertSame('19102815663d23f8b75a47e7a01965dcdc96468c', git::oid_tostr_s($id));
	}

	public function testCreateFromStream(): void
	{
		$dir = $this->mkdir('create_from_buffer');
		git::repository_init($repo, $dir, false);

		$this->assertOK(git::blob_create_from_stream($stream, $repo, null));
		$this->assertInstanceOf(git_writestream::class, $stream);

		$stream->write('foo');

		$this->assertOK(git::blob_create_from_stream_commit($id, $stream));

		$this->assertOK(git::blob_lookup($blob, $repo, $id));
		$this->assertInstanceOf(git_blob::class, $blob);
		$this->assertSame('foo', git::blob_rawcontent($blob));
	}

	public function testCreateFromDisk(): void
	{
		$dir = $this->mkdir('create_from_disk');
		git::repository_init($repo, $dir, false);
		file_put_contents($dir . '/foo', 'foo');
		$this->assertOK(git::blob_create_from_disk($id, $repo, $dir . '/foo'));
		$this->assertSame('19102815663d23f8b75a47e7a01965dcdc96468c', git::oid_tostr_s($id));
	}

	public function testCreateFromWorkdir(): void
	{
		$dir = $this->mkdir('create_from_workdir');
		git::repository_init($repo, $dir, false);
		file_put_contents($dir . '/foo', 'foo');
		$this->assertOK(git::blob_create_from_workdir($id, $repo, 'foo'));
		$this->assertSame('19102815663d23f8b75a47e7a01965dcdc96468c', git::oid_tostr_s($id));
	}

	public function testLookup(): void
	{
		$dir = $this->mkdir('lookup');
		git::repository_init($repo, $dir, false);
		$this->assertOK(git::blob_create_from_buffer($id, $repo, 'foo'));
		$this->assertOK(git::blob_lookup($blob, $repo, $id));
		$this->assertSame(3, git::blob_rawsize($blob));
		$this->assertSame('foo', git::blob_rawcontent($blob));
		$this->assertFalse(git::blob_is_binary($blob));
		$this->assertInstanceOf(git_repository::class, git::blob_owner($blob));
		//$this->assertSame(git::oid_tostr_s($id), git::oid_tostr_s(git::blob_id($blob)));
		//git::blob_free($blob);
	}

	public function testFilterOptionsInit(): void
	{
		$this->assertOK(git::blob_filter_options_init($opts, git_blob_filter_options::VERSION));
		$this->assertInstanceOf(git_blob_filter_options::class, $opts);

		$this->assertSame(git_blob_filter_options::VERSION, $opts->version);
		$this->assertSame(1, $opts->flags);
		$this->assertTrue(git::oid_is_zero($opts->attr_commit_id));

		$opts->flags = git_blob_filter_flag_t::CHECK_FOR_BINARY | git_blob_filter_flag_t::NO_SYSTEM_ATTRIBUTES;
		$this->assertOK(git::oid_fromstr($opts->attr_commit_id, '0000000000000000000000000000000000000001'));

		$this->assertSame(git_blob_filter_flag_t::CHECK_FOR_BINARY | git_blob_filter_flag_t::NO_SYSTEM_ATTRIBUTES, $opts->flags);
		$this->assertSame('0000000000000000000000000000000000000001', git::oid_tostr_s($opts->attr_commit_id));
	}

}