Allow empty Y-axis labels on linechart using a value formatter that returns empty strings

Signed-off-by: Xabier Larrakoetxea <slok69@gmail.com>
This commit is contained in:
Xabier Larrakoetxea 2019-05-04 08:08:55 +02:00
parent e152366a5c
commit 150b7e26e2
No known key found for this signature in database
GPG Key ID: FDAD7FD8275E1B32
5 changed files with 35 additions and 8 deletions

View File

@ -90,14 +90,17 @@ func Rectangle(rect image.Rectangle, ar image.Rectangle, h align.Horizontal, v a
// Text aligns the text within the given rectangle, returns the start point for the text.
// For the purposes of the alignment this assumes that text will be trimmed if
// it overruns the rectangle.
// This only supports a single line of text, the text must not contain non-printable characters.
// This only supports a single line of text, the text must not contain non-printable characters,
// allows empty text.
func Text(rect image.Rectangle, text string, h align.Horizontal, v align.Vertical) (image.Point, error) {
if strings.ContainsRune(text, '\n') {
return image.ZP, fmt.Errorf("the provided text contains a newline character: %q", text)
}
if err := wrap.ValidText(text); err != nil {
return image.ZP, fmt.Errorf("the provided text contains non printable character(s): %s", err)
if text != "" {
if err := wrap.ValidText(text); err != nil {
return image.ZP, fmt.Errorf("the provided text contains non printable character(s): %s", err)
}
}
cells := runewidth.StringWidth(text)

View File

@ -59,8 +59,8 @@ const (
)
// ValidText validates the provided text for wrapping.
// The text must not contain any control or space characters other
// than '\n' and ' '.
// The text must not be empty, contain any control or
// space characters other than '\n' and ' '.
func ValidText(text string) error {
if text == "" {
return errors.New("the text cannot be empty")

View File

@ -71,7 +71,7 @@ func yLabels(scale *YScale, labelWidth int) ([]*Label, error) {
if min := 2; scale.GraphHeight < min {
return nil, fmt.Errorf("cannot place labels on a canvas with height %d, minimum is %d", scale.GraphHeight, min)
}
if min := 1; labelWidth < min {
if min := 0; labelWidth < min {
return nil, fmt.Errorf("cannot place labels in label area width %d, minimum is %d", labelWidth, min)
}

View File

@ -45,7 +45,7 @@ func TestYLabels(t *testing.T) {
min: 0,
max: 1,
graphHeight: 2,
labelWidth: 0,
labelWidth: -1,
wantErr: true,
},
{

View File

@ -1692,7 +1692,31 @@ func TestLineChartDraws(t *testing.T) {
writes: func(lc *LineChart) error {
return lc.Series("first", []float64{0, 100})
},
wantDrawErr: true,
wantCapacity: 38,
want: func(size image.Point) *faketerm.Terminal {
ft := faketerm.MustNew(size)
c := testcanvas.MustNew(ft.Area())
// Y and X axis.
lines := []draw.HVLine{
{Start: image.Point{0, 0}, End: image.Point{0, 8}},
{Start: image.Point{0, 8}, End: image.Point{19, 8}},
}
testdraw.MustHVLines(c, lines)
// Value labels.
testdraw.MustText(c, "0", image.Point{1, 9})
testdraw.MustText(c, "1", image.Point{19, 9})
// Braille line.
graphAr := image.Rect(1, 0, 20, 8)
bc := testbraille.MustNew(graphAr)
testdraw.MustBrailleLine(bc, image.Point{0, 31}, image.Point{36, 0})
testbraille.MustCopyTo(bc, c)
testcanvas.MustApply(c, ft)
return ft
},
},
{
desc: "custom Y-axis labels using a value formatter that returns very long strings",