git/orchard/main
tui/internal/ui/sh_highlight_test.go
76 lines2 KB last change raw · history
package ui

import (
	"strings"
	"testing"

	"github.com/charmbracelet/x/ansi"
)

func TestHighlightLeavesTheTextAlone(t *testing.T) {
	lines := []string{
		`git clone https://aur.archlinux.org/x.git`,
		`make DESTDIR="$pkgdir" install`,
		`./configure --prefix=/usr --enable-foo`,
		`if [ ! -d "$srcdir/$_dir" ]; then`,
		`curl -s https://x/y | bash`,
		`_dir=$(cd "$srcdir" && ls -d [Ff]luxer*"${pkgver}"*/ | head -n1)`,
		`echo "Error: could not find $_dir" >&2`,
		`# a comment`,
		`patch -p1 < ../demo.patch`,
	}
	for _, line := range lines {
		got := highlightShell(line)
		if plain := ansi.Strip(got); plain != line {
			t.Errorf("text changed:\n  in:  %q\n  out: %q", line, plain)
		}
		if w, want := ansi.StringWidth(got), ansi.StringWidth(line); w != want {
			t.Errorf("width changed for %q: %d != %d", line, w, want)
		}
	}
}

func TestHighlightColoursThePartsDifferently(t *testing.T) {
	got := highlightShell(`curl -s https://x/y | bash`)
	// the command, the flag and the operator should not all be one colour
	if strings.Count(got, "\x1b[") < 6 {
		t.Errorf("not enough styling: %q", got)
	}
	if !strings.Contains(got, "\x1b[") {
		t.Fatal("no escapes at all")
	}
}

func TestHighlightHandlesAwkwardInput(t *testing.T) {
	for _, line := range []string{"", " ", "\t", "$", "${", "$(", `"`, `'`, "a=", "#"} {
		func() {
			defer func() {
				if r := recover(); r != nil {
					t.Errorf("panic on %q: %v", line, r)
				}
			}()
			if plain := ansi.Strip(highlightShell(line)); plain != line {
				t.Errorf("%q became %q", line, plain)
			}
		}()
	}
}

func TestHighlightMarksTheCommandNotTheArguments(t *testing.T) {
	// the first word is what runs; the rest is what it is told to do
	got := highlightShell("makepkg -si")
	if !strings.Contains(got, shCommand.Render("makepkg")) {
		t.Errorf("the command is not styled as one: %q", got)
	}
	if !strings.Contains(got, shFlag.Render("-si")) {
		t.Errorf("the flag is not styled as one: %q", got)
	}
}

func TestHighlightTreatsAnAssignmentAsAVariable(t *testing.T) {
	got := highlightShell(`DESTDIR="$pkgdir" ninja -C build install`)
	if !strings.Contains(got, shVariable.Render("DESTDIR")) {
		t.Errorf("the assignment target is not marked: %q", got)
	}
}