1package config
2
3import (
4 "os"
5 "path/filepath"
6 "strings"
7 "testing"
8
9 "github.com/bnema/vev/internal/domain"
10 "github.com/stretchr/testify/require"
11)
12
13func TestParsePaletteAnchor(t *testing.T) {
14 t.Parallel()
15
16 tests := []struct {
17 name string
18 input string
19 want domain.PaletteConfig
20 warnings []domain.Warning
21 }{
22 {name: "default is centered", want: domain.PaletteConfig{Anchor: domain.AnchorCenter, AnchorSet: true}},
23 {name: "explicit auto is case insensitive", input: "palette.anchor = AuTo\n", want: domain.PaletteConfig{}},
24 {name: "concrete anchors are trimmed and case insensitive", input: "palette.anchor = CENTER\npalette.anchor = top-left\npalette.anchor = Top\npalette.anchor = TOP-RIGHT\npalette.anchor = left\npalette.anchor = RIGHT\npalette.anchor = bottom-left\npalette.anchor = Bottom\npalette.anchor = BOTTOM-RIGHT \n", want: domain.PaletteConfig{Anchor: domain.AnchorBottomRight, AnchorSet: true}, warnings: []domain.Warning{{Line: 2, Msg: "duplicate key \"palette.anchor\""}, {Line: 3, Msg: "duplicate key \"palette.anchor\""}, {Line: 4, Msg: "duplicate key \"palette.anchor\""}, {Line: 5, Msg: "duplicate key \"palette.anchor\""}, {Line: 6, Msg: "duplicate key \"palette.anchor\""}, {Line: 7, Msg: "duplicate key \"palette.anchor\""}, {Line: 8, Msg: "duplicate key \"palette.anchor\""}, {Line: 9, Msg: "duplicate key \"palette.anchor\""}}},
25 {name: "invalid first preserves centered default", input: "palette.anchor = diagonal\n", want: domain.PaletteConfig{Anchor: domain.AnchorCenter, AnchorSet: true}, warnings: []domain.Warning{{Line: 1, Msg: "invalid palette.anchor \"diagonal\""}}},
26 {name: "valid then invalid preserves valid", input: "palette.anchor = top\npalette.anchor = diagonal\n", want: domain.PaletteConfig{Anchor: domain.AnchorTop, AnchorSet: true}, warnings: []domain.Warning{{Line: 2, Msg: "duplicate key \"palette.anchor\""}, {Line: 2, Msg: "invalid palette.anchor \"diagonal\""}}},
27 {name: "explicit then auto clears to auto", input: "palette.anchor = left\npalette.anchor = auto\n", want: domain.PaletteConfig{}, warnings: []domain.Warning{{Line: 2, Msg: "duplicate key \"palette.anchor\""}}},
28 }
29 for _, tt := range tests {
30 t.Run(tt.name, func(t *testing.T) {
31 cfg, warnings, err := Parse(strings.NewReader(tt.input))
32 require.NoError(t, err)
33 require.Equal(t, tt.want, cfg.Palette)
34 require.Equal(t, tt.warnings, warnings)
35 require.Empty(t, cfg.BindingEntries)
36 })
37 }
38}
39
40func TestLoadMissingPaletteAnchorDefaultsToCenter(t *testing.T) {
41 t.Parallel()
42 cfg, warnings, err := Load(filepath.Join(t.TempDir(), "missing"))
43 require.NoError(t, err)
44 require.Empty(t, warnings)
45 require.Equal(t, domain.PaletteConfig{Anchor: domain.AnchorCenter, AnchorSet: true}, cfg.Palette)
46}
47
48func TestWatchPaletteAnchorRestoresCenteredDefaultAfterFileRemoval(t *testing.T) {
49 t.Parallel()
50
51 path := filepath.Join(t.TempDir(), "config")
52 require.NoError(t, os.WriteFile(path, []byte("palette.anchor = top-right\n"), 0o600))
53 changes, stop := startWatch(t, path)
54
55 require.NoError(t, os.WriteFile(path, []byte("palette.anchor = bottom-left\n"), 0o600))
56 require.Equal(t, domain.AnchorBottomLeft, nextChange(t, changes).cfg.Palette.Anchor)
57
58 require.NoError(t, os.Remove(path))
59 got := nextChange(t, changes)
60 require.Equal(t, domain.PaletteConfig{Anchor: domain.AnchorCenter, AnchorSet: true}, got.cfg.Palette)
61 stop()
62}