1
2
3
4
5 package plot_test
6
7 import (
8 "bytes"
9 "fmt"
10 "image/color"
11 "math"
12 "os"
13 "testing"
14 "time"
15
16 "gonum.org/v1/plot"
17 "gonum.org/v1/plot/cmpimg"
18 "gonum.org/v1/plot/font"
19 "gonum.org/v1/plot/plotter"
20 "gonum.org/v1/plot/text"
21 "gonum.org/v1/plot/vg"
22 "gonum.org/v1/plot/vg/draw"
23 "gonum.org/v1/plot/vg/recorder"
24 "gonum.org/v1/plot/vg/vgimg"
25 )
26
27 func TestLegendAlignment(t *testing.T) {
28 l := plot.Legend{
29 ThumbnailWidth: vg.Points(20),
30 TextStyle: text.Style{
31 Font: font.From(plot.DefaultFont, 10),
32 Handler: plot.DefaultTextHandler,
33 },
34 }
35 for i, n := range []string{"A", "B", "C", "D"} {
36 b, err := plotter.NewBarChart(plotter.Values{0}, 1)
37 if err != nil {
38 t.Fatalf("failed to create bar chart %q: %v", n, err)
39 }
40 b.Color = color.Gray{byte(i+1)*64 - 1}
41 l.Add(n, b)
42 }
43
44 c := vgimg.PngCanvas{Canvas: vgimg.New(5*vg.Centimeter, 5*vg.Centimeter)}
45 l.Draw(draw.New(c))
46 var buf bytes.Buffer
47 if _, err := c.WriteTo(&buf); err != nil {
48 t.Fatal(err)
49 }
50
51 if *cmpimg.GenerateTestData {
52
53 err := os.WriteFile("testdata/legendAlignment_golden.png", buf.Bytes(), 0o644)
54 if err != nil {
55 t.Fatal(err)
56 }
57 return
58 }
59
60 err := os.WriteFile("testdata/legendAlignment.png", buf.Bytes(), 0o644)
61 if err != nil {
62 t.Fatal(err)
63 }
64
65 want, err := os.ReadFile("testdata/legendAlignment_golden.png")
66 if err != nil {
67 t.Fatal(err)
68 }
69
70 ok, err := cmpimg.Equal("png", buf.Bytes(), want)
71 if err != nil {
72 t.Fatal(err)
73 }
74 if !ok {
75 t.Fatalf("images differ")
76 }
77
78 }
79
80 func TestIssue514(t *testing.T) {
81 for _, ulp := range []int{
82 0,
83 +1, +2, +3, +4, +5, +6, +7, +8, +9, +10, +11, +12, +13, +14, +15, +16, +17, +18, +19, +20, +21, +22,
84 -1, -2, -3, -4, -5, -6, -7, -8, -9, -10, -11, -12, -13, -14, -15, -16, -17, -18, -19, -20, -21, -22,
85 } {
86 t.Run(fmt.Sprintf("ulps%+02d", ulp), func(t *testing.T) {
87 done := make(chan int)
88 go func() {
89 defer close(done)
90
91 p := plot.New()
92
93 var (
94 y1 = 100.0
95 y2 = y1
96 )
97
98 switch {
99 case ulp < 0:
100 y2 = math.Float64frombits(math.Float64bits(y1) - uint64(-ulp))
101 case ulp > 0:
102 y2 = math.Float64frombits(math.Float64bits(y1) + uint64(ulp))
103 }
104
105 pts, err := plotter.NewScatter(plotter.XYs{
106 {X: 1, Y: y1},
107 {X: 1, Y: y2},
108 })
109 if err != nil {
110 t.Errorf("could not create scatter: %v", err)
111 return
112 }
113
114 p.Add(pts)
115
116 c := draw.NewCanvas(&recorder.Canvas{}, 100, 100)
117 p.Draw(c)
118 }()
119
120 timeout := time.NewTimer(100 * time.Millisecond)
121 defer timeout.Stop()
122
123 select {
124 case <-done:
125 case <-timeout.C:
126 t.Fatalf("could not create plot with small axis range within allotted time")
127 }
128 })
129 }
130 }
131
132 func TestDrawGlyphBoxes(t *testing.T) {
133 cmpimg.CheckPlot(func() {
134 p := plot.New()
135
136 p.Title.Text = "My very very very\nlong Title"
137 p.X.Min = 0
138 p.X.Max = 10
139 p.Y.Min = 0
140 p.Y.Max = 10
141
142 p.X.Label.Text = "X-axis"
143 p.Y.Label.Text = "Y-axis"
144
145 f1 := plotter.NewFunction(func(x float64) float64 { return 5 })
146 f1.LineStyle.Color = color.RGBA{R: 255, A: 255}
147
148 f2 := plotter.NewFunction(func(x float64) float64 { return 6 })
149 f2.LineStyle.Color = color.RGBA{B: 255, A: 255}
150
151 labels, err := plotter.NewLabels(plotter.XYLabels{
152 XYs: []plotter.XY{
153 {X: 2.5, Y: 2.5},
154 {X: 7.5, Y: 2.5},
155 {X: 7.5, Y: 7.5},
156 {X: 2.5, Y: 7.5},
157 },
158 Labels: []string{"Agg", "Bgg", "Cgg", "Dgg"},
159 })
160 if err != nil {
161 t.Fatalf("could not creates labels plotter: %+v", err)
162 }
163
164 p.Add(f1, f2, labels)
165 p.Add(plotter.NewGrid())
166
167 p.Legend.Add("fg1", f1)
168 p.Legend.Add("fg2", f2)
169 p.Legend.Top = true
170
171 c := vgimg.PngCanvas{
172 Canvas: vgimg.New(20*vg.Centimeter, 15*vg.Centimeter),
173 }
174
175 d := draw.New(c)
176 p.Draw(d)
177 p.DrawGlyphBoxes(d)
178
179 buf := new(bytes.Buffer)
180 _, err = c.WriteTo(buf)
181 if err != nil {
182 t.Fatalf("error: %+v", err)
183 }
184
185 err = os.WriteFile("testdata/glyphbox.png", buf.Bytes(), 0644)
186 if err != nil {
187 t.Fatalf("could not save plot: %+v", err)
188 }
189 }, t, "glyphbox.png")
190 }
191
View as plain text