...

Source file src/gonum.org/v1/plot/vg/vgpdf/vgpdf_test.go

Documentation: gonum.org/v1/plot/vg/vgpdf

     1  // Copyright ©2018 The Gonum Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package vgpdf_test
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"image/color"
    11  	"image/png"
    12  	"log"
    13  	"os"
    14  	"testing"
    15  
    16  	"gonum.org/v1/plot"
    17  	"gonum.org/v1/plot/cmpimg"
    18  	"gonum.org/v1/plot/plotter"
    19  	"gonum.org/v1/plot/vg"
    20  	"gonum.org/v1/plot/vg/draw"
    21  	"gonum.org/v1/plot/vg/vgpdf"
    22  )
    23  
    24  func TestEmbedFonts(t *testing.T) {
    25  	for _, tc := range []struct {
    26  		name  string
    27  		embed bool
    28  	}{
    29  		{
    30  			name:  "testdata/disable-embedded-fonts_golden.pdf",
    31  			embed: false,
    32  		},
    33  		{
    34  			name:  "testdata/enable-embedded-fonts_golden.pdf",
    35  			embed: true,
    36  		},
    37  	} {
    38  		t.Run(fmt.Sprintf("embed=%v", tc.embed), func(t *testing.T) {
    39  			p := plot.New()
    40  
    41  			pts := plotter.XYs{{X: 0, Y: 0}, {X: 0, Y: 1}, {X: 1, Y: 0}, {X: 1, Y: 1}}
    42  			line, err := plotter.NewLine(pts)
    43  			if err != nil {
    44  				t.Fatalf("could not create line: %v", err)
    45  			}
    46  			p.Add(line)
    47  			p.X.Label.Text = "X axis"
    48  			p.Y.Label.Text = "Y axis"
    49  
    50  			c := vgpdf.New(100, 100)
    51  
    52  			// enable/disable embedding fonts
    53  			c.EmbedFonts(tc.embed)
    54  			p.Draw(draw.New(c))
    55  
    56  			var buf bytes.Buffer
    57  			_, err = c.WriteTo(&buf)
    58  			if err != nil {
    59  				t.Fatalf("could not write canvas: %v", err)
    60  			}
    61  
    62  			if *cmpimg.GenerateTestData {
    63  				// Recreate Golden images and exit.
    64  				err = os.WriteFile(tc.name, buf.Bytes(), 0o644)
    65  				if err != nil {
    66  					t.Fatal(err)
    67  				}
    68  				return
    69  			}
    70  
    71  			want, err := os.ReadFile(tc.name)
    72  			if err != nil {
    73  				t.Fatalf("failed to read golden plot: %v", err)
    74  			}
    75  
    76  			ok, err := cmpimg.Equal("pdf", buf.Bytes(), want)
    77  			if err != nil {
    78  				t.Fatalf("failed to run cmpimg test: %v", err)
    79  			}
    80  
    81  			if !ok {
    82  				t.Fatalf("plot mismatch: %v", tc.name)
    83  			}
    84  		})
    85  	}
    86  }
    87  
    88  func TestArc(t *testing.T) {
    89  	pts := plotter.XYs{{X: 1, Y: 1}, {X: 2, Y: 2}}
    90  	scat, err := plotter.NewScatter(pts)
    91  	if err != nil {
    92  		t.Fatal(err)
    93  	}
    94  	p := plot.New()
    95  	p.Add(scat)
    96  
    97  	c := vgpdf.New(100, 100)
    98  
    99  	c.EmbedFonts(false)
   100  	p.Draw(draw.New(c))
   101  
   102  	if *cmpimg.GenerateTestData {
   103  		// Recreate Golden images and exit.
   104  		f, err := os.Create("testdata/arc_golden.pdf")
   105  		if err != nil {
   106  			t.Fatal(err)
   107  		}
   108  		defer f.Close()
   109  
   110  		_, err = c.WriteTo(f)
   111  		if err != nil {
   112  			t.Fatalf("could not write canvas: %v", err)
   113  		}
   114  		return
   115  	}
   116  
   117  	f, err := os.Create("testdata/arc.pdf")
   118  	if err != nil {
   119  		t.Fatal(err)
   120  	}
   121  	defer f.Close()
   122  
   123  	_, err = c.WriteTo(f)
   124  	if err != nil {
   125  		t.Fatalf("could not write canvas: %v", err)
   126  	}
   127  
   128  	err = f.Close()
   129  	if err != nil {
   130  		t.Fatal(err)
   131  	}
   132  
   133  	want, err := os.ReadFile("testdata/arc_golden.pdf")
   134  	if err != nil {
   135  		t.Fatalf("failed to read golden plot: %v", err)
   136  	}
   137  
   138  	got, err := os.ReadFile("testdata/arc.pdf")
   139  	if err != nil {
   140  		t.Fatalf("failed to read plot: %v", err)
   141  	}
   142  
   143  	ok, err := cmpimg.Equal("pdf", got, want)
   144  	if err != nil {
   145  		t.Fatalf("failed to run cmpimg test: %v", err)
   146  	}
   147  
   148  	if !ok {
   149  		t.Fatalf("plot mismatch")
   150  	}
   151  }
   152  
   153  func TestMultipage(t *testing.T) {
   154  	cmpimg.CheckPlot(Example_multipage, t, "multipage.pdf")
   155  }
   156  
   157  func TestIssue540(t *testing.T) {
   158  	p := plot.New()
   159  
   160  	xys := plotter.XYs{
   161  		plotter.XY{X: 0, Y: 0},
   162  		plotter.XY{X: 1, Y: 1},
   163  		plotter.XY{X: 2, Y: 2},
   164  	}
   165  
   166  	p.Title.Text = "My title"
   167  	p.X.Tick.Label.Font.Size = 0 // hide X-axis labels
   168  	p.Y.Tick.Label.Font.Size = 0 // hide Y-axis labels
   169  
   170  	lines, points, err := plotter.NewLinePoints(xys)
   171  	if err != nil {
   172  		log.Fatal(err)
   173  	}
   174  	lines.Color = color.RGBA{B: 255, A: 255}
   175  
   176  	p.Add(lines, points)
   177  	p.Add(plotter.NewGrid())
   178  
   179  	if *cmpimg.GenerateTestData {
   180  		// Recreate Golden images and exit.
   181  		err = p.Save(100, 100, "testdata/issue540_golden.pdf")
   182  		if err != nil {
   183  			t.Fatal(err)
   184  		}
   185  		return
   186  	}
   187  
   188  	err = p.Save(100, 100, "testdata/issue540.pdf")
   189  	if err != nil {
   190  		t.Fatal(err)
   191  	}
   192  
   193  	want, err := os.ReadFile("testdata/issue540_golden.pdf")
   194  	if err != nil {
   195  		t.Fatal(err)
   196  	}
   197  
   198  	got, err := os.ReadFile("testdata/issue540.pdf")
   199  	if err != nil {
   200  		t.Fatal(err)
   201  	}
   202  
   203  	ok, err := cmpimg.Equal("pdf", got, want)
   204  	if err != nil {
   205  		t.Fatal(err)
   206  	}
   207  	if !ok {
   208  		t.Fatalf("images differ")
   209  	}
   210  }
   211  
   212  func BenchmarkCanvas(b *testing.B) {
   213  	p := plot.New()
   214  
   215  	xys := plotter.XYs{
   216  		plotter.XY{X: 0, Y: 0},
   217  		plotter.XY{X: 1, Y: 1},
   218  		plotter.XY{X: 2, Y: 2},
   219  	}
   220  
   221  	p.Title.Text = "My title"
   222  	p.X.Tick.Label.Font.Size = 0 // hide X-axis labels
   223  	p.Y.Tick.Label.Font.Size = 0 // hide Y-axis labels
   224  
   225  	lines, points, err := plotter.NewLinePoints(xys)
   226  	if err != nil {
   227  		log.Fatal(err)
   228  	}
   229  	lines.Color = color.RGBA{B: 255, A: 255}
   230  
   231  	p.Add(lines, points)
   232  	p.Add(plotter.NewGrid())
   233  
   234  	c := vgpdf.New(5*vg.Centimeter, 5*vg.Centimeter)
   235  	d := draw.New(c)
   236  
   237  	b.ResetTimer()
   238  	for i := 0; i < b.N; i++ {
   239  		p.Draw(d)
   240  	}
   241  }
   242  
   243  func BenchmarkCanvasImage(b *testing.B) {
   244  	c := vgpdf.New(5*vg.Centimeter, 5*vg.Centimeter)
   245  	raw, err := os.ReadFile("../../plotter/testdata/gopher.png")
   246  	if err != nil {
   247  		b.Fatalf("could not read test image: %+v", err)
   248  	}
   249  	img, err := png.Decode(bytes.NewReader(raw))
   250  	if err != nil {
   251  		b.Fatalf("could not decode test image: %+v", err)
   252  	}
   253  
   254  	b.ResetTimer()
   255  	for i := 0; i < b.N; i++ {
   256  		c.DrawImage(vg.Rectangle{Max: vg.Point{X: 2, Y: 2}}, img)
   257  	}
   258  }
   259  

View as plain text