github.com/charmbracelet/glamour@v0.7.0/ansi/renderer_test.go (about) 1 package ansi 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "os" 7 "path/filepath" 8 "strings" 9 "testing" 10 11 "github.com/muesli/termenv" 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 20 const ( 21 generateExamples = false 22 generateIssues = false 23 examplesDir = "../styles/examples/" 24 issuesDir = "../testdata/issues/" 25 ) 26 27 func TestRenderer(t *testing.T) { 28 files, err := filepath.Glob(examplesDir + "*.md") 29 if err != nil { 30 t.Fatal(err) 31 } 32 33 for _, f := range files { 34 bn := strings.TrimSuffix(filepath.Base(f), ".md") 35 sn := filepath.Join(examplesDir, bn+".style") 36 tn := filepath.Join("../testdata", bn+".test") 37 38 in, err := os.ReadFile(f) 39 if err != nil { 40 t.Fatal(err) 41 } 42 b, err := os.ReadFile(sn) 43 if err != nil { 44 t.Fatal(err) 45 } 46 47 options := Options{ 48 WordWrap: 80, 49 ColorProfile: termenv.TrueColor, 50 } 51 err = json.Unmarshal(b, &options.Styles) 52 if err != nil { 53 t.Fatal(err) 54 } 55 56 md := goldmark.New( 57 goldmark.WithExtensions( 58 extension.GFM, 59 extension.DefinitionList, 60 emoji.Emoji, 61 ), 62 goldmark.WithParserOptions( 63 parser.WithAutoHeadingID(), 64 ), 65 ) 66 67 ar := NewRenderer(options) 68 md.SetRenderer( 69 renderer.NewRenderer( 70 renderer.WithNodeRenderers(util.Prioritized(ar, 1000)))) 71 72 var buf bytes.Buffer 73 err = md.Convert(in, &buf) 74 if err != nil { 75 t.Error(err) 76 } 77 78 // generate 79 if generateExamples { 80 err = os.WriteFile(tn, buf.Bytes(), 0644) 81 if err != nil { 82 t.Fatal(err) 83 } 84 continue 85 } 86 87 // verify 88 td, err := os.ReadFile(tn) 89 if err != nil { 90 t.Fatal(err) 91 } 92 93 if !bytes.Equal(td, buf.Bytes()) { 94 t.Errorf("Rendered output for %s doesn't match!\nExpected: `\n%s`\nGot: `\n%s`\n", 95 bn, string(td), buf.String()) 96 } 97 } 98 } 99 100 func TestRendererIssues(t *testing.T) { 101 files, err := filepath.Glob(issuesDir + "*.md") 102 if err != nil { 103 t.Fatal(err) 104 } 105 106 for _, f := range files { 107 bn := strings.TrimSuffix(filepath.Base(f), ".md") 108 t.Run(bn, func(t *testing.T) { 109 tn := filepath.Join(issuesDir, bn+".test") 110 111 in, err := os.ReadFile(f) 112 if err != nil { 113 t.Fatal(err) 114 } 115 b, err := os.ReadFile("../styles/dark.json") 116 if err != nil { 117 t.Fatal(err) 118 } 119 120 options := Options{ 121 WordWrap: 80, 122 ColorProfile: termenv.TrueColor, 123 } 124 err = json.Unmarshal(b, &options.Styles) 125 if err != nil { 126 t.Fatal(err) 127 } 128 129 md := goldmark.New( 130 goldmark.WithExtensions( 131 extension.GFM, 132 extension.DefinitionList, 133 emoji.Emoji, 134 ), 135 goldmark.WithParserOptions( 136 parser.WithAutoHeadingID(), 137 ), 138 ) 139 140 ar := NewRenderer(options) 141 md.SetRenderer( 142 renderer.NewRenderer( 143 renderer.WithNodeRenderers(util.Prioritized(ar, 1000)))) 144 145 var buf bytes.Buffer 146 err = md.Convert(in, &buf) 147 if err != nil { 148 t.Error(err) 149 } 150 151 // generate 152 if generateIssues { 153 err = os.WriteFile(tn, buf.Bytes(), 0644) 154 if err != nil { 155 t.Fatal(err) 156 } 157 return 158 } 159 160 // verify 161 td, err := os.ReadFile(tn) 162 if err != nil { 163 t.Fatal(err) 164 } 165 166 if !bytes.Equal(td, buf.Bytes()) { 167 t.Errorf("Rendered output for %s doesn't match!\nExpected: `\n%s`\nGot: `\n%s`\n", 168 bn, string(td), buf.String()) 169 } 170 }) 171 } 172 }