Charts I: components 101-120
This commit is contained in:
116 files changed
+7825
-3
No files matched your search
@@ -0,0 +1,108 @@
|
||||
package mujica
|
||||
|
||||
import (
|
||||
"testing"
|
||||
"time"
|
||||
|
||||
"github.com/egoist/mygo/ui"
|
||||
)
|
||||
|
||||
// chartBuilders builds every Charts I component with a small data set.
|
||||
func chartBuilders() map[string]func(c *ui.Context) ChartResult {
|
||||
year := 2026
|
||||
var path, path2 []string
|
||||
var sel []ScatterKey
|
||||
var graph NetworkGraphState
|
||||
var rt RealtimeChartState
|
||||
buf := NewRealtimeBuffer(10, "a")
|
||||
buf.Append(rtStart, 1)
|
||||
buf.Append(rtStart.Add(time.Second), 2)
|
||||
target := 3.0
|
||||
f := ChartFrame{Label: "Under test"}
|
||||
return map[string]func(c *ui.Context) ChartResult{
|
||||
"line": func(c *ui.Context) ChartResult { return LineChart(c, lineSeries(), LineChartOptions{Frame: f}) },
|
||||
"area": func(c *ui.Context) ChartResult { return AreaChart(c, lineSeries(), AreaChartOptions{Frame: f}) },
|
||||
"bar": func(c *ui.Context) ChartResult { return BarChart(c, barCats, barSeries(), BarChartOptions{Frame: f}) },
|
||||
"pie": func(c *ui.Context) ChartResult { return PieChart(c, pieSlices, PieChartOptions{Frame: f}) },
|
||||
"scat": func(c *ui.Context) ChartResult {
|
||||
return ScatterChart(c, &sel, scatterGroups, ScatterChartOptions{Frame: f})
|
||||
},
|
||||
"radar": func(c *ui.Context) ChartResult {
|
||||
return RadarChart(c, radarAxes, radarSeries(), RadarChartOptions{Frame: f})
|
||||
},
|
||||
"heat": func(c *ui.Context) ChartResult {
|
||||
return HeatmapChart(c, heatRows, heatCols, heatValues(), HeatmapChartOptions{Frame: f})
|
||||
},
|
||||
"cal": func(c *ui.Context) ChartResult {
|
||||
return CalendarHeatmap(c, &year, calendarValues(), CalendarHeatmapOptions{Frame: f})
|
||||
},
|
||||
"hist": func(c *ui.Context) ChartResult { return Histogram(c, []float64{1, 2, 3}, HistogramOptions{Frame: f}) },
|
||||
"box": func(c *ui.Context) ChartResult { return BoxPlot(c, boxGroups, BoxPlotOptions{Frame: f}) },
|
||||
"fall": func(c *ui.Context) ChartResult {
|
||||
return WaterfallChart(c, waterfallSteps, WaterfallChartOptions{Frame: f})
|
||||
},
|
||||
"funnel": func(c *ui.Context) ChartResult { return FunnelChart(c, funnelStages, FunnelChartOptions{Frame: f}) },
|
||||
"bullet": func(c *ui.Context) ChartResult {
|
||||
return BulletChart(c, 2, BulletChartOptions{Frame: f, Target: &target, Bands: []float64{1, 4}})
|
||||
},
|
||||
"spark": func(c *ui.Context) ChartResult { return Sparkline(c, sparkValues, SparklineOptions{Frame: f}) },
|
||||
"gauge": func(c *ui.Context) ChartResult {
|
||||
return Gauge(c, 72, GaugeOptions{Frame: f, Max: 100, Segments: gaugeSegments})
|
||||
},
|
||||
"tree": func(c *ui.Context) ChartResult { return Treemap(c, &path, chartTree(), TreemapOptions{Frame: f}) },
|
||||
"sun": func(c *ui.Context) ChartResult { return Sunburst(c, &path2, chartTree(), SunburstOptions{Frame: f}) },
|
||||
"sankey": func(c *ui.Context) ChartResult {
|
||||
return SankeyChart(c, sankeyNodes, sankeyLinks, SankeyChartOptions{Frame: f})
|
||||
},
|
||||
"graph": func(c *ui.Context) ChartResult {
|
||||
return NetworkGraph(c, &graph, graphNodes, graphEdges, NetworkGraphOptions{Frame: f})
|
||||
},
|
||||
"rt": func(c *ui.Context) ChartResult {
|
||||
return RealtimeChart(c, &rt, buf, RealtimeChartOptions{Frame: f, Window: time.Minute})
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func TestChartsIgnoreInputWhenDisabled(t *testing.T) {
|
||||
for name, build := range chartBuilders() {
|
||||
values := 0
|
||||
h := &chartHarness{disabled: true, build: func(c *ui.Context) ChartResult {
|
||||
r := build(c)
|
||||
if r.ValueChanged() || r.Retried() {
|
||||
values++
|
||||
}
|
||||
if _, ok := r.Toggled(); ok {
|
||||
values++
|
||||
}
|
||||
return r
|
||||
}}
|
||||
tt := ui.NewTester(h.view, 560, 480)
|
||||
for range 6 {
|
||||
tt.Key(0, ui.KeyTab)
|
||||
tt.Key(0, ui.KeyRight)
|
||||
tt.Key(0, ui.KeyEnter)
|
||||
tt.Key(0, ui.KeySpace)
|
||||
}
|
||||
b := h.res.Element.Bounds()
|
||||
tt.Click("Under test")
|
||||
tt.ClickAt(b.X+b.W/2, b.Y+b.H/2)
|
||||
if h.res.Point != -1 || values != 0 {
|
||||
t.Errorf("%s: disabled chart took input: point %d, events %d", name, h.res.Point, values)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestChartsEnterAtFirstMark(t *testing.T) {
|
||||
for name, build := range chartBuilders() {
|
||||
h := &chartHarness{build: build}
|
||||
tt := ui.NewTester(h.view, 560, 480)
|
||||
tabTo(t, tt, "Under test")
|
||||
tt.Key(0, ui.KeyRight)
|
||||
if h.res.Point != 0 || chartReadout(tt) == msg2(tt) {
|
||||
t.Errorf("%s: first arrow read point %d", name, h.res.Point)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// msg2 is the hint line, read back to tell it from a readout.
|
||||
func msg2(*ui.Tester) string { return "Focus the chart and use the arrow keys to read values" }
|
||||
Reference in new issue
Block a user