<?php

namespace SilverStripe\Forms\Tests\GridField;

use SilverStripe\Forms\GridField\GridFieldDataColumns;
use SilverStripe\Security\Member;
use SilverStripe\Dev\SapphireTest;
use SilverStripe\Forms\GridField\GridField;
use stdClass;

class GridFieldDataColumnsTest extends SapphireTest
{

    /**
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::getDisplayFields
     */
    public function testGridFieldGetDefaultDisplayFields()
    {
        $obj = new GridField('testfield', 'testfield', Member::get());
        $expected = Member::singleton()->summaryFields();
        $columns = $obj->getConfig()->getComponentByType(GridFieldDataColumns::class);
        $this->assertEquals($expected, $columns->getDisplayFields($obj));
    }

    /**
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::setDisplayFields
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::getDisplayFields
     */
    public function testGridFieldCustomDisplayFields()
    {
        $obj = new GridField('testfield', 'testfield', Member::get());
        /**
 * @skipUpgrade
*/
        $expected = array('Email' => 'Email');
        $columns = $obj->getConfig()->getComponentByType(GridFieldDataColumns::class);
        $columns->setDisplayFields($expected);
        $this->assertEquals($expected, $columns->getDisplayFields($obj));
    }

    /**
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::setDisplayFields
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::getDisplayFields
     *
     * @expectedException \InvalidArgumentException
     */
    public function testGridFieldDisplayFieldsWithBadArguments()
    {
        $obj = new GridField('testfield', 'testfield', Member::get());
        $columns = $obj->getConfig()->getComponentByType(GridFieldDataColumns::class);
        $columns->setDisplayFields(new stdClass());
    }

    /**
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::getFieldCasting
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::setFieldCasting
     */
    public function testFieldCasting()
    {
        $obj = new GridField('testfield', 'testfield');
        $columns = $obj->getConfig()->getComponentByType(GridFieldDataColumns::class);
        $this->assertEquals(array(), $columns->getFieldCasting());
        $columns->setFieldCasting(array("MyShortText"=>"Text->FirstSentence"));
        $this->assertEquals(array("MyShortText"=>"Text->FirstSentence"), $columns->getFieldCasting());
    }

    /**
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::getFieldFormatting
     * @covers \SilverStripe\Forms\GridField\GridFieldDataColumns::setFieldFormatting
     */
    public function testFieldFormatting()
    {
        $obj = new GridField('testfield', 'testfield');
        $columns = $obj->getConfig()->getComponentByType(GridFieldDataColumns::class);
        $this->assertEquals(array(), $columns->getFieldFormatting());
        $columns->setFieldFormatting(array("myFieldName" => '<a href=\"custom-admin/$ID\">$ID</a>'));
        $this->assertEquals(
            array("myFieldName" => '<a href=\"custom-admin/$ID\">$ID</a>'),
            $columns->getFieldFormatting()
        );
    }
}