<?php declare(strict_types=1);
/**
 * Banker
 *
 * A Caching library implementing psr/cache
 *
 * PHP version 7.1
 *
 * @package     Banker
 * @author      Timothy J. Warren <tim@timshomepage.net>
 * @copyright   2016 - 2018  Timothy J. Warren
 * @license     http://www.opensource.org/licenses/mit-license.html  MIT License
 * @version     2.0.0
 * @link        https://git.timshomepage.net/timw4mail/banker
 */
namespace Aviat\Banker\Tests\Driver;

use PHPUnit\Framework\TestCase;

class DriverTestBase extends TestCase {

	protected $driver;

	public function tearDown(): void
	{
		$this->driver->__destruct();
	}

	public function testGetSet(): void
	{
		$this->driver->set('foo', 'bar');
		$this->assertTrue($this->driver->exists('foo'));
		$this->assertEquals('bar', $this->driver->get('foo'));

		$bar = [
			'foo' => [
				'apple' => 'orange'
			],
			'bar' => 'baz'
		];

		$this->driver->set('bar', $bar);
		$this->assertEquals($bar, $this->driver->get('bar'));
	}

	public function testGetMultipleOnBadKey(): void
	{
		$actual = $this->driver->getMultiple(['x','y']);
		$this->assertEquals([], $actual);
	}

	public function testGetMultiple(): void
	{
		$this->driver->set('foo', ['bar']);
		$this->driver->set('bar', (object) [
			'foo' => [
				'bar' => 'baz'
			]
		]);

		// Intentionally set the same key with different values
		$this->driver->set('baz', 34);
		$this->driver->set('baz', 42);

		$expected = [
			'foo' => ['bar'],
			'bar' => (object) [
				'foo' => [
					'bar' => 'baz'
				]
			],
		];

		$actual = $this->driver->getMultiple(['foo', 'bar']);

		$this->assertEquals($expected, $actual);
	}

	public function testSetWithExpires(): void
	{
		$this->driver->set('foo', 'bar', 30);
		$this->assertEquals('bar', $this->driver->get('foo'));
	}

	public function testDelete(): void
	{
		$this->driver->set('a1', 'b2');
		$this->assertTrue($this->driver->exists('a1'));

		$this->assertTrue($this->driver->delete('a1'));

		$this->assertFalse($this->driver->exists('a1'));
	}

	public function testDeleteMultiple(): void
	{
		$this->driver->set('a', 1);
		$this->driver->set('b', 2);

		$this->assertTrue($this->driver->exists('a'));
		$this->assertTrue($this->driver->exists('b'));

		/*$this->assertTrue(*/$this->driver->deleteMultiple(['a', 'b']);//);

		$this->assertFalse($this->driver->exists('a'));
		$this->assertFalse($this->driver->exists('b'));
	}

	public function testExpiresAt(): void
	{
		$this->driver->set('abc', 'def');
		$result = $this->driver->expiresAt('abc', 30);
		$this->assertTrue($result);
	}

	public function testExpiresAtBadKey(): void
	{
		$result = $this->driver->expiresAt('q', 30);
		$this->assertFalse($result);
	}
}