1package colorable 2 3import ( 4 "bytes" 5 "os" 6 "runtime" 7 "testing" 8) 9 10// checkEncoding checks that colorable is output encoding agnostic as long as 11// the encoding is a superset of ASCII. This implies that one byte not part of 12// an ANSI sequence must give exactly one byte in output 13func checkEncoding(t *testing.T, data []byte) { 14 // Send non-UTF8 data to colorable 15 b := bytes.NewBuffer(make([]byte, 0, 10)) 16 if b.Len() != 0 { 17 t.FailNow() 18 } 19 // TODO move colorable wrapping outside the test 20 NewNonColorable(b).Write(data) 21 if b.Len() != len(data) { 22 t.Fatalf("%d bytes expected, got %d", len(data), b.Len()) 23 } 24} 25 26func TestEncoding(t *testing.T) { 27 checkEncoding(t, []byte{}) // Empty 28 checkEncoding(t, []byte(`abc`)) // "abc" 29 checkEncoding(t, []byte(`é`)) // "é" in UTF-8 30 checkEncoding(t, []byte{233}) // 'é' in Latin-1 31} 32 33func TestNonColorable(t *testing.T) { 34 var buf bytes.Buffer 35 want := "hello" 36 NewNonColorable(&buf).Write([]byte("\x1b[0m" + want + "\x1b[2J")) 37 got := buf.String() 38 if got != "hello" { 39 t.Fatalf("want %q but %q", want, got) 40 } 41 42 buf.Reset() 43 NewNonColorable(&buf).Write([]byte("\x1b[")) 44 got = buf.String() 45 if got != "" { 46 t.Fatalf("want %q but %q", "", got) 47 } 48} 49 50func TestNonColorableNil(t *testing.T) { 51 paniced := false 52 func() { 53 defer func() { 54 recover() 55 paniced = true 56 }() 57 NewNonColorable(nil) 58 NewColorable(nil) 59 }() 60 61 if !paniced { 62 t.Fatalf("should panic") 63 } 64} 65 66func TestNonColorableESC(t *testing.T) { 67 var b bytes.Buffer 68 NewNonColorable(&b).Write([]byte{0x1b}) 69 if b.Len() > 0 { 70 t.Fatalf("0 bytes expected, got %d", b.Len()) 71 } 72} 73 74func TestNonColorableBadESC(t *testing.T) { 75 var b bytes.Buffer 76 NewNonColorable(&b).Write([]byte{0x1b, 0x1b}) 77 if b.Len() > 0 { 78 t.Fatalf("0 bytes expected, got %d", b.Len()) 79 } 80} 81 82func TestColorable(t *testing.T) { 83 if runtime.GOOS == "windows" { 84 t.Skipf("skip this test on windows") 85 } 86 _, ok := NewColorableStdout().(*os.File) 87 if !ok { 88 t.Fatalf("should os.Stdout on UNIX") 89 } 90 _, ok = NewColorableStderr().(*os.File) 91 if !ok { 92 t.Fatalf("should os.Stdout on UNIX") 93 } 94 _, ok = NewColorable(os.Stdout).(*os.File) 95 if !ok { 96 t.Fatalf("should os.Stdout on UNIX") 97 } 98} 99