package check_test

import (
    .   "gopkg.in/check.v1"
)

var _ = Suite(&PrinterS{})

type PrinterS struct{}

func (s *PrinterS) TestCountSuite(c *C) {
    suitesRun += 1
}

var printTestFuncLine int

func init() {
    printTestFuncLine = getMyLine() + 3
}

func printTestFunc() {
    println(1)           // Comment1
    if 2 == 2 {          // Comment2
        println(3)       // Comment3
    }
    switch 5 {
    case 6: println(6)   // Comment6
        println(7)
    }
    switch interface{}(9).(type) {// Comment9
    case int: println(10)
        println(11)
    }
    select {
    case <-(chan bool)(nil): println(14)
        println(15)
    default: println(16)
        println(17)
    }
    println(19,
        20)
    _ = func() { println(21)
        println(22)
    }
    println(24, func() {
        println(25)
    })
    // Leading comment
    // with multiple lines.
    println(29)  // Comment29
}

var printLineTests = []struct {
    line   int
    output string
}{
    {1, "println(1) // Comment1"},
    {2, "if 2 == 2 { // Comment2\n    ...\n}"},
    {3, "println(3) // Comment3"},
    {5, "switch 5 {\n...\n}"},
    {6, "case 6:\n    println(6) // Comment6\n    ..."},
    {7, "println(7)"},
    {9, "switch interface{}(9).(type) { // Comment9\n...\n}"},
    {10, "case int:\n    println(10)\n    ..."},
    {14, "case <-(chan bool)(nil):\n    println(14)\n    ..."},
    {15, "println(15)"},
    {16, "default:\n    println(16)\n    ..."},
    {17, "println(17)"},
    {19, "println(19,\n    20)"},
    {20, "println(19,\n    20)"},
    {21, "_ = func() {\n    println(21)\n    println(22)\n}"},
    {22, "println(22)"},
    {24, "println(24, func() {\n    println(25)\n})"},
    {25, "println(25)"},
    {26, "println(24, func() {\n    println(25)\n})"},
    {29, "// Leading comment\n// with multiple lines.\nprintln(29) // Comment29"},
}

func (s *PrinterS) TestPrintLine(c *C) {
    for _, test := range printLineTests {
        output, err := PrintLine("printer_test.go", printTestFuncLine+test.line)
        c.Assert(err, IsNil)
        c.Assert(output, Equals, test.output)
    }
}

var indentTests = []struct {
    in, out string
}{
    {"", ""},
    {"\n", "\n"},
    {"a", ">>>a"},
    {"a\n", ">>>a\n"},
    {"a\nb", ">>>a\n>>>b"},
    {" ", ">>> "},
}

func (s *PrinterS) TestIndent(c *C) {
    for _, test := range indentTests {
        out := Indent(test.in, ">>>")
        c.Assert(out, Equals, test.out)
    }

}
