okami.mom/glamour

git clone https://git.nkp.pet/okami.mom/glamour

Ayman BagabasMerge pull request #408 from charmbracelet/v2-expcf874d7

main
2.9 KiB146 linesraw
1package ansi
2
3import (
4	"bytes"
5	"encoding/json"
6	"os"
7	"path/filepath"
8	"strings"
9	"testing"
10
11	"github.com/charmbracelet/x/exp/golden"
12	"github.com/yuin/goldmark"
13	emoji "github.com/yuin/goldmark-emoji"
14	"github.com/yuin/goldmark/extension"
15	"github.com/yuin/goldmark/parser"
16	"github.com/yuin/goldmark/renderer"
17	"github.com/yuin/goldmark/util"
18)
19
20const (
21	examplesDir = "../styles/examples/"
22	issuesDir   = "../testdata/issues/"
23)
24
25func TestRenderer(t *testing.T) {
26	files, err := filepath.Glob(examplesDir + "*.md")
27	if err != nil {
28		t.Fatal(err)
29	}
30
31	for _, f := range files {
32		bn := strings.TrimSuffix(filepath.Base(f), ".md")
33		t.Run(bn, func(t *testing.T) {
34			sn := filepath.Join(examplesDir, bn+".style")
35
36			in, err := os.ReadFile(f)
37			if err != nil {
38				t.Fatal(err)
39			}
40			b, err := os.ReadFile(sn)
41			if err != nil {
42				t.Fatal(err)
43			}
44
45			options := Options{
46				WordWrap: 80,
47			}
48			err = json.Unmarshal(b, &options.Styles)
49			if err != nil {
50				t.Fatal(err)
51			}
52
53			switch bn {
54			case "table_wrap":
55				tableWrap := true
56				options.TableWrap = &tableWrap
57			case "table_truncate":
58				tableWrap := false
59				options.TableWrap = &tableWrap
60			case "table_with_inline_links":
61				options.InlineTableLinks = true
62			case "table_with_footer_links", "table_with_footer_links_no_color":
63				options.InlineTableLinks = false
64			}
65
66			md := goldmark.New(
67				goldmark.WithExtensions(
68					extension.GFM,
69					extension.DefinitionList,
70					emoji.Emoji,
71				),
72				goldmark.WithParserOptions(
73					parser.WithAutoHeadingID(),
74				),
75			)
76
77			ar := NewRenderer(options)
78			md.SetRenderer(
79				renderer.NewRenderer(
80					renderer.WithNodeRenderers(util.Prioritized(ar, 1000))))
81
82			var buf bytes.Buffer
83			if err := md.Convert(in, &buf); err != nil {
84				t.Error(err)
85			}
86
87			golden.RequireEqual(t, buf.Bytes())
88		})
89	}
90}
91
92func TestRendererIssues(t *testing.T) {
93	files, err := filepath.Glob(issuesDir + "*.md")
94	if err != nil {
95		t.Fatal(err)
96	}
97
98	for _, f := range files {
99		bn := strings.TrimSuffix(filepath.Base(f), ".md")
100		t.Run(bn, func(t *testing.T) {
101			in, err := os.ReadFile(f)
102			if err != nil {
103				t.Fatal(err)
104			}
105			b, err := os.ReadFile("../styles/dark.json")
106			if err != nil {
107				t.Fatal(err)
108			}
109
110			options := Options{
111				WordWrap: 80,
112			}
113			err = json.Unmarshal(b, &options.Styles)
114			if err != nil {
115				t.Fatal(err)
116			}
117			if bn == "493" {
118				tableWrap := false
119				options.TableWrap = &tableWrap
120			}
121
122			md := goldmark.New(
123				goldmark.WithExtensions(
124					extension.GFM,
125					extension.DefinitionList,
126					emoji.Emoji,
127				),
128				goldmark.WithParserOptions(
129					parser.WithAutoHeadingID(),
130				),
131			)
132
133			ar := NewRenderer(options)
134			md.SetRenderer(
135				renderer.NewRenderer(
136					renderer.WithNodeRenderers(util.Prioritized(ar, 1000))))
137
138			var buf bytes.Buffer
139			if err := md.Convert(in, &buf); err != nil {
140				t.Error(err)
141			}
142
143			golden.RequireEqual(t, buf.Bytes())
144		})
145	}
146}