package main import ( "strings" "testing" "github.com/charmbracelet/glamour" "sidekick/pkg/sidekick" ) func TestRenderMessageNewlines(t *testing.T) { r, _ := glamour.NewTermRenderer( glamour.WithStandardStyle("dark"), glamour.WithWordWrap(80), ) m := model{renderer: r} msg := sidekick.Message{ Role: sidekick.MessageRoleUser, Content: "Line 1\nLine 2", } rendered := m.renderMessage(msg) if !strings.Contains(rendered, "Line 1") || !strings.Contains(rendered, "Line 2") { t.Errorf("rendered message missing content: %s", rendered) } // Check if newline is preserved. If squashed, it might be "Line 1 Line 2" if strings.Contains(rendered, "Line 1 Line 2") { t.Error("newlines were squashed in user message") } } func TestRenderMessageReasoningGap(t *testing.T) { r, _ := glamour.NewTermRenderer( glamour.WithStandardStyle("dark"), glamour.WithWordWrap(80), ) m := model{renderer: r} msg := sidekick.Message{ Role: sidekick.MessageRoleAssistant, Reasoning: "Thinking about it", Content: "Actual response", } rendered := m.renderMessage(msg) // Check if there is a gap between Thinking and Response if !strings.Contains(rendered, "Thinking") || !strings.Contains(rendered, "Actual") || !strings.Contains(rendered, "response") { t.Errorf("rendered message missing content: %s", rendered) } // If there's no blank line between reasoning and content, they might be too close. // We want to see if they are on adjacent lines or have a gap. // The user says "next one begins immediately while it should start from a new line" // This might mean it's on the SAME line if glamour messed up, or just next line. // Let's print it to see t.Logf("Rendered Assistant:\n%s", rendered) }