RgbToHex emitted a single hex digit for channel values below 0x10 because strconv.FormatInt produces the minimal representation. This broke the fixed-width hex format, the round-trip with HexToRgb, and the hex2basicMap fast path in Rgb2basic. Format each channel with %02x, matching RgbTo256.
178 lines
4.0 KiB
Go
178 lines
4.0 KiB
Go
package color
|
|
|
|
import (
|
|
"bytes"
|
|
"errors"
|
|
"fmt"
|
|
"os"
|
|
"testing"
|
|
|
|
"github.com/gookit/assert"
|
|
)
|
|
|
|
func TestUtil_func(t *testing.T) {
|
|
is := assert.New(t)
|
|
|
|
// IsConsole
|
|
is.True(IsConsole(os.Stdin))
|
|
is.True(IsConsole(os.Stdout))
|
|
is.True(IsConsole(os.Stderr))
|
|
is.False(IsConsole(&bytes.Buffer{}))
|
|
ff, err := os.OpenFile("README.md", os.O_RDONLY, 0)
|
|
is.NoError(err)
|
|
is.False(IsConsole(ff))
|
|
|
|
// IsMSys
|
|
oldVal1 := os.Getenv("MSYSTEM")
|
|
is.NoError(os.Setenv("MSYSTEM", "MINGW64"))
|
|
is.True(IsMSys())
|
|
is.NoError(os.Unsetenv("MSYSTEM"))
|
|
is.False(IsMSys())
|
|
_ = os.Setenv("MSYSTEM", oldVal1)
|
|
|
|
is.NotEmpty(TermColorLevel())
|
|
// is.NotEmpty(SupColorMark())
|
|
}
|
|
|
|
func TestDebugMode(t *testing.T) {
|
|
EnableDebug()
|
|
saveInternalError(errors.New("enable debug mode"))
|
|
assert.NotEmpty(t, InnerErrs())
|
|
ResetDebug()
|
|
}
|
|
|
|
func TestRgbTo256Table(t *testing.T) {
|
|
index := 0
|
|
for hex, c256 := range RgbTo256Table() {
|
|
Hex(hex).Print("RGB:", hex)
|
|
fmt.Print(" = ")
|
|
C256(c256).Print("C256:", c256)
|
|
fmt.Print(" | ")
|
|
index++
|
|
if index%5 == 0 {
|
|
fmt.Println()
|
|
}
|
|
}
|
|
fmt.Println()
|
|
|
|
assert.Equal(t, uint8(0x92), RgbTo256(170, 187, 204))
|
|
assert.Equal(t, uint8(0x92), Rgb2short(170, 187, 204))
|
|
}
|
|
|
|
func TestC256ToRgbV1(t *testing.T) {
|
|
for i := 0; i < 256; i++ {
|
|
c256 := uint8(i)
|
|
C256(c256).Printf("C256:%d", c256)
|
|
fmt.Print(" => ")
|
|
rgb := C256ToRgbV1(c256)
|
|
RGBFromSlice(rgb).Printf("RGB:%v | ", rgb)
|
|
// assert.Equal(t, item.want, rgb, fmt.Sprint("256 code:", c256))
|
|
if i%4 == 0 {
|
|
fmt.Println()
|
|
}
|
|
}
|
|
fmt.Println()
|
|
}
|
|
|
|
func TestC256ToRgb(t *testing.T) {
|
|
for i := 0; i < 256; i++ {
|
|
c256 := uint8(i)
|
|
C256(c256).Printf("C256:%d", c256)
|
|
fmt.Print(" => ")
|
|
rgb := C256ToRgb(c256)
|
|
RGBFromSlice(rgb).Printf("RGB:%v | ", rgb)
|
|
// assert.Equal(t, item.want, rgb, fmt.Sprint("256 code:", c256))
|
|
if i%4 == 0 {
|
|
fmt.Println()
|
|
}
|
|
}
|
|
fmt.Println()
|
|
}
|
|
|
|
func TestHexToRgb(t *testing.T) {
|
|
tests := []struct {
|
|
given string
|
|
want []int
|
|
}{
|
|
{"666", []int{102, 102, 102}},
|
|
{"ccc", []int{204, 204, 204}},
|
|
{"#abc", []int{170, 187, 204}},
|
|
{"#aa99cd", []int{170, 153, 205}},
|
|
}
|
|
|
|
for _, item := range tests {
|
|
assert.Equal(t, HexToRgb(item.given), item.want)
|
|
assert.Equal(t, HexToRGB(item.given), item.want)
|
|
assert.Equal(t, Hex2rgb(item.given), item.want)
|
|
}
|
|
|
|
assert.Len(t, HexToRgb(""), 0)
|
|
assert.Len(t, HexToRgb("13"), 0)
|
|
}
|
|
|
|
func TestRgbToHex(t *testing.T) {
|
|
tests := []struct {
|
|
want string
|
|
given []int
|
|
}{
|
|
{"666666", []int{102, 102, 102}},
|
|
{"cccccc", []int{204, 204, 204}},
|
|
{"aabbcc", []int{170, 187, 204}},
|
|
{"aa99cd", []int{170, 153, 205}},
|
|
// channels below 0x10 must be zero-padded to two hex digits
|
|
{"000000", []int{0, 0, 0}},
|
|
{"010203", []int{1, 2, 3}},
|
|
{"0a0b0c", []int{10, 11, 12}},
|
|
}
|
|
|
|
for _, item := range tests {
|
|
assert.Equal(t, RgbToHex(item.given), item.want)
|
|
assert.Equal(t, Rgb2hex(item.given), item.want)
|
|
}
|
|
|
|
// RgbToHex must be the inverse of HexToRgb, including for small channels.
|
|
for _, hex := range []string{"010203", "000000", "0a0b0c", "aabbcc"} {
|
|
assert.Equal(t, RgbToHex(HexToRgb(hex)), hex)
|
|
}
|
|
}
|
|
|
|
func TestRgbToAnsi(t *testing.T) {
|
|
tests := []struct {
|
|
want uint8
|
|
rgb []uint8
|
|
isBg bool
|
|
}{
|
|
{40, []uint8{102, 102, 102}, true},
|
|
{37, []uint8{204, 204, 204}, false},
|
|
{47, []uint8{170, 78, 204}, true},
|
|
{37, []uint8{170, 153, 245}, false},
|
|
{30, []uint8{127, 127, 127}, false},
|
|
{40, []uint8{127, 127, 127}, true},
|
|
{90, []uint8{128, 128, 128}, false},
|
|
{97, []uint8{34, 56, 255}, false},
|
|
{31, []uint8{134, 56, 56}, false},
|
|
{30, []uint8{0, 0, 0}, false},
|
|
{40, []uint8{0, 0, 0}, true},
|
|
{97, []uint8{255, 255, 255}, false},
|
|
{107, []uint8{255, 255, 255}, true},
|
|
}
|
|
|
|
for _, item := range tests {
|
|
r, g, b := item.rgb[0], item.rgb[1], item.rgb[2]
|
|
|
|
assert.Equal(
|
|
t,
|
|
item.want,
|
|
RgbToAnsi(r, g, b, item.isBg),
|
|
fmt.Sprint("rgb=", item.rgb, ", is bg? ", item.isBg),
|
|
)
|
|
assert.Equal(t, item.want, Rgb2ansi(r, g, b, item.isBg))
|
|
}
|
|
}
|
|
|
|
func TestEnv_COLOR_DEBUG_MODE(t *testing.T) {
|
|
mockEnvValue("COLOR_DEBUG_MODE", "on", func(_ string) {
|
|
debugf("print debug message")
|
|
})
|
|
}
|