<?php
declare(strict_types=1);

namespace Ely\CS\Test\Fixer\Whitespace;

use Ely\CS\Fixer\Whitespace\LineBreakAfterStatementsFixer;
use PhpCsFixer\Tests\Test\AbstractFixerTestCase;

/**
 * @covers \Ely\CS\Fixer\Whitespace\LineBreakAfterStatementsFixer
 *
 * @author ErickSkrauch <erickskrauch@ely.by>
 */
class LineBreakAfterStatementsFixerTest extends AbstractFixerTestCase {

    /**
     * @param string $expected
     * @param string $input
     *
     * @dataProvider provideFixCases
     */
    public function testFix(string $expected, $input = null) {
        $this->doTest($expected, $input);
    }

    public function provideFixCases() {
        $cases = [];

        // Simple cases
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        if ("a" === "b") {
            // code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        if ("a" === "b") {
            // code
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        if ("a" === "b") {
            // code
        } else {
            // another code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        if ("a" === "b") {
            // code
        } else {
            // another code
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        for ($i = 0; $i < 3; $i++) {
            // code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        for ($i = 0; $i < 3; $i++) {
            // code
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        foreach (["foo", "bar"] as $str) {
            // code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        foreach (["foo", "bar"] as $str) {
            // code
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        while ($i < 10) {
            // code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        while ($i < 10) {
            // code
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        do {
            // code
        } while ($i < 10);

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        do {
            // code
        } while ($i < 10);
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        switch ("str") {
            case "a":
                break;
            case "b":
                break;
            default:
                // code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        switch ("str") {
            case "a":
                break;
            case "b":
                break;
            default:
                // code
        }
        $a = "next statement";
    }
}',
        ];
        // Extended cases
        $cases[] = [
            '<?php
class Foo
{
    public function bar()
    {
        if ("a" === "b") {
            // code
        } else if ("a" === "c") {
            // code
        } else if ("a" === "d") {
            // code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function bar()
    {
        if ("a" === "b") {
            // code
        } else if ("a" === "c") {
            // code
        } else if ("a" === "d") {
            // code
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function bar()
    {
        if ("a" === "b") {
            // code
        } elseif ("a" === "c") {
            // code
        } elseif ("a" === "d") {
            // code
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function bar()
    {
        if ("a" === "b") {
            // code
        } elseif ("a" === "c") {
            // code
        } elseif ("a" === "d") {
            // code
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function bar()
    {
        foreach (["foo", "bar"] as $str) {
            if ($str === "foo") {
                // code
            }
        }
    }
}',
            '<?php
class Foo
{
    public function bar()
    {
        foreach (["foo", "bar"] as $str) {
            if ($str === "foo") {
                // code
            }

        }
    }
}',
        ];
        $cases[] = [
            '<?php
class Foo
{
    public function foo()
    {
        switch ("str") {
            case "a": {
                break;
            }
            case "b": {
                break;
            }
            default: {
                // code
            }
        }

        $a = "next statement";
    }
}',
            '<?php
class Foo
{
    public function foo()
    {
        switch ("str") {
            case "a": {
                break;
            }
            case "b": {
                break;
            }
            default: {
                // code
            }
        }
        $a = "next statement";
    }
}',
        ];
        $cases[] = [
            '<?php
$a = "prev statement";
foreach ($coordinates as $coordinate) {
    [$x, $y] = explode(\',\', $coordinate);
}
',
        ];

        return $cases;
    }

    protected function createFixer() {
        return new LineBreakAfterStatementsFixer();
    }

}