Files
wehub-resource-sync 95f0813436
build / build (push) Failing after 0s
nightly / nightly (push) Failing after 0s
build / snapshot (push) Failing after 0s
lint / lint (push) Failing after 1s
chore: import upstream snapshot with attribution
2026-07-13 13:02:37 +08:00

93 lines
2.4 KiB
Go

package main
import (
"fmt"
"os"
"path/filepath"
"sync"
)
// TestOptions is the set of options for the testing functionality.
type TestOptions struct {
Output string
Golden string
}
// DefaultTestOptions returns the default set of options for the testing functionality.
func DefaultTestOptions() TestOptions {
return TestOptions{
Output: "out.test",
}
}
// Alternatively, `var separator = strings.Repeat("─", 80)`.
const separator = "────────────────────────────────────────────────────────────────────────────────"
var (
once sync.Once
file *os.File
)
// SaveOutput saves the current buffer to the output file.
func (v *VHS) SaveOutput() error {
var err error
// Create output file (once)
once.Do(func() {
err = os.MkdirAll(filepath.Dir(v.Options.Test.Output), 0o750)
if err != nil {
file, err = os.CreateTemp(os.TempDir(), "vhs-*.txt")
return
}
file, err = os.Create(v.Options.Test.Output)
})
if err != nil {
return fmt.Errorf("failed to create output file: %w", err)
}
lines, err := v.Buffer()
if err != nil {
return fmt.Errorf("failed to get buffer: %w", err)
}
for _, line := range lines {
_, err = file.WriteString(line + "\n")
if err != nil {
return fmt.Errorf("failed to write buffer to file: %w", err)
}
}
_, err = file.WriteString(separator + "\n")
if err != nil {
return fmt.Errorf("failed to write separator to file: %w", err)
}
return nil
}
// Buffer returns the current buffer.
func (v *VHS) Buffer() ([]string, error) {
// Get the current buffer.
buf, err := v.Page.Eval("() => Array(term.rows).fill(0).map((e, i) => term.buffer.active.getLine(i).translateToString().trimEnd())")
if err != nil {
return nil, fmt.Errorf("read buffer: %w", err)
}
arr := buf.Value.Arr()
lines := make([]string, 0, len(arr))
for _, line := range arr {
lines = append(lines, line.Str())
}
return lines, nil
}
// CurrentLine returns the current line from the buffer.
func (v *VHS) CurrentLine() (string, error) {
buf, err := v.Page.Eval("() => term.buffer.active.getLine(term.buffer.active.cursorY+term.buffer.active.viewportY).translateToString().trimEnd()")
if err != nil {
return "", fmt.Errorf("read current line from buffer: %w", err)
}
return buf.Value.Str(), nil
}