package com.github.shyiko.ktlint.ruleset.standard

import com.github.shyiko.ktlint.core.LintError
import com.github.shyiko.ktlint.test.format
import com.github.shyiko.ktlint.test.lint
import org.assertj.core.api.Assertions
import org.testng.annotations.Test

class NoLineBreakAfterElseRuleTest {

    @Test
    fun testViolationForLineBreakBetweenElseAndIf() {
        Assertions.assertThat(NoLineBreakAfterElseRule().lint(
            """
            fun funA() {
                if (conditionA()) {
                    doSomething()
                } else
                if (conditionB()) {
                    doAnotherThing()
                }
            }
            """.trimIndent()
        )).isEqualTo(listOf(
            LintError(5, 1, "no-line-break-after-else", "Unexpected line break after \"else\"")
        ))
    }

    @Test
    fun testFixViolationForLineBreakBetweenElseAndIf() {
        Assertions.assertThat(NoLineBreakAfterElseRule().format(
            """
            fun funA() {
                if (conditionA()) {
                    doSomething()
                } else
                if (conditionB()) {
                    doAnotherThing()
                }
            }
            """.trimIndent()
        )).isEqualTo(
            """
            fun funA() {
                if (conditionA()) {
                    doSomething()
                } else if (conditionB()) {
                    doAnotherThing()
                }
            }
                """.trimIndent()
        )
    }

    @Test
    fun testValidElseIf() {
        Assertions.assertThat(NoLineBreakAfterElseRule().lint(
            """
            fun funA() {
                if (conditionA()) {
                    doSomething()
                } else if (conditionB()) {
                    doAnotherThing()
                }
            }
            """.trimIndent()
        )).isEmpty()
    }

    @Test
    fun testValidSimpleElse() {
        Assertions.assertThat(NoLineBreakAfterElseRule().lint(
            """
            fun funA() {
                if (conditionA()) {
                    doSomething()
                } else {
                    doAnotherThing()
                }
            }
            """.trimIndent()
        )).isEmpty()
    }

    @Test
    fun testViolationForLineBreakBetweenElseAndBracket() {
        Assertions.assertThat(NoLineBreakAfterElseRule().lint(
            """
            fun funA() {
                if (conditionA()) {
                    doSomething()
                } else
                {
                    doAnotherThing()
                }
            }
            """.trimIndent()
        )).isEqualTo(listOf(
            LintError(5, 1, "no-line-break-after-else", "Unexpected line break after \"else\"")
        ))
    }

    @Test
    fun testViolationWhenBracketOmitted() {
        Assertions.assertThat(NoLineBreakAfterElseRule().lint(
            """
            fun funA() {
                if (conditionA())
                    doSomething()
                else
                    doAnotherThing()
            }
            """.trimIndent()
        )).isEmpty()
    }

    @Test
    fun testValidWhenBracketOmitted() {
        Assertions.assertThat(NoLineBreakAfterElseRule().lint(
            """
            fun funA() {
                if (conditionA()) doSomething() else doAnotherThing()
            }
            """.trimIndent()
        )).isEmpty()
    }
}
