<?php

namespace Tests\Behat\Gherkin\Keywords;

use Behat\Gherkin\Keywords\ArrayKeywords;
use Behat\Gherkin\Keywords\KeywordsDumper;

class KeywordsDumperTest extends \PHPUnit_Framework_TestCase
{
    private $keywords;

    protected function setUp()
    {
        $this->keywords = new ArrayKeywords(array(
           'en' => array(
               'feature'          => 'Feature',
               'background'       => 'Background',
               'scenario'         => 'Scenario',
               'scenario_outline' => 'Scenario Outline|Scenario Template',
               'examples'         => 'Examples|Scenarios',
               'given'            => 'Given',
               'when'             => 'When',
               'then'             => 'Then',
               'and'              => 'And',
               'but'              => 'But'
           ),
           'ru' => array(
               'feature'          => 'Функционал|Фича',
               'background'       => 'Предыстория|Бэкграунд',
               'scenario'         => 'Сценарий|История',
               'scenario_outline' => 'Структура сценария|Аутлайн',
               'examples'         => 'Значения',
               'given'            => 'Допустим',
               'when'             => 'Если|@',
               'then'             => 'То',
               'and'              => 'И',
               'but'              => 'Но'
           )
        ));
    }

    public function testEnKeywordsDumper()
    {
        $dumper = new KeywordsDumper($this->keywords);

        $dumped = $dumper->dump('en');
        $etalon = <<<GHERKIN
Feature: Internal operations
  In order to stay secret
  As a secret organization
  We need to be able to erase past agents' memory

  Background:
    Given there is agent A
    And there is agent B

  Scenario: Erasing agent memory
    Given there is agent J
    And there is agent K
    When I erase agent K's memory
    Then there should be agent J
    But there should not be agent K

  (Scenario Outline|Scenario Template): Erasing other agents' memory
    Given there is agent <agent1>
    And there is agent <agent2>
    When I erase agent <agent2>'s memory
    Then there should be agent <agent1>
    But there should not be agent <agent2>

    (Examples|Scenarios):
      | agent1 | agent2 |
      | D      | M      |
GHERKIN;

        $this->assertEquals($etalon, $dumped);
    }

    public function testRuKeywordsDumper()
    {
        $dumper = new KeywordsDumper($this->keywords);

        $dumped = $dumper->dump('ru');
        $etalon = <<<GHERKIN
# language: ru
(Функционал|Фича): Internal operations
  In order to stay secret
  As a secret organization
  We need to be able to erase past agents' memory

  (Предыстория|Бэкграунд):
    Допустим there is agent A
    И there is agent B

  (Сценарий|История): Erasing agent memory
    Допустим there is agent J
    И there is agent K
    (Если|@) I erase agent K's memory
    То there should be agent J
    Но there should not be agent K

  (Структура сценария|Аутлайн): Erasing other agents' memory
    Допустим there is agent <agent1>
    И there is agent <agent2>
    (Если|@) I erase agent <agent2>'s memory
    То there should be agent <agent1>
    Но there should not be agent <agent2>

    Значения:
      | agent1 | agent2 |
      | D      | M      |
GHERKIN;

        $this->assertEquals($etalon, $dumped);
    }

    public function testRuKeywordsCustomKeywordsDumper()
    {
        $dumper = new KeywordsDumper($this->keywords);
        $dumper->setKeywordsDumperFunction(function ($keywords) {
            return '<keyword>'.implode(', ', $keywords).'</keyword>';
        });

        $dumped = $dumper->dump('ru');
        $etalon = <<<GHERKIN
# language: ru
<keyword>Функционал, Фича</keyword>: Internal operations
  In order to stay secret
  As a secret organization
  We need to be able to erase past agents' memory

  <keyword>Предыстория, Бэкграунд</keyword>:
    <keyword>Допустим</keyword> there is agent A
    <keyword>И</keyword> there is agent B

  <keyword>Сценарий, История</keyword>: Erasing agent memory
    <keyword>Допустим</keyword> there is agent J
    <keyword>И</keyword> there is agent K
    <keyword>Если, @</keyword> I erase agent K's memory
    <keyword>То</keyword> there should be agent J
    <keyword>Но</keyword> there should not be agent K

  <keyword>Структура сценария, Аутлайн</keyword>: Erasing other agents' memory
    <keyword>Допустим</keyword> there is agent <agent1>
    <keyword>И</keyword> there is agent <agent2>
    <keyword>Если, @</keyword> I erase agent <agent2>'s memory
    <keyword>То</keyword> there should be agent <agent1>
    <keyword>Но</keyword> there should not be agent <agent2>

    <keyword>Значения</keyword>:
      | agent1 | agent2 |
      | D      | M      |
GHERKIN;

        $this->assertEquals($etalon, $dumped);
    }

    public function testExtendedVersionDumper()
    {
        $dumper = new KeywordsDumper($this->keywords);

        $dumped = $dumper->dump('ru', false);
        $etalon = array(
            <<<GHERKIN
# language: ru
Функционал: Internal operations
  In order to stay secret
  As a secret organization
  We need to be able to erase past agents' memory

  Предыстория:
    Допустим there is agent A
    И there is agent B

  Сценарий: Erasing agent memory
    Допустим there is agent J
    И there is agent K
    Если I erase agent K's memory
    @ I erase agent K's memory
    То there should be agent J
    Но there should not be agent K

  История: Erasing agent memory
    Допустим there is agent J
    И there is agent K
    Если I erase agent K's memory
    @ I erase agent K's memory
    То there should be agent J
    Но there should not be agent K

  Структура сценария: Erasing other agents' memory
    Допустим there is agent <agent1>
    И there is agent <agent2>
    Если I erase agent <agent2>'s memory
    @ I erase agent <agent2>'s memory
    То there should be agent <agent1>
    Но there should not be agent <agent2>

    Значения:
      | agent1 | agent2 |
      | D      | M      |

  Аутлайн: Erasing other agents' memory
    Допустим there is agent <agent1>
    И there is agent <agent2>
    Если I erase agent <agent2>'s memory
    @ I erase agent <agent2>'s memory
    То there should be agent <agent1>
    Но there should not be agent <agent2>

    Значения:
      | agent1 | agent2 |
      | D      | M      |
GHERKIN
            , <<<GHERKIN
# language: ru
Фича: Internal operations
  In order to stay secret
  As a secret organization
  We need to be able to erase past agents' memory

  Предыстория:
    Допустим there is agent A
    И there is agent B

  Сценарий: Erasing agent memory
    Допустим there is agent J
    И there is agent K
    Если I erase agent K's memory
    @ I erase agent K's memory
    То there should be agent J
    Но there should not be agent K

  История: Erasing agent memory
    Допустим there is agent J
    И there is agent K
    Если I erase agent K's memory
    @ I erase agent K's memory
    То there should be agent J
    Но there should not be agent K

  Структура сценария: Erasing other agents' memory
    Допустим there is agent <agent1>
    И there is agent <agent2>
    Если I erase agent <agent2>'s memory
    @ I erase agent <agent2>'s memory
    То there should be agent <agent1>
    Но there should not be agent <agent2>

    Значения:
      | agent1 | agent2 |
      | D      | M      |

  Аутлайн: Erasing other agents' memory
    Допустим there is agent <agent1>
    И there is agent <agent2>
    Если I erase agent <agent2>'s memory
    @ I erase agent <agent2>'s memory
    То there should be agent <agent1>
    Но there should not be agent <agent2>

    Значения:
      | agent1 | agent2 |
      | D      | M      |
GHERKIN
        );

        $this->assertEquals($etalon, $dumped);
    }
}
