<?php

declare(strict_types=1);
namespace Tests\git2;
use git2\git;
use git2\git_status_opt_t;
use git2\git_status_options;
use git2\git_status_show_t;
use git2\git_status_t;

final class StatusTest extends GitTestCase
{

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

		$this->assertOK(git::status_list_new($list, $repo, null));
		$this->assertSame(0, git::status_list_entrycount($list));

		touch($dir . '/foo');

		$this->assertOK(git::status_list_new($list, $repo, null));
		$this->assertSame(1, git::status_list_entrycount($list));

		$entry = git::status_byindex($list, 0);
		$this->assertNotNull($entry);
		$this->assertSame(git_status_t::WT_NEW, $entry->status);

		$this->assertOK(git::status_file($status, $repo, 'foo'));
		$this->assertSame(git_status_t::WT_NEW, $status);

		$calls = [];

		$this->assertOK(git::status_foreach($repo, function(string $path, int $status_flags) use(&$calls): void {
			$calls[] = [$path, $status_flags];
		}));

		$this->assertSame([['foo', git_status_t::WT_NEW]], $calls);

		$this->assertOK(git::status_options_init($opts, git_status_options::VERSION));
		$this->assertInstanceOf(git_status_options::class, $opts);

		$opts->show = git_status_show_t::INDEX_AND_WORKDIR;
		$opts->flags = git_status_opt_t::DISABLE_PATHSPEC_MATCH | git_status_opt_t::INCLUDE_UNTRACKED;

		$calls = [];

		$this->assertOK(git::status_foreach_ext($repo, $opts, function(string $path, int $status_flags) use(&$calls): void {
			$calls[] = [$path, $status_flags];
		}));

		$this->assertSame([['foo', git_status_t::WT_NEW]], $calls);

		$this->assertOK(git::status_should_ignore($ignored, $repo, 'foo'));
		$this->assertFalse($ignored);
	}

}