summaryrefslogtreecommitdiff
path: root/internal/showcase/rank_history_svg_test.go
diff options
context:
space:
mode:
authorPaul Buetow <paul@buetow.org>2026-05-27 21:41:26 +0300
committerPaul Buetow <paul@buetow.org>2026-05-27 21:41:26 +0300
commit573dce2ed0a85165970060b034c9bc3ec2317ba9 (patch)
tree71436fe053c35904e9f8e51c841ab7857a85af26 /internal/showcase/rank_history_svg_test.go
parentbd86e04f112edbe0f6b4f8c2b6a8a5161ff11699 (diff)
showcase: extend rank history to 32 weeks, trim leading empty columns
Previously the graph was fixed at 5 weekly data points. Now: - rankHistoryPoints raised from 5 → 32 so the store accumulates up to 32 weekly snapshots and each project carries 32 history entries. - GenerateRankHistorySVG trims all leading all-zero columns before layout, so the graph only spans from the oldest week that any project actually has data — no empty space on the left when history is short. - displayPoints (trimmed width) drives all layout math: xPos(), xLabels, and the X-axis loop; numPoints is only used for the reversal placement. - xLabelStep() thins X-axis text labels when many columns are visible (step 1 for ≤6, 2 for ≤12, 4 for ≤24, 8 for >24 columns) while still drawing a grid line at every column and always labelling 'now'. - Test: give alpha a Spot at '4w' so trimming keeps that column and the time-axis label test still finds '4w ago' in the output. - New TestXLabelStep_ReturnsSensibleSteps covers the new helper. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Diffstat (limited to 'internal/showcase/rank_history_svg_test.go')
-rw-r--r--internal/showcase/rank_history_svg_test.go28
1 files changed, 27 insertions, 1 deletions
diff --git a/internal/showcase/rank_history_svg_test.go b/internal/showcase/rank_history_svg_test.go
index 06aab4c..d086a7d 100644
--- a/internal/showcase/rank_history_svg_test.go
+++ b/internal/showcase/rank_history_svg_test.go
@@ -16,7 +16,7 @@ func makeTestSummaries() []ProjectSummary {
{Spot: 2, Anchor: "1w", SnapshotDate: "2026-05-20"},
{Spot: 2, Anchor: "2w", SnapshotDate: "2026-05-13"},
{Spot: 3, Anchor: "3w", SnapshotDate: "2026-05-06"},
- {Spot: 0, Anchor: "4w"}, // missing snapshot week
+ {Spot: 4, Anchor: "4w", SnapshotDate: "2026-04-29"}, // oldest data point
},
},
{
@@ -239,6 +239,32 @@ func TestGenerateRankHistorySVG_PartialRankHistory(t *testing.T) {
require(strings.Contains(svg, `"name":"single-entry"`), "SVG should include 'single-entry' project")
}
+// TestXLabelStep_ReturnsSensibleSteps verifies the X-axis label density
+// function thins out labels as the number of display columns grows.
+func TestXLabelStep_ReturnsSensibleSteps(t *testing.T) {
+ t.Parallel()
+
+ tests := []struct {
+ displayPoints int
+ wantMax int // step must be ≤ wantMax
+ }{
+ {5, 1},
+ {10, 2},
+ {20, 4},
+ {32, 8},
+ }
+
+ for _, tc := range tests {
+ got := xLabelStep(tc.displayPoints)
+ if got > tc.wantMax {
+ t.Errorf("xLabelStep(%d) = %d, want ≤ %d", tc.displayPoints, got, tc.wantMax)
+ }
+ if got <= 0 {
+ t.Errorf("xLabelStep(%d) = %d, want > 0", tc.displayPoints, got)
+ }
+ }
+}
+
// TestGridStep_ReturnsSensibleSteps ensures the Y-axis step function keeps
// the graph legible across various project counts.
func TestGridStep_ReturnsSensibleSteps(t *testing.T) {