...

Source file src/gonum.org/v1/plot/vg/vgimg/vgimg_test.go

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

     1  // Copyright ©2012 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 vgimg_test
     6  
     7  import (
     8  	"bytes"
     9  	"fmt"
    10  	"image/color"
    11  	"log"
    12  	"os"
    13  	"path/filepath"
    14  	"reflect"
    15  	"sync"
    16  	"testing"
    17  
    18  	"gonum.org/v1/plot"
    19  	"gonum.org/v1/plot/cmpimg"
    20  	"gonum.org/v1/plot/font"
    21  	"gonum.org/v1/plot/font/liberation"
    22  	"gonum.org/v1/plot/plotter"
    23  	"gonum.org/v1/plot/vg"
    24  	"gonum.org/v1/plot/vg/draw"
    25  	"gonum.org/v1/plot/vg/vgimg"
    26  )
    27  
    28  var cache = font.NewCache(liberation.Collection())
    29  
    30  func TestIssue179(t *testing.T) {
    31  	scatter, err := plotter.NewScatter(plotter.XYs{
    32  		{X: 1, Y: 1}, {X: 0, Y: 1}, {X: 0, Y: 0},
    33  	})
    34  	if err != nil {
    35  		log.Fatal(err)
    36  	}
    37  	p := plot.New()
    38  	p.Add(scatter)
    39  	p.HideAxes()
    40  
    41  	c := vgimg.JpegCanvas{Canvas: vgimg.New(5.08*vg.Centimeter, 5.08*vg.Centimeter)}
    42  	p.Draw(draw.New(c))
    43  	b := bytes.NewBuffer([]byte{})
    44  	if _, err = c.WriteTo(b); err != nil {
    45  		t.Fatal(err)
    46  	}
    47  
    48  	want, err := os.ReadFile("testdata/issue179_golden.jpg")
    49  	if err != nil {
    50  		t.Fatal(err)
    51  	}
    52  
    53  	ok, err := cmpimg.Equal("jpg", b.Bytes(), want)
    54  	if err != nil {
    55  		t.Fatal(err)
    56  	}
    57  	if !ok {
    58  		_ = os.WriteFile("testdata/issue179.jpg", b.Bytes(), 0644)
    59  		t.Fatalf("images differ")
    60  	}
    61  }
    62  
    63  func TestConcurrentInit(t *testing.T) {
    64  	var (
    65  		ft = cache.Lookup(font.Font{Variant: "Sans"}, 10)
    66  		wg sync.WaitGroup
    67  	)
    68  	wg.Add(2)
    69  	go func() {
    70  		c := vgimg.New(215, 215)
    71  		c.FillString(ft, vg.Point{}, "hi")
    72  		wg.Done()
    73  	}()
    74  	go func() {
    75  		c := vgimg.New(215, 215)
    76  		c.FillString(ft, vg.Point{}, "hi")
    77  		wg.Done()
    78  	}()
    79  	wg.Wait()
    80  }
    81  
    82  func TestUseBackgroundColor(t *testing.T) {
    83  	colors := []color.Color{color.Transparent, color.NRGBA{R: 255, A: 255}}
    84  	for i, col := range colors {
    85  		t.Run(fmt.Sprint(i), func(t *testing.T) {
    86  			c := vgimg.NewWith(vgimg.UseWH(1, 1), vgimg.UseBackgroundColor(col))
    87  			img := c.Image()
    88  			wantCol := color.RGBAModel.Convert(col)
    89  			haveCol := img.At(0, 0)
    90  			if !reflect.DeepEqual(haveCol, wantCol) {
    91  				t.Fatalf("color should be %#v but is %#v", wantCol, haveCol)
    92  			}
    93  		})
    94  	}
    95  }
    96  
    97  func TestIssue540(t *testing.T) {
    98  	p := plot.New()
    99  
   100  	xys := plotter.XYs{
   101  		plotter.XY{X: 0, Y: 0},
   102  		plotter.XY{X: 1, Y: 1},
   103  		plotter.XY{X: 2, Y: 2},
   104  	}
   105  
   106  	p.Title.Text = "My title"
   107  	p.X.Tick.Label.Font.Size = 0 // hide X-axis labels
   108  	p.Y.Tick.Label.Font.Size = 0 // hide Y-axis labels
   109  
   110  	lines, points, err := plotter.NewLinePoints(xys)
   111  	if err != nil {
   112  		log.Fatal(err)
   113  	}
   114  	lines.Color = color.RGBA{B: 255, A: 255}
   115  
   116  	p.Add(lines, points)
   117  	p.Add(plotter.NewGrid())
   118  
   119  	if *cmpimg.GenerateTestData {
   120  		// Recreate Golden images and exit.
   121  		err = p.Save(100, 100, "testdata/issue540_golden.png")
   122  		if err != nil {
   123  			t.Fatal(err)
   124  		}
   125  		return
   126  	}
   127  
   128  	err = p.Save(100, 100, "testdata/issue540.png")
   129  	if err != nil {
   130  		t.Fatal(err)
   131  	}
   132  
   133  	want, err := os.ReadFile("testdata/issue540_golden.png")
   134  	if err != nil {
   135  		t.Fatal(err)
   136  	}
   137  
   138  	got, err := os.ReadFile("testdata/issue540.png")
   139  	if err != nil {
   140  		t.Fatal(err)
   141  	}
   142  
   143  	ok, err := cmpimg.Equal("png", got, want)
   144  	if err != nil {
   145  		t.Fatal(err)
   146  	}
   147  	if !ok {
   148  		t.Fatalf("images differ")
   149  	}
   150  }
   151  
   152  func TestIssue687(t *testing.T) {
   153  	min := func(a, b int) int {
   154  		if a < b {
   155  			return a
   156  		}
   157  		return b
   158  	}
   159  
   160  	const (
   161  		fname = "testdata/issue687.png"
   162  		size  = 500
   163  	)
   164  	cmpimg.CheckPlot(func() {
   165  		p := plot.New()
   166  		p.Title.Text = "Issue 687"
   167  		p.X.Label.Text = "X"
   168  		p.Y.Label.Text = "Y"
   169  		data := make(plotter.XYs, 4779) // Lower values still lose part of horizontal.
   170  		for i := range data {
   171  			data[i] = plotter.XY{X: float64(i) / float64(len(data)*2), Y: float64(len(data) - min(i, len(data)/2))}
   172  		}
   173  		lines, err := plotter.NewLine(data)
   174  		lines.Color = color.RGBA{R: 0xff, A: 0xff}
   175  		if err != nil {
   176  			t.Fatal(err)
   177  		}
   178  		p.Add(lines)
   179  
   180  		err = p.Save(size, size, fname)
   181  		if err != nil {
   182  			t.Fatal(err)
   183  		}
   184  
   185  	}, t, filepath.Base(fname))
   186  }
   187  

View as plain text