package rui

import (
	"bytes"
	"testing"
)

func TestColorARGB(t *testing.T) {
	color := Color(0x7FFE8743)
	a, r, g, b := color.ARGB()
	if a != 0x7F {
		t.Error("a != 0x7F")
	}
	if r != 0xFE {
		t.Error("r != 0xFE")
	}
	if g != 0x87 {
		t.Error("g != 0x87")
	}
	if b != 0x43 {
		t.Error("b != 0x43")
	}

	if color.Alpha() != 0x7F {
		t.Error("color.Alpha() != 0x7F")
	}

	if color.Red() != 0xFE {
		t.Error("color.Red() != 0xFE")
	}

	if color.Green() != 0x87 {
		t.Error("color.Green() != 0x87")
	}

	if color.Blue() != 0x43 {
		t.Error("color.Blue() != 0x43")
	}
}

func TestColorSetValue(t *testing.T) {
	createTestLog(t, true)

	testData := []struct{ src, result string }{
		{"#7F102040", "rgba(16,32,64,.50)"},
		{"#102040", "rgb(16,32,64)"},
		{"#8124", "rgba(17,34,68,.53)"},
		{"rgba(17,34,67,.5)", "rgba(17,34,67,.50)"},
		{"rgb(.25,50%,96)", "rgb(63,127,96)"},
		{"rgba(.25,50%,96,100%)", "rgb(63,127,96)"},
	}

	for _, data := range testData {
		color, ok := StringToColor(data.src)
		if !ok {
			t.Errorf(`color.SetValue("%s") fail`, data.src)
		}
		result := color.cssString()
		if result != data.result {
			t.Errorf(`color.cssString() = "%s", expected: "%s"`, result, data.result)
		}
	}
}

func TestColorWriteData(t *testing.T) {
	testCSS := func(t *testing.T, color Color, result string) {
		buffer := new(bytes.Buffer)
		buffer.WriteString(color.cssString())
		str := buffer.String()
		if str != result {
			t.Errorf("color = %#X, expected = \"%s\", result = \"%s\"", color, result, str)
		}
	}

	buffer := new(bytes.Buffer)
	color := Color(0x7FFE8743)
	color.writeData(buffer)
	str := buffer.String()
	if str != "#7FFE8743" {
		t.Errorf(`color = %#X, expected = "#7FFE8743", result = "%s"`, color, str)
	}

	testCSS(t, Color(0x7FFE8743), "rgba(254,135,67,.50)")
	testCSS(t, Color(0xFFFE8743), "rgb(254,135,67)")
	testCSS(t, Color(0x05FE8743), "rgba(254,135,67,.02)")
}

func TestColorSetData(t *testing.T) {
	test := func(t *testing.T, data string, result Color) {
		color, ok := StringToColor(data)
		if !ok {
			t.Errorf("data = \"%s\", fail result", data)
		} else if color != result {
			t.Errorf("data = \"%s\", expected = %#X, result = %#X", data, result, color)
		}
	}

	test(t, "#7Ffe8743", 0x7FFE8743)
	test(t, "#fE8743", 0xFFFE8743)
	test(t, "#AE43", 0xAAEE4433)
	test(t, "#E43", 0xFFEE4433)

	failData := []string{
		"",
		"7FfeG743",
		"#7Ffe87439",
		"#7FfeG743",
		"#7Ffe874",
		"#feG743",
		"#7Ffe8",
		"#fG73",
		"#GF3",
	}

	for _, data := range failData {
		if color, ok := StringToColor(data); ok {
			t.Errorf("data = \"%s\", success, result = %#X", data, color)
		}
	}
}