josie / simplegit

package render

import (
	"strings"
	"testing"
)

func TestMarkdownRenders(t *testing.T) {
	out, err := Markdown([]byte("# demo\n\n**hi** there\n"))
	if err != nil {
		t.Fatalf("Markdown: %v", err)
	}
	html := string(out)
	if !strings.Contains(html, "<strong>hi</strong>") {
		t.Errorf("html = %q, want bold", html)
	}
}

func TestMarkdownEscapesRawHTML(t *testing.T) {
	out, err := Markdown([]byte("<script>alert(1)</script>\n"))
	if err != nil {
		t.Fatalf("Markdown: %v", err)
	}
	html := string(out)
	if strings.Contains(html, "<script>") {
		t.Errorf("raw script passed through: %q", html)
	}
	if !strings.Contains(html, "&lt;script&gt;") {
		t.Errorf("script not escaped: %q", html)
	}
}

func TestCodeHTMLHighlightsKnownExt(t *testing.T) {
	html, handled, err := CodeHTML("main.go", "package main\n")
	if err != nil || !handled {
		t.Fatalf("CodeHTML handled=%v err=%v", handled, err)
	}
	if !strings.Contains(html, `class="chroma"`) {
		t.Errorf("no .chroma wrapper: %q", html)
	}
	if !strings.Contains(html, `<span class="kn">`) {
		t.Errorf("keyword not class-highlighted: %q", html)
	}
	if strings.Contains(html, "style=") {
		t.Errorf("inline styles leaked into class mode: %q", html)
	}
}

func TestCodeHTMLDiffClasses(t *testing.T) {
	patch := "--- a/f\n+++ b/f\n@@ -1 +1 @@\n-old\n+new\n"
	html, handled, err := CodeHTML("x.diff", patch)
	if err != nil || !handled {
		t.Fatalf("CodeHTML diff handled=%v err=%v", handled, err)
	}
	for _, cls := range []string{`class="gd"`, `class="gi"`} {
		if !strings.Contains(html, cls) {
			t.Errorf("diff missing %s: %q", cls, html)
		}
	}
}

func TestChromaCSS(t *testing.T) {
	css, err := ChromaCSS()
	if err != nil {
		t.Fatalf("ChromaCSS: %v", err)
	}
	style := string(css)
	if !strings.Contains(style, ".chroma .k") {
		t.Errorf("no keyword rule in CSS")
	}
	if !strings.Contains(style, "#a5aef0") {
		t.Errorf("palette color missing from CSS")
	}
	for _, leaked := range []string{"#66d9ef", "#a6e22e", "#ae81ff"} {
		if strings.Contains(style, leaked) {
			t.Errorf("off-palette monokai color %s leaked into CSS", leaked)
		}
	}
}

func TestCodeHTMLUnknownExt(t *testing.T) {
	if _, handled, err := CodeHTML("file.unknownext", "x"); handled || err != nil {
		t.Errorf("handled=%v err=%v, want false,nil", handled, err)
	}
}