func TestCrop(t *testing.T) { ls := LineStyle{ Color: color.NRGBA{0, 20, 0, 123}, Width: 0.1 * vg.Inch, } r1 := recorder.New(96) c1 := NewCanvas(r1, 6, 3) c11 := Crop(c1, 0, -3, 0, 0) c12 := Crop(c1, 3, 0, 0, 0) r2 := recorder.New(96) c2 := NewCanvas(r2, 6, 3) c21 := Canvas{ Canvas: c2.Canvas, Rectangle: Rectangle{ Min: Point{0, 0}, Max: Point{3, 3}, }, } c22 := Canvas{ Canvas: c2.Canvas, Rectangle: Rectangle{ Min: Point{3, 0}, Max: Point{6, 3}, }, } str := "unexpected result: %+v != %+v" if c11.Rectangle != c21.Rectangle { t.Errorf(str, c11.Rectangle, c21.Rectangle) } if c12.Rectangle != c22.Rectangle { t.Errorf(str, c11.Rectangle, c21.Rectangle) } c11.StrokeLine2(ls, c11.Min.X, c11.Min.Y, c11.Min.X+3*vg.Inch, c11.Min.Y+3*vg.Inch) c12.StrokeLine2(ls, c12.Min.X, c12.Min.Y, c12.Min.X+3*vg.Inch, c12.Min.Y+3*vg.Inch) c21.StrokeLine2(ls, c21.Min.X, c21.Min.Y, c21.Min.X+3*vg.Inch, c21.Min.Y+3*vg.Inch) c22.StrokeLine2(ls, c22.Min.X, c22.Min.Y, c22.Min.X+3*vg.Inch, c22.Min.Y+3*vg.Inch) if !reflect.DeepEqual(r1.Actions, r2.Actions) { t.Errorf(str, r1.Actions, r2.Actions) } }
func TestTile(t *testing.T) { r := recorder.New(96) c := NewCanvas(r, 13, 7) const ( rows = 2 cols = 3 pad = 1 ) tiles := Tiles{ Rows: rows, Cols: cols, PadTop: pad, PadBottom: pad, PadRight: pad, PadLeft: pad, PadX: pad, PadY: pad, } rectangles := [][]Rectangle{ { Rectangle{ Min: Point{1, 4}, Max: Point{4, 6}, }, Rectangle{ Min: Point{5, 4}, Max: Point{8, 6}, }, Rectangle{ Min: Point{9, 4}, Max: Point{12, 6}, }, }, { Rectangle{ Min: Point{1, 1}, Max: Point{4, 3}, }, Rectangle{ Min: Point{5, 1}, Max: Point{8, 3}, }, Rectangle{ Min: Point{9, 1}, Max: Point{12, 3}, }, }, } for j := 0; j < rows; j++ { for i := 0; i < cols; i++ { str := "row %d col %d unexpected result: %+v != %+v" tile := tiles.At(c, i, j) if tile.Rectangle != rectangles[j][i] { t.Errorf(str, j, i, tile.Rectangle, rectangles[j][i]) } } } }
func TestLegendAlignment(t *testing.T) { font, err := vg.MakeFont(plot.DefaultFont, 10.822510822510822) // This font size gives an entry height of 10. if err != nil { t.Fatalf("failed to create font: %v", err) } l := plot.Legend{ ThumbnailWidth: vg.Points(20), TextStyle: draw.TextStyle{Font: font}, } for _, n := range []string{"A", "B", "C", "D"} { b, err := plotter.NewBarChart(plotter.Values{0}, 1) if err != nil { t.Fatalf("failed to create bar chart %q: %v", n, err) } l.Add(n, b) } r := recorder.New(100) c := draw.NewCanvas(r, 100, 100) l.Draw(draw.Canvas{ Canvas: c.Canvas, Rectangle: draw.Rectangle{ Min: draw.Point{0, 0}, Max: draw.Point{100, 100}, }, }) got := r.Actions // want is a snapshot of the actions for the code above when the // graphical output has been visually confirmed to be correct for // the bar charts example show in gonum/plot#25. want := []recorder.Action{ &recorder.SetColor{ Color: color.Gray16{}, }, &recorder.Fill{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 30}, {Type: vg.LineComp, X: 80, Y: 40}, {Type: vg.LineComp, X: 100, Y: 40}, {Type: vg.LineComp, X: 100, Y: 30}, {Type: vg.CloseComp}, }, }, &recorder.SetColor{ Color: color.Gray16{}, }, &recorder.SetLineWidth{ Width: 1, }, &recorder.SetLineDash{}, &recorder.Stroke{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 30}, {Type: vg.LineComp, X: 80, Y: 40}, {Type: vg.LineComp, X: 100, Y: 40}, {Type: vg.LineComp, X: 100, Y: 30}, {Type: vg.LineComp, X: 80, Y: 30}, }, }, &recorder.SetColor{}, &recorder.FillString{ Font: string("Times-Roman"), Size: 10.822510822510822, X: 69.48051948051948, Y: 30.82251082251082, String: "A", }, &recorder.SetColor{ Color: color.Gray16{}, }, &recorder.Fill{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 20}, {Type: vg.LineComp, X: 80, Y: 30}, {Type: vg.LineComp, X: 100, Y: 30}, {Type: vg.LineComp, X: 100, Y: 20}, {Type: vg.CloseComp}, }, }, &recorder.SetColor{ Color: color.Gray16{}, }, &recorder.SetLineWidth{ Width: 1, }, &recorder.SetLineDash{}, &recorder.Stroke{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 20}, {Type: vg.LineComp, X: 80, Y: 30}, {Type: vg.LineComp, X: 100, Y: 30}, {Type: vg.LineComp, X: 100, Y: 20}, {Type: vg.LineComp, X: 80, Y: 20}, }, }, &recorder.SetColor{}, &recorder.FillString{ Font: string("Times-Roman"), Size: 10.822510822510822, X: 70.07575757575758, Y: 20.82251082251082, String: "B", }, &recorder.SetColor{ Color: color.Gray16{ Y: uint16(0), }, }, &recorder.Fill{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 10}, {Type: vg.LineComp, X: 80, Y: 20}, {Type: vg.LineComp, X: 100, Y: 20}, {Type: vg.LineComp, X: 100, Y: 10}, {Type: vg.CloseComp}, }, }, &recorder.SetColor{ Color: color.Gray16{}, }, &recorder.SetLineWidth{ Width: 1, }, &recorder.SetLineDash{}, &recorder.Stroke{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 10}, {Type: vg.LineComp, X: 80, Y: 20}, {Type: vg.LineComp, X: 100, Y: 20}, {Type: vg.LineComp, X: 100, Y: 10}, {Type: vg.LineComp, X: 80, Y: 10}, }, }, &recorder.SetColor{}, &recorder.FillString{ Font: string("Times-Roman"), Size: 10.822510822510822, X: 70.07575757575758, Y: 10.822510822510822, String: "C", }, &recorder.SetColor{ Color: color.Gray16{}, }, &recorder.Fill{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 0}, {Type: vg.LineComp, X: 80, Y: 10}, {Type: vg.LineComp, X: 100, Y: 10}, {Type: vg.LineComp, X: 100, Y: 0}, {Type: vg.CloseComp}, }, }, &recorder.SetColor{ Color: color.Gray16{}, }, &recorder.SetLineWidth{ Width: 1, }, &recorder.SetLineDash{}, &recorder.Stroke{ Path: vg.Path{ {Type: vg.MoveComp, X: 80, Y: 0}, {Type: vg.LineComp, X: 80, Y: 10}, {Type: vg.LineComp, X: 100, Y: 10}, {Type: vg.LineComp, X: 100, Y: 0}, {Type: vg.LineComp, X: 80, Y: 0}, }, }, &recorder.SetColor{}, &recorder.FillString{ Font: string("Times-Roman"), Size: 10.822510822510822, X: 69.48051948051948, Y: 0.8225108225108215, String: "D", }, } if !reflect.DeepEqual(got, want) { t.Errorf("unexpected legend actions:\ngot:\n%s\nwant:\n%s", formatActions(got), formatActions(want)) } }