<?php
namespace Noi\Tests;

use Noi\Parsedown\JapaneseNewlineTrait;

use Parsedown;
use ParsedownTest;

use ParsedownExtra;
use ParsedownExtraTest;

/*
 * unmarkedText()をoverrideする他のExtension
 *
 * これを競合回避コードなしでJapaneseNewlineTraitと同時にuseすると、
 * unmarkedText()が競合しているため、名前の衝突エラーが発生する。
 *
 *   > Trait method unmarkedText has not been applied,
 *   > because there are collisions with other trait methods...
 */
trait ConflictExtensionTrait
{
    // override
    protected function unmarkedText($text)
    {
        return parent::unmarkedText($text);
    }
}

/*
 * Extensionを組み込む実装クラス
 *
 * 名前の衝突を回避する手順:
 *   1. 競合するExtension側のunmarkedText()に別名を付ける。
 *   2. 実装クラスにunmarkedText()を定義する。
 *   3. unmarkedText()の中で、競合Extension側のunmarkedText()を別名で呼ぶ。
 *   4. 3の結果をunmarkedJapaneseNewline()の引数に渡す。
 */
class ConflictResolutionTest_TestImpl extends Parsedown
{
    // 1. 競合するExtension側のunmarkedText()に別名を付ける
    use JapaneseNewlineTrait, ConflictExtensionTrait {
        ConflictExtensionTrait::unmarkedText as unmarkedText_Conflict;
    }

    // 2. 実装クラスにunmarkedText()を定義
    protected function unmarkedText($text)
    {
        // 3. unmarkedText()の中で、競合Extension側のunmarkedText()を別名で呼ぶ
        $text = $this->unmarkedText_Conflict($text);

        // 4. 3の結果をunmarkedJapaneseNewline()の引数に渡す
        return $this->unmarkedJapaneseNewline($text);
    }
}

class ConflictResolutionTest_TestExtraImpl extends ParsedownExtra
{
    use JapaneseNewlineTrait, ConflictExtensionTrait {
        ConflictExtensionTrait::unmarkedText as unmarkedText_Conflict;
    }

    protected function unmarkedText($text)
    {
        return $this->unmarkedJapaneseNewline($this->unmarkedText_Conflict($text));
    }
}

class ConflictResolutionTest extends ParsedownTest
{
    use JapaneseNewlineTestTrait;

    protected function initParsedown()
    {
        return new ConflictResolutionTest_TestImpl();
    }
}

class ConflictResolutionExtraTest extends ParsedownExtraTest
{
    use JapaneseNewlineTestTrait;

    protected function initParsedown()
    {
        return new ConflictResolutionTest_TestExtraImpl();
    }
}

Add a test for Conflict Resolution
Add a test for Conflict Resolution

`unmarkedText()`の競合回避コードのテストを追加しておく。

他のExtensionが`unmarkedText()`をoverrideするtraitの場合、
`JapaneseNewlineTrait`と同時に`use`するとメソッドが衝突する。

これを解決するために、以下の競合回避コードが必要:

  1. `use`時に競合Extension側の`unmarkedText()`に別名を付ける。
  2. 実装クラスに`unmarkedText()`を定義する。
  3. 実装クラスの`unmarkedText()`から、
     競合Extension側の`unmarkedText()`を別名で呼ぶ。
  4. 3の戻り値を`unmarkedJapaneseNewline()`の引数に渡す。

競合回避コードを書く場合、`JapaneseNewlineTrait`側の
`unmarkedText()`メソッドは使用しない。代わりに
`unmarkedJapaneseNewline()`を呼ぶ。

テストではこの競合回避コードが動くことを確認する。
