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