feat: primitive styling

This commit is contained in:
IliaDenisov
2026-03-07 17:01:22 +02:00
parent 477e656008
commit e4b956232f
18 changed files with 1264 additions and 175 deletions
+95
View File
@@ -0,0 +1,95 @@
package world
import (
"image/color"
"testing"
"github.com/stretchr/testify/require"
)
func TestStyleOverrideApply_OverridesOnlyProvidedFields(t *testing.T) {
t.Parallel()
base := Style{
FillColor: color.RGBA{R: 1, A: 255},
StrokeColor: color.RGBA{G: 2, A: 255},
StrokeWidthPx: 1.0,
StrokeDashes: []float64{3, 1},
StrokeDashOffset: 0.5,
PointRadiusPx: 2.0,
}
newWidth := 5.0
newRadius := 7.0
override := StyleOverride{
StrokeWidthPx: &newWidth,
PointRadiusPx: &newRadius,
// Everything else is unset (nil) => must remain from base.
}
out := override.Apply(base)
require.Equal(t, base.FillColor, out.FillColor)
require.Equal(t, base.StrokeColor, out.StrokeColor)
require.Equal(t, 5.0, out.StrokeWidthPx)
require.Equal(t, base.StrokeDashes, out.StrokeDashes)
require.Equal(t, base.StrokeDashOffset, out.StrokeDashOffset)
require.Equal(t, 7.0, out.PointRadiusPx)
}
func TestStyleTable_DefaultsExistAndAreStable(t *testing.T) {
t.Parallel()
tbl := NewStyleTable()
_, ok := tbl.Get(StyleIDDefaultLine)
require.True(t, ok)
_, ok = tbl.Get(StyleIDDefaultCircle)
require.True(t, ok)
_, ok = tbl.Get(StyleIDDefaultPoint)
require.True(t, ok)
}
func TestStyleTable_AddDerived_StoresResolvedStyleAndCopiesSlices(t *testing.T) {
t.Parallel()
tbl := NewStyleTable()
dashes := []float64{10, 5}
override := StyleOverride{
StrokeDashes: &dashes,
}
id := tbl.AddDerived(StyleIDDefaultLine, override)
got, ok := tbl.Get(id)
require.True(t, ok)
require.Equal(t, []float64{10, 5}, got.StrokeDashes)
// Mutate caller slice; table must not change.
dashes[0] = 999
got2, ok := tbl.Get(id)
require.True(t, ok)
require.Equal(t, []float64{10, 5}, got2.StrokeDashes)
// Mutate returned slice; table must not change.
got2.StrokeDashes[0] = 123
got3, ok := tbl.Get(id)
require.True(t, ok)
require.Equal(t, []float64{10, 5}, got3.StrokeDashes)
}
func TestDefaultPriorities_AreOrderedAndStepped(t *testing.T) {
t.Parallel()
require.Equal(t, 100, DefaultPriorityLine)
require.Equal(t, 200, DefaultPriorityCircle)
require.Equal(t, 300, DefaultPriorityPoint)
require.Less(t, DefaultPriorityLine, DefaultPriorityCircle)
require.Less(t, DefaultPriorityCircle, DefaultPriorityPoint)
}