From 50e250692cc4880e92047031262f2d7dce354102 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mislav=20Marohni=C4=87?= Date: Mon, 10 Oct 2022 20:25:54 +0200 Subject: [PATCH] Fix non-Windows terminals assumed to always support 256-color --- pkg/term/console.go | 3 +- pkg/term/env_test.go | 114 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 pkg/term/env_test.go diff --git a/pkg/term/console.go b/pkg/term/console.go index e8cbcb8..4ff7e95 100644 --- a/pkg/term/console.go +++ b/pkg/term/console.go @@ -4,11 +4,12 @@ package term import ( + "errors" "os" ) func enableVirtualTerminalProcessing(f *os.File) error { - return nil + return errors.New("not implemented") } func openTTY() (*os.File, error) { diff --git a/pkg/term/env_test.go b/pkg/term/env_test.go new file mode 100644 index 0000000..50bd3ba --- /dev/null +++ b/pkg/term/env_test.go @@ -0,0 +1,114 @@ +// Package term provides information about the terminal that the current process is connected to (if any), +// for example measuring the dimensions of the terminal and inspecting whether it's safe to output color. +package term + +import ( + "testing" +) + +func TestFromEnv(t *testing.T) { + tests := []struct { + name string + env map[string]string + wantTerminal bool + wantColor bool + want256Color bool + wantTrueColor bool + }{ + { + name: "default", + env: map[string]string{ + "GH_FORCE_TTY": "", + "CLICOLOR": "", + "CLICOLOR_FORCE": "", + "NO_COLOR": "", + "TERM": "", + "COLORTERM": "", + }, + wantTerminal: false, + wantColor: false, + want256Color: false, + wantTrueColor: false, + }, + { + name: "force color", + env: map[string]string{ + "GH_FORCE_TTY": "", + "CLICOLOR": "", + "CLICOLOR_FORCE": "1", + "NO_COLOR": "", + "TERM": "", + "COLORTERM": "", + }, + wantTerminal: false, + wantColor: true, + want256Color: false, + wantTrueColor: false, + }, + { + name: "force tty", + env: map[string]string{ + "GH_FORCE_TTY": "true", + "CLICOLOR": "", + "CLICOLOR_FORCE": "", + "NO_COLOR": "", + "TERM": "", + "COLORTERM": "", + }, + wantTerminal: true, + wantColor: true, + want256Color: false, + wantTrueColor: false, + }, + { + name: "has 256-color support", + env: map[string]string{ + "GH_FORCE_TTY": "true", + "CLICOLOR": "", + "CLICOLOR_FORCE": "", + "NO_COLOR": "", + "TERM": "256-color", + "COLORTERM": "", + }, + wantTerminal: true, + wantColor: true, + want256Color: true, + wantTrueColor: false, + }, + { + name: "has truecolor support", + env: map[string]string{ + "GH_FORCE_TTY": "true", + "CLICOLOR": "", + "CLICOLOR_FORCE": "", + "NO_COLOR": "", + "TERM": "truecolor", + "COLORTERM": "", + }, + wantTerminal: true, + wantColor: true, + want256Color: true, + wantTrueColor: true, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + for key, value := range tt.env { + t.Setenv(key, value) + } + terminal := FromEnv() + if got := terminal.IsTerminalOutput(); got != tt.wantTerminal { + t.Errorf("expected terminal %v, got %v", tt.wantTerminal, got) + } + if got := terminal.IsColorEnabled(); got != tt.wantColor { + t.Errorf("expected color %v, got %v", tt.wantColor, got) + } + if got := terminal.Is256ColorSupported(); got != tt.want256Color { + t.Errorf("expected 256-color %v, got %v", tt.want256Color, got) + } + if got := terminal.IsTrueColorSupported(); got != tt.wantTrueColor { + t.Errorf("expected truecolor %v, got %v", tt.wantTrueColor, got) + } + }) + } +}