package fbdraw import ( "fmt" "image/color" "testing" "git.eeqj.de/sneak/hdmistat/internal/font" ) func ExampleGrid() { // Create a 80x25 character grid (standard terminal size) grid := NewGrid(80, 25) // Create a writer for convenience w := NewGridWriter(grid) // Clear with dark background w.SetBackground(Gray10).Clear() // Draw header w.MoveTo(0, 0). SetBackground(Blue). SetColor(White). SetWeight(font.WeightBold). WriteLine(" System Monitor v1.0 ") // Reset to normal style w.SetBackground(Black).SetWeight(font.WeightRegular) // System info section w.MoveTo(2, 2). SetColor(Green).SetWeight(font.WeightBold). Write("SYSTEM INFO"). SetWeight(font.WeightRegular).SetColor(White) w.MoveTo(2, 4).Write("Hostname: ").SetColor(Cyan).Write("server01.example.com") w.MoveTo(2, 5).SetColor(White).Write("Uptime: ").SetColor(Yellow).Write("14 days, 3:42:15") w.MoveTo(2, 6).SetColor(White).Write("Load: ").SetColor(Red).Write("2.45 1.82 1.65") // CPU meters w.MoveTo(2, 8).SetColor(Blue).SetWeight(font.WeightBold).Write("CPU USAGE") w.SetWeight(font.WeightRegular) cpuValues := []float64{45.2, 78.9, 23.4, 91.5} for i, cpu := range cpuValues { w.MoveTo(2, 10+i) w.SetColor(White).Write("CPU%d [", i) // Draw meter meterWidth := 20 filled := int(cpu / 100.0 * float64(meterWidth)) // Choose color based on usage if cpu > 80 { w.SetColor(Red) } else if cpu > 50 { w.SetColor(Yellow) } else { w.SetColor(Green) } for j := 0; j < meterWidth; j++ { if j < filled { w.Write("█") } else { w.Write("░") } } w.SetColor(White).Write("] %5.1f%%", cpu) } // Memory section w.MoveTo(45, 8).SetColor(Purple).SetWeight(font.WeightBold).Write("MEMORY") w.SetWeight(font.WeightRegular).SetColor(White) w.MoveTo(45, 10).Write("Used: ").SetColor(Green).Write("4.2 GB / 16.0 GB") w.MoveTo(45, 11).SetColor(White).Write("Free: ").SetColor(Green).Write("11.8 GB") w.MoveTo(45, 12).SetColor(White).Write("Cache: ").SetColor(Blue).Write("2.1 GB") // Process table w.MoveTo(2, 16).SetColor(Orange).SetWeight(font.WeightBold).Write("TOP PROCESSES") w.SetWeight(font.WeightRegular) // Table header w.MoveTo(2, 18).SetBackground(Gray30).SetColor(White).SetWeight(font.WeightBold) w.Write(" PID USER PROCESS CPU% MEM% ") w.SetBackground(Black).SetWeight(font.WeightRegular) // Table rows processes := []struct { pid int user string name string cpu float64 mem float64 }{ {1234, "root", "systemd", 0.2, 0.1}, {5678, "user", "firefox", 15.8, 12.4}, {9012, "user", "vscode", 42.1, 8.7}, } for i, p := range processes { y := 19 + i // Alternate row backgrounds if i%2 == 0 { w.SetBackground(Gray10) } else { w.SetBackground(Black) } // Highlight high CPU if p.cpu > 40 { w.SetColor(Red) } else if p.cpu > 20 { w.SetColor(Yellow) } else { w.SetColor(Gray70) } w.MoveTo(0, y) w.Write(" %5d %-8s %-25s %5.1f %5.1f ", p.pid, p.user, p.name, p.cpu, p.mem) } // Output as text fmt.Println(grid.ToText()) } func TestGrid(t *testing.T) { grid := NewGrid(40, 10) w := NewGridWriter(grid) // Test basic writing w.MoveTo(5, 2).Write("Hello, World!") // Test colors and styles w.MoveTo(5, 4). SetColor(Red).SetWeight(font.WeightBold). Write("Bold Red Text") // Test unicode w.MoveTo(5, 6). SetColor(Green). Write("Progress: [████████▒▒▒▒▒▒▒▒] 50%") // Check text output text := grid.ToText() if text == "" { t.Error("Grid should not be empty") } // Check specific cell cell := grid.Cells[2][5] // Row 2, Column 5 should be 'H' if cell.Rune != 'H' { t.Errorf("Expected 'H' at (5,2), got '%c'", cell.Rune) } }