handle zero values with error.

This commit is contained in:
Will Charczuk 2017-01-13 14:07:42 -08:00
parent 7163f89845
commit 7ae42ee2e1
3 changed files with 63 additions and 10 deletions

View file

@ -2,6 +2,7 @@ package chart
import ( import (
"errors" "errors"
"fmt"
"io" "io"
"github.com/golang/freetype/truetype" "github.com/golang/freetype/truetype"
@ -88,7 +89,10 @@ func (pc PieChart) Render(rp RendererProvider, w io.Writer) error {
pc.drawBackground(r) pc.drawBackground(r)
pc.drawCanvas(r, canvasBox) pc.drawCanvas(r, canvasBox)
finalValues := pc.finalizeValues(pc.Values) finalValues, err := pc.finalizeValues(pc.Values)
if err != nil {
return err
}
pc.drawSlices(r, canvasBox, finalValues) pc.drawSlices(r, canvasBox, finalValues)
pc.drawTitle(r) pc.drawTitle(r)
for _, a := range pc.Elements { for _, a := range pc.Elements {
@ -158,8 +162,12 @@ func (pc PieChart) drawSlices(r Renderer, canvasBox Box, values []Value) {
} }
} }
func (pc PieChart) finalizeValues(values []Value) []Value { func (pc PieChart) finalizeValues(values []Value) ([]Value, error) {
return Values(values).Normalize() finalValues := Values(values).Normalize()
if len(finalValues) == 0 {
return nil, fmt.Errorf("pie chart must contain at least (1) non-zero value")
}
return finalValues, nil
} }
func (pc PieChart) getDefaultCanvasBox() Box { func (pc PieChart) getDefaultCanvasBox() Box {

View file

@ -29,3 +29,41 @@ func TestPieChart(t *testing.T) {
pie.Render(PNG, b) pie.Render(PNG, b)
assert.NotZero(b.Len()) assert.NotZero(b.Len())
} }
func TestPieChartDropsZeroValues(t *testing.T) {
assert := assert.New(t)
pie := PieChart{
Canvas: Style{
FillColor: ColorLightGray,
},
Values: []Value{
{Value: 5, Label: "Blue"},
{Value: 5, Label: "Green"},
{Value: 0, Label: "Gray"},
},
}
b := bytes.NewBuffer([]byte{})
err := pie.Render(PNG, b)
assert.Nil(err)
}
func TestPieChartAllZeroValues(t *testing.T) {
assert := assert.New(t)
pie := PieChart{
Canvas: Style{
FillColor: ColorLightGray,
},
Values: []Value{
{Value: 0, Label: "Blue"},
{Value: 0, Label: "Green"},
{Value: 0, Label: "Gray"},
},
}
b := bytes.NewBuffer([]byte{})
err := pie.Render(PNG, b)
assert.NotNil(err)
}

View file

@ -26,13 +26,20 @@ func (vs Values) ValuesNormalized() []float64 {
// Normalize returns the values normalized. // Normalize returns the values normalized.
func (vs Values) Normalize() []Value { func (vs Values) Normalize() []Value {
output := make([]Value, len(vs)) var output []Value
total := Math.Sum(vs.Values()...) var total float64
for index, v := range vs {
output[index] = Value{ for _, v := range vs {
Style: v.Style, total += v.Value
Label: v.Label, }
Value: Math.RoundDown(v.Value/total, 0.0001),
for _, v := range vs {
if v.Value > 0 {
output = append(output, Value{
Style: v.Style,
Label: v.Label,
Value: Math.RoundDown(v.Value/total, 0.0001),
})
} }
} }
return output return output