From f543f02cc1b29f0ec329fc4a68a8af0ef82a5add Mon Sep 17 00:00:00 2001 From: Virgil Date: Fri, 3 Apr 2026 16:19:30 +0000 Subject: [PATCH] feat(html): add layout variant validation helper Co-Authored-By: Virgil --- edge_test.go | 31 +++++++++++++++++++++++++++++++ layout.go | 9 +++++++-- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/edge_test.go b/edge_test.go index 9f53f0e..2c91d2a 100644 --- a/edge_test.go +++ b/edge_test.go @@ -400,6 +400,37 @@ func TestLayout_VariantError_Bad(t *testing.T) { } } +func TestValidateLayoutVariant_Good(t *testing.T) { + tests := []struct { + name string + variant string + wantErr bool + }{ + {name: "valid", variant: "HCF", wantErr: false}, + {name: "invalid", variant: "HXC", wantErr: true}, + {name: "empty", variant: "", wantErr: false}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + err := ValidateLayoutVariant(tt.variant) + if tt.wantErr { + if err == nil { + t.Fatalf("ValidateLayoutVariant(%q) = nil, want error", tt.variant) + } + if !errors.Is(err, ErrInvalidLayoutVariant) { + t.Fatalf("ValidateLayoutVariant(%q) = %v, want ErrInvalidLayoutVariant", tt.variant, err) + } + return + } + + if err != nil { + t.Fatalf("ValidateLayoutVariant(%q) = %v, want nil", tt.variant, err) + } + }) + } +} + func TestLayout_InvalidVariantMixedValidInvalid_Bad(t *testing.T) { ctx := NewContext() diff --git a/layout.go b/layout.go index 370950c..7b98899 100644 --- a/layout.go +++ b/layout.go @@ -98,11 +98,16 @@ func NewLayout(variant string) *Layout { variant: variant, slots: make(map[byte][]Node), } - l.variantErr = validateLayoutVariant(variant) + l.variantErr = ValidateLayoutVariant(variant) return l } -func validateLayoutVariant(variant string) error { +// ValidateLayoutVariant reports whether a layout variant string contains only +// recognised slot characters. +// +// It returns nil for valid variants and ErrInvalidLayoutVariant wrapped in a +// layoutVariantError for invalid ones. +func ValidateLayoutVariant(variant string) error { var invalid bool for i := range len(variant) { if _, ok := slotRegistry[variant[i]]; ok {