1
2
3
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
108 p.Y.Tick.Label.Font.Size = 0
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
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)
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