<?php

namespace Shaarli\Formatter;

use Shaarli\Config\ConfigManager;
use Shaarli\TestCase;

/**
 * Class FormatterFactoryTest
 *
 * @package Shaarli\Formatter
 */
class FormatterFactoryTest extends TestCase
{
    /** @var string Path of test config file */
    protected static $testConf = 'sandbox/config';

    /** @var FormatterFactory instance */
    protected $factory;

    /** @var ConfigManager instance */
    protected $conf;

    /**
     * Initialize FormatterFactory instance
     */
    protected function setUp(): void
    {
        copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
        $this->conf = new ConfigManager(self::$testConf);
        $this->factory = new FormatterFactory($this->conf, true);
    }

    /**
     * Test creating an instance of BookmarkFormatter without any setting -> default formatter
     */
    public function testCreateInstanceDefault()
    {
        $this->assertInstanceOf(BookmarkDefaultFormatter::class, $this->factory->getFormatter());
    }

    /**
     * Test creating an instance of BookmarkDefaultFormatter from settings
     */
    public function testCreateInstanceDefaultSetting()
    {
        $this->conf->set('formatter', 'default');
        $this->assertInstanceOf(BookmarkDefaultFormatter::class, $this->factory->getFormatter());
    }

    /**
     * Test creating an instance of BookmarkDefaultFormatter from parameter
     */
    public function testCreateInstanceDefaultParameter()
    {
        $this->assertInstanceOf(
            BookmarkDefaultFormatter::class,
            $this->factory->getFormatter('default')
        );
    }

    /**
     * Test creating an instance of BookmarkRawFormatter from settings
     */
    public function testCreateInstanceRawSetting()
    {
        $this->conf->set('formatter', 'raw');
        $this->assertInstanceOf(BookmarkRawFormatter::class, $this->factory->getFormatter());
    }

    /**
     * Test creating an instance of BookmarkRawFormatter from parameter
     */
    public function testCreateInstanceRawParameter()
    {
        $this->assertInstanceOf(
            BookmarkRawFormatter::class,
            $this->factory->getFormatter('raw')
        );
    }

    /**
     * Test creating an instance of BookmarkMarkdownFormatter from settings
     */
    public function testCreateInstanceMarkdownSetting()
    {
        $this->conf->set('formatter', 'markdown');
        $this->assertInstanceOf(BookmarkMarkdownFormatter::class, $this->factory->getFormatter());
    }

    /**
     * Test creating an instance of BookmarkMarkdownFormatter from parameter
     */
    public function testCreateInstanceMarkdownParameter()
    {
        $this->assertInstanceOf(
            BookmarkMarkdownFormatter::class,
            $this->factory->getFormatter('markdown')
        );
    }
}
