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: `` +
`main` +
``,
},
{
name: "mixed invalid variant",
variant: "HXC",
wantErr: true,
wantErrString: "html: invalid layout variant HXC",
wantRender: `` +
`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)
}
}