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  }