package html import ( "errors" "strings" "testing" ) func TestLayout_HLCRF(t *testing.T) { ctx := NewContext() layout := NewLayout("HLCRF"). H(Raw("header")).L(Raw("left")).C(Raw("main")).R(Raw("right")).F(Raw("footer")) got := layout.Render(ctx) // Must contain semantic elements for _, want := range []string{"`, `
`, ``} { if !strings.Contains(got, want) { t.Errorf("empty slot should still render %q in:\n%s", want, got) } } } func TestValidateLayoutVariant(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_VariantError(t *testing.T) { tests := []struct { name string variant string wantErr bool wantErrString string wantRender string }{ { name: "valid variant", variant: "HCF", wantRender: `
header
` + `
main
` + ``, }, { name: "mixed invalid variant", variant: "HXC", wantErr: true, wantErrString: "html: invalid layout variant HXC", wantRender: `
header
` + `
main
`, }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { layout := NewLayout(tt.variant) layout.H(Raw("header")).C(Raw("main")).F(Raw("footer")) if tt.wantErr { if layout.VariantError() == nil { t.Fatalf("VariantError() = nil, want sentinel error for %q", tt.variant) } if !errors.Is(layout.VariantError(), ErrInvalidLayoutVariant) { t.Fatalf("VariantError() = %v, want errors.Is(..., ErrInvalidLayoutVariant)", layout.VariantError()) } if got := layout.VariantError().Error(); got != tt.wantErrString { t.Fatalf("VariantError().Error() = %q, want %q", got, tt.wantErrString) } } else if layout.VariantError() != nil { t.Fatalf("VariantError() = %v, want nil", layout.VariantError()) } got := layout.Render(NewContext()) if got != tt.wantRender { t.Fatalf("Render() = %q, want %q", got, tt.wantRender) } }) } } func TestLayout_RenderNilReceiver(t *testing.T) { var layout *Layout got := layout.Render(NewContext()) if got != "" { t.Fatalf("nil Layout should render empty string, got %q", got) } }