package door

import (
	"testing"
)

func pctUpdate(pct *int64) func() int64 {
	return func() int64 {
		return *pct
	}
}

func TestBarHalfStep(t *testing.T) {

	// This is normally done by door init, but we're skipping that right now
	Unicode = true
	BOXES = BOXES_UNICODE

	BarColor := ColorText("BLUE")

	bar := BarLine{Line: Line{DefaultColor: BarColor}, Width: 10, Style: SOLID}
	BarSolid := map[int]string{0: BarColor + "          ",
		5:   BarColor + "          ",
		10:  BarColor + "\u2588         ",
		20:  BarColor + "\u2588\u2588        ",
		25:  BarColor + "\u2588\u2588        ",
		50:  BarColor + "\u2588\u2588\u2588\u2588\u2588     ",
		75:  BarColor + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588   ",
		100: BarColor + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
	}

	for pct, text := range BarSolid {
		bar.Percent = int64(pct * 100)
		got := bar.Output()
		if got != text {
			t.Errorf("BarHalf: Expected %#v (%d%%), got %#v", text, pct, got)
		}
	}

	BarColor = ColorText("BLA ON WHI")
	bar = BarLine{Line: Line{DefaultColor: BarColor}, Width: 10, Style: HALF_STEP}
	BarHalf := map[int]string{0: BarColor + "          ",
		5:   BarColor + "\u258c         ",
		6:   BarColor + "\u258c         ",
		10:  BarColor + "\u2588         ",
		20:  BarColor + "\u2588\u2588        ",
		25:  BarColor + "\u2588\u2588\u258c       ",
		26:  BarColor + "\u2588\u2588\u258c       ",
		50:  BarColor + "\u2588\u2588\u2588\u2588\u2588     ",
		75:  BarColor + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u258c  ",
		100: BarColor + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
	}

	for pct, text := range BarHalf {
		bar.Percent = int64(pct * 100)
		got := bar.Output()
		if got != text {
			t.Errorf("BarHalf: Expected %#v (%d%%), got %#v", text, pct, got)
		}
	}

	BarColor = ColorText("RED")
	bar = BarLine{Line: Line{DefaultColor: BarColor}, Width: 10, Style: GRADIENT}
	BarGrad := map[int]string{0: BarColor + "          ",
		3:   BarColor + "\u2591         ",
		5:   BarColor + "\u2592         ",
		8:   BarColor + "\u2593         ",
		10:  BarColor + "\u2588         ",
		20:  BarColor + "\u2588\u2588        ",
		25:  BarColor + "\u2588\u2588\u2592       ",
		50:  BarColor + "\u2588\u2588\u2588\u2588\u2588     ",
		75:  BarColor + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2592  ",
		100: BarColor + "\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588\u2588",
	}

	var percent int64
	bar.UpdateP = pctUpdate(&percent)

	for pct, text := range BarGrad {
		percent = int64(pct * 100)
		got := bar.Output()
		if got != text {
			t.Errorf("BarGradient: Expected %#v (%d%%), got %#v", text, pct, got)
		}
	}

}