Files
kjol/go/wasmruntime/vdom/vnode_test.go

47 lines
1.6 KiB
Go

package vdom
import (
"strings"
"testing"
)
// A boolean DOM property is a trap in HTML: the attribute's PRESENCE is what means
// true. checked="false" is a ticked checkbox — the value is not even read. So a false
// boolean prop must be omitted entirely, and a true one written bare.
func TestBoolPropSSR(t *testing.T) {
ticked := RenderHTML(Input(Attr("type", "checkbox"), BoolProp("checked", true)))
if !strings.Contains(ticked, " checked") {
t.Errorf("a checked box did not render the attribute: %s", ticked)
}
if strings.Contains(ticked, `checked="`) {
t.Errorf("a boolean attribute must be bare, not valued: %s", ticked)
}
unticked := RenderHTML(Input(Attr("type", "checkbox"), BoolProp("checked", false)))
if strings.Contains(unticked, "checked") {
t.Errorf(`an unchecked box must omit the attribute entirely — checked="false" renders as TICKED: %s`, unticked)
}
}
// Non-boolean props keep their values: an input's value is a string, and dropping it
// when empty would be just as wrong as writing checked="false".
func TestValuePropSSRKeepsItsValue(t *testing.T) {
got := RenderHTML(Input(Prop("value", "false")))
if !strings.Contains(got, `value="false"`) {
t.Errorf(`value="false" is a string, not a boolean, and must survive: %s`, got)
}
}
func TestIsBoolProp(t *testing.T) {
for _, k := range []string{"checked", "disabled", "selected", "open"} {
if !IsBoolProp(k) {
t.Errorf("%q should be known as a boolean property — the reconciler writes it as a string otherwise", k)
}
}
for _, k := range []string{"value", "className", "id"} {
if IsBoolProp(k) {
t.Errorf("%q is not a boolean property", k)
}
}
}