Skip to content

feat: StreamRenderingComponent for stream rendering SSR #319

feat: StreamRenderingComponent for stream rendering SSR

feat: StreamRenderingComponent for stream rendering SSR #319

GitHub Actions / Unit tests succeeded May 23, 2024 in 0s

388 passed, 0 failed and 2 skipped

Tests passed successfully

✅ tests/Unit/TestResults/_fv-az700-747_2024-05-23_19_03_42.trx

390 tests were completed in 41s with 388 passed, 0 failed and 2 skipped.

Test suite Passed Failed Skipped Time
Bolero.Tests.Web.Elmish 5✅ 469ms
Bolero.Tests.Web.Html 26✅ 3s
Bolero.Tests.Web.Remoting 4✅ 1⚪ 1s
Bolero.Tests.Web.Routing 318✅ 29s
Bolero.Tests.Web.Templating 35✅ 1⚪ 2s

✅ Bolero.Tests.Web.Elmish

✅ ecomp passes attributes
✅ ElmishComponent dispatches message
✅ ElmishComponent is rendered
✅ Input event handler dispatches message
✅ ProgramComponent is rendered

✅ Bolero.Tests.Web.Html

✅ bind.change
✅ bind.change radio
✅ bind.changeFloat
✅ bind.changeInt
✅ bind.checked
✅ bind.input
✅ bind.inputFloat
✅ bind.inputInt
✅ Blazor Component
✅ Bolero Component
✅ Boolean cond reacts to events
✅ ComponentBindKeyAndRef
✅ ComponentChildContent
✅ ComponentRefBinder
✅ ComponentRefBinderRendersChildren
✅ Element with content that must be escaped
✅ Element with id and text content
✅ ElementBindKeyAndRef
✅ ElementRefBinder
✅ PreventDefault
✅ Raw HTML
✅ Render many for loop items
✅ Render many forEach items
✅ StopPropagation
✅ Union cond reacts to events
✅ Virtualize

✅ Bolero.Tests.Web.Remoting

✅ Authorized remote function fails if role is missing
✅ Authorized remote function fails when signed out
✅ Authorized remote function succeeds if role is present
✅ Authorized remote function succeeds when signed in
⚪ Set and remove key

✅ Bolero.Tests.Web.Routing

✅ Click link(Home)
✅ Click link(NoArg)
✅ Click link(WithArg "")
✅ Click link(WithArg "bar")
✅ Click link(WithArg "foo")
✅ Click link(WithArg "日本語")
✅ Click link(WithArgs ❨"", 3❩)
✅ Click link(WithArgs ❨"bar", 2❩)
✅ Click link(WithArgs ❨"foo", 1❩)
✅ Click link(WithArray [|❨2, ""❩; ❨34, "b"❩|])
✅ Click link(WithArray [|❨2, "a"❩; ❨34, "b"❩|])
✅ Click link(WithList [❨2, ""❩; ❨34, "b"❩])
✅ Click link(WithList [❨2, "a"❩; ❨34, "b"❩])
✅ Click link(WithModel { Model = 0 })
✅ Click link(WithModelAndArgs ❨42, { Model = null }❩)
✅ Click link(WithNestedUnion ❨WithArg ""❩)
✅ Click link(WithNestedUnion ❨WithArg "bar"❩)
✅ Click link(WithNestedUnion ❨WithArg "foo"❩)
✅ Click link(WithNestedUnion ❨WithArg "日本語"❩)
✅ Click link(WithNestedUnion ❨WithArgs ❨"", 3❩❩)
✅ Click link(WithNestedUnion ❨WithArgs ❨"bar", 2❩❩)
✅ Click link(WithNestedUnion ❨WithArgs ❨"foo", 1❩❩)
✅ Click link(WithNestedUnion ❨WithArray [|❨2, ""❩; ❨34, "b"❩|]❩)
✅ Click link(WithNestedUnion ❨WithArray [|❨2, "a"❩; ❨34, "b"❩|]❩)
✅ Click link(WithNestedUnion ❨WithList [❨2, ""❩; ❨34, "b"❩]❩)
✅ Click link(WithNestedUnion ❨WithList [❨2, "a"❩; ❨34, "b"❩]❩)
✅ Click link(WithNestedUnion ❨WithModel { Model = 0 }❩)
✅ Click link(WithNestedUnion ❨WithModelAndArgs ❨42, { Model = null }❩❩)
✅ Click link(WithNestedUnion ❨WithPath ""❩)
✅ Click link(WithNestedUnion ❨WithPath "abc"❩)
✅ Click link(WithNestedUnion ❨WithPathAndSuffix ""❩)
✅ Click link(WithNestedUnion ❨WithPathAndSuffix "abc"❩)
✅ Click link(WithNestedUnion ❨WithPathAndSuffix2 ❨"", 123❩❩)
✅ Click link(WithNestedUnion ❨WithPathAndSuffix2 ❨"abc", 123❩❩)
✅ Click link(WithNestedUnion ❨WithPathAndSuffix3 ""❩)
✅ Click link(WithNestedUnion ❨WithPathAndSuffix3 "abc"❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerHome
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerNoArg
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArg ""
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArg "bar"
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArg "foo"
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArgs ❨"", 3❩
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArgs ❨"bar", 2❩
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArgs ❨"foo", 1❩
                                  z = false }❩)
✅ Click link(WithNestedUnion ❨WithQuery ❨42, 1, 2, Some 3, ValueNone❩❩)
✅ Click link(WithNestedUnion ❨WithQuery ❨42, 4, 5, None, ValueSome 3❩❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerHome
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerNoArg
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArg ""
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArg "bar"
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArg "foo"
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArgs ❨"", 3❩
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArgs ❨"bar", 2❩
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArgs ❨"foo", 1❩
                              z = true }❩)
✅ Click link(WithNestedUnion ❨WithRestArray [|❨1, "foo"❩; ❨2, "bar"❩|]❩)
✅ Click link(WithNestedUnion ❨WithRestArray [|❨1, "foo"❩|]❩)
✅ Click link(WithNestedUnion ❨WithRestArray [||]❩)
✅ Click link(WithNestedUnion ❨WithRestList []❩)
✅ Click link(WithNestedUnion ❨WithRestList [12; 34; 56]❩)
✅ Click link(WithNestedUnion ❨WithRestList [42]❩)
✅ Click link(WithNestedUnion ❨WithRestString ""❩)
✅ Click link(WithNestedUnion ❨WithRestString "foo"❩)
✅ Click link(WithNestedUnion ❨WithRestString "foo/bar"❩)
✅ Click link(WithNestedUnion ❨WithTuple ❨324, "", false❩❩)
✅ Click link(WithNestedUnion ❨WithTuple ❨42, "hi", true❩❩)
✅ Click link(WithNestedUnion ❨WithUnion ❨InnerWithArg ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnion ❨InnerWithArg "bar"❩❩)
✅ Click link(WithNestedUnion ❨WithUnion ❨InnerWithArg "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnion ❨InnerWithArgs ❨"", 3❩❩❩)
✅ Click link(WithNestedUnion ❨WithUnion ❨InnerWithArgs ❨"bar", 2❩❩❩)
✅ Click link(WithNestedUnion ❨WithUnion ❨InnerWithArgs ❨"foo", 1❩❩❩)
✅ Click link(WithNestedUnion ❨WithUnion InnerHome❩)
✅ Click link(WithNestedUnion ❨WithUnion InnerNoArg❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerHome, ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerHome, "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerNoArg, ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerNoArg, "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "", ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "", "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "bar", ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "bar", "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "foo", ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "foo", "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, "foo"❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, ""❩❩)
✅ Click link(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, "foo"❩❩)
✅ Click link(WithNestedUnion Home)
✅ Click link(WithNestedUnion NoArg)
✅ Click link(WithNestedUnion WithPathConstant)
✅ Click link(WithPath "")
✅ Click link(WithPath "abc")
✅ Click link(WithPathAndSuffix "")
✅ Click link(WithPathAndSuffix "abc")
✅ Click link(WithPathAndSuffix2 ❨"", 123❩)
✅ Click link(WithPathAndSuffix2 ❨"abc", 123❩)
✅ Click link(WithPathAndSuffix3 "")
✅ Click link(WithPathAndSuffix3 "abc")
✅ Click link(WithPathConstant)
✅ Click link(WithPathRecord { x = 3
                 y = InnerHome
                 z = false })
✅ Click link(WithPathRecord { x = 3
                 y = InnerNoArg
                 z = false })
✅ Click link(WithPathRecord { x = 3
                 y = InnerWithArg ""
                 z = false })
✅ Click link(WithPathRecord { x = 3
                 y = InnerWithArg "bar"
                 z = false })
✅ Click link(WithPathRecord { x = 3
                 y = InnerWithArg "foo"
                 z = false })
✅ Click link(WithPathRecord { x = 3
                 y = InnerWithArgs ❨"", 3❩
                 z = false })
✅ Click link(WithPathRecord { x = 3
                 y = InnerWithArgs ❨"bar", 2❩
                 z = false })
✅ Click link(WithPathRecord { x = 3
                 y = InnerWithArgs ❨"foo", 1❩
                 z = false })
✅ Click link(WithQuery ❨42, 1, 2, Some 3, ValueNone❩)
✅ Click link(WithQuery ❨42, 4, 5, None, ValueSome 3❩)
✅ Click link(WithRecord { x = 1
             y = InnerHome
             z = true })
✅ Click link(WithRecord { x = 1
             y = InnerNoArg
             z = true })
✅ Click link(WithRecord { x = 1
             y = InnerWithArg ""
             z = true })
✅ Click link(WithRecord { x = 1
             y = InnerWithArg "bar"
             z = true })
✅ Click link(WithRecord { x = 1
             y = InnerWithArg "foo"
             z = true })
✅ Click link(WithRecord { x = 1
             y = InnerWithArgs ❨"", 3❩
             z = true })
✅ Click link(WithRecord { x = 1
             y = InnerWithArgs ❨"bar", 2❩
             z = true })
✅ Click link(WithRecord { x = 1
             y = InnerWithArgs ❨"foo", 1❩
             z = true })
✅ Click link(WithRestArray [|❨1, "foo"❩; ❨2, "bar"❩|])
✅ Click link(WithRestArray [|❨1, "foo"❩|])
✅ Click link(WithRestArray [||])
✅ Click link(WithRestList [])
✅ Click link(WithRestList [12; 34; 56])
✅ Click link(WithRestList [42])
✅ Click link(WithRestString "")
✅ Click link(WithRestString "foo")
✅ Click link(WithRestString "foo/bar")
✅ Click link(WithTuple ❨324, "", false❩)
✅ Click link(WithTuple ❨42, "hi", true❩)
✅ Click link(WithUnion ❨InnerWithArg ""❩)
✅ Click link(WithUnion ❨InnerWithArg "bar"❩)
✅ Click link(WithUnion ❨InnerWithArg "foo"❩)
✅ Click link(WithUnion ❨InnerWithArgs ❨"", 3❩❩)
✅ Click link(WithUnion ❨InnerWithArgs ❨"bar", 2❩❩)
✅ Click link(WithUnion ❨InnerWithArgs ❨"foo", 1❩❩)
✅ Click link(WithUnion InnerHome)
✅ Click link(WithUnion InnerNoArg)
✅ Click link(WithUnionNotTerminal ❨InnerHome, ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerHome, "foo"❩)
✅ Click link(WithUnionNotTerminal ❨InnerNoArg, ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerNoArg, "foo"❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArg "", ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArg "", "foo"❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArg "bar", ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArg "bar", "foo"❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArg "foo", ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArg "foo", "foo"❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, "foo"❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, "foo"❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, ""❩)
✅ Click link(WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, "foo"❩)
✅ Invalid routers(Dictionary`2)
✅ Invalid routers(Duplicate field)
✅ Invalid routers(Identical paths with different parameter names)
✅ Invalid routers(Incomplete parameter list)
✅ Invalid routers(Invalid parameter syntax)
✅ Invalid routers(Mismatched type parameters in same position)
✅ Invalid routers(Rest parameter in non-final position)
✅ Invalid routers(Unknown parameter name)
✅ Link with anchor
✅ Not found
✅ Set by model(Home)
✅ Set by model(NoArg)
✅ Set by model(WithArg "")
✅ Set by model(WithArg "bar")
✅ Set by model(WithArg "foo")
✅ Set by model(WithArg "日本語")
✅ Set by model(WithArgs ❨"", 3❩)
✅ Set by model(WithArgs ❨"bar", 2❩)
✅ Set by model(WithArgs ❨"foo", 1❩)
✅ Set by model(WithArray [|❨2, ""❩; ❨34, "b"❩|])
✅ Set by model(WithArray [|❨2, "a"❩; ❨34, "b"❩|])
✅ Set by model(WithList [❨2, ""❩; ❨34, "b"❩])
✅ Set by model(WithList [❨2, "a"❩; ❨34, "b"❩])
✅ Set by model(WithModel { Model = 0 })
✅ Set by model(WithModelAndArgs ❨42, { Model = null }❩)
✅ Set by model(WithNestedUnion ❨WithArg ""❩)
✅ Set by model(WithNestedUnion ❨WithArg "bar"❩)
✅ Set by model(WithNestedUnion ❨WithArg "foo"❩)
✅ Set by model(WithNestedUnion ❨WithArg "日本語"❩)
✅ Set by model(WithNestedUnion ❨WithArgs ❨"", 3❩❩)
✅ Set by model(WithNestedUnion ❨WithArgs ❨"bar", 2❩❩)
✅ Set by model(WithNestedUnion ❨WithArgs ❨"foo", 1❩❩)
✅ Set by model(WithNestedUnion ❨WithArray [|❨2, ""❩; ❨34, "b"❩|]❩)
✅ Set by model(WithNestedUnion ❨WithArray [|❨2, "a"❩; ❨34, "b"❩|]❩)
✅ Set by model(WithNestedUnion ❨WithList [❨2, ""❩; ❨34, "b"❩]❩)
✅ Set by model(WithNestedUnion ❨WithList [❨2, "a"❩; ❨34, "b"❩]❩)
✅ Set by model(WithNestedUnion ❨WithModel { Model = 0 }❩)
✅ Set by model(WithNestedUnion ❨WithModelAndArgs ❨42, { Model = null }❩❩)
✅ Set by model(WithNestedUnion ❨WithPath ""❩)
✅ Set by model(WithNestedUnion ❨WithPath "abc"❩)
✅ Set by model(WithNestedUnion ❨WithPathAndSuffix ""❩)
✅ Set by model(WithNestedUnion ❨WithPathAndSuffix "abc"❩)
✅ Set by model(WithNestedUnion ❨WithPathAndSuffix2 ❨"", 123❩❩)
✅ Set by model(WithNestedUnion ❨WithPathAndSuffix2 ❨"abc", 123❩❩)
✅ Set by model(WithNestedUnion ❨WithPathAndSuffix3 ""❩)
✅ Set by model(WithNestedUnion ❨WithPathAndSuffix3 "abc"❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerHome
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerNoArg
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArg ""
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArg "bar"
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArg "foo"
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArgs ❨"", 3❩
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArgs ❨"bar", 2❩
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithPathRecord { x = 3
                                  y = InnerWithArgs ❨"foo", 1❩
                                  z = false }❩)
✅ Set by model(WithNestedUnion ❨WithQuery ❨42, 1, 2, Some 3, ValueNone❩❩)
✅ Set by model(WithNestedUnion ❨WithQuery ❨42, 4, 5, None, ValueSome 3❩❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerHome
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerNoArg
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArg ""
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArg "bar"
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArg "foo"
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArgs ❨"", 3❩
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArgs ❨"bar", 2❩
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRecord { x = 1
                              y = InnerWithArgs ❨"foo", 1❩
                              z = true }❩)
✅ Set by model(WithNestedUnion ❨WithRestArray [|❨1, "foo"❩; ❨2, "bar"❩|]❩)
✅ Set by model(WithNestedUnion ❨WithRestArray [|❨1, "foo"❩|]❩)
✅ Set by model(WithNestedUnion ❨WithRestArray [||]❩)
✅ Set by model(WithNestedUnion ❨WithRestList []❩)
✅ Set by model(WithNestedUnion ❨WithRestList [12; 34; 56]❩)
✅ Set by model(WithNestedUnion ❨WithRestList [42]❩)
✅ Set by model(WithNestedUnion ❨WithRestString ""❩)
✅ Set by model(WithNestedUnion ❨WithRestString "foo"❩)
✅ Set by model(WithNestedUnion ❨WithRestString "foo/bar"❩)
✅ Set by model(WithNestedUnion ❨WithTuple ❨324, "", false❩❩)
✅ Set by model(WithNestedUnion ❨WithTuple ❨42, "hi", true❩❩)
✅ Set by model(WithNestedUnion ❨WithUnion ❨InnerWithArg ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnion ❨InnerWithArg "bar"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnion ❨InnerWithArg "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnion ❨InnerWithArgs ❨"", 3❩❩❩)
✅ Set by model(WithNestedUnion ❨WithUnion ❨InnerWithArgs ❨"bar", 2❩❩❩)
✅ Set by model(WithNestedUnion ❨WithUnion ❨InnerWithArgs ❨"foo", 1❩❩❩)
✅ Set by model(WithNestedUnion ❨WithUnion InnerHome❩)
✅ Set by model(WithNestedUnion ❨WithUnion InnerNoArg❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerHome, ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerHome, "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerNoArg, ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerNoArg, "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "", ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "", "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "bar", ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "bar", "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "foo", ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArg "foo", "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, "foo"❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, ""❩❩)
✅ Set by model(WithNestedUnion ❨WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, "foo"❩❩)
✅ Set by model(WithNestedUnion Home)
✅ Set by model(WithNestedUnion NoArg)
✅ Set by model(WithNestedUnion WithPathConstant)
✅ Set by model(WithPath "")
✅ Set by model(WithPath "abc")
✅ Set by model(WithPathAndSuffix "")
✅ Set by model(WithPathAndSuffix "abc")
✅ Set by model(WithPathAndSuffix2 ❨"", 123❩)
✅ Set by model(WithPathAndSuffix2 ❨"abc", 123❩)
✅ Set by model(WithPathAndSuffix3 "")
✅ Set by model(WithPathAndSuffix3 "abc")
✅ Set by model(WithPathConstant)
✅ Set by model(WithPathRecord { x = 3
                 y = InnerHome
                 z = false })
✅ Set by model(WithPathRecord { x = 3
                 y = InnerNoArg
                 z = false })
✅ Set by model(WithPathRecord { x = 3
                 y = InnerWithArg ""
                 z = false })
✅ Set by model(WithPathRecord { x = 3
                 y = InnerWithArg "bar"
                 z = false })
✅ Set by model(WithPathRecord { x = 3
                 y = InnerWithArg "foo"
                 z = false })
✅ Set by model(WithPathRecord { x = 3
                 y = InnerWithArgs ❨"", 3❩
                 z = false })
✅ Set by model(WithPathRecord { x = 3
                 y = InnerWithArgs ❨"bar", 2❩
                 z = false })
✅ Set by model(WithPathRecord { x = 3
                 y = InnerWithArgs ❨"foo", 1❩
                 z = false })
✅ Set by model(WithQuery ❨42, 1, 2, Some 3, ValueNone❩)
✅ Set by model(WithQuery ❨42, 4, 5, None, ValueSome 3❩)
✅ Set by model(WithRecord { x = 1
             y = InnerHome
             z = true })
✅ Set by model(WithRecord { x = 1
             y = InnerNoArg
             z = true })
✅ Set by model(WithRecord { x = 1
             y = InnerWithArg ""
             z = true })
✅ Set by model(WithRecord { x = 1
             y = InnerWithArg "bar"
             z = true })
✅ Set by model(WithRecord { x = 1
             y = InnerWithArg "foo"
             z = true })
✅ Set by model(WithRecord { x = 1
             y = InnerWithArgs ❨"", 3❩
             z = true })
✅ Set by model(WithRecord { x = 1
             y = InnerWithArgs ❨"bar", 2❩
             z = true })
✅ Set by model(WithRecord { x = 1
             y = InnerWithArgs ❨"foo", 1❩
             z = true })
✅ Set by model(WithRestArray [|❨1, "foo"❩; ❨2, "bar"❩|])
✅ Set by model(WithRestArray [|❨1, "foo"❩|])
✅ Set by model(WithRestArray [||])
✅ Set by model(WithRestList [])
✅ Set by model(WithRestList [12; 34; 56])
✅ Set by model(WithRestList [42])
✅ Set by model(WithRestString "")
✅ Set by model(WithRestString "foo")
✅ Set by model(WithRestString "foo/bar")
✅ Set by model(WithTuple ❨324, "", false❩)
✅ Set by model(WithTuple ❨42, "hi", true❩)
✅ Set by model(WithUnion ❨InnerWithArg ""❩)
✅ Set by model(WithUnion ❨InnerWithArg "bar"❩)
✅ Set by model(WithUnion ❨InnerWithArg "foo"❩)
✅ Set by model(WithUnion ❨InnerWithArgs ❨"", 3❩❩)
✅ Set by model(WithUnion ❨InnerWithArgs ❨"bar", 2❩❩)
✅ Set by model(WithUnion ❨InnerWithArgs ❨"foo", 1❩❩)
✅ Set by model(WithUnion InnerHome)
✅ Set by model(WithUnion InnerNoArg)
✅ Set by model(WithUnionNotTerminal ❨InnerHome, ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerHome, "foo"❩)
✅ Set by model(WithUnionNotTerminal ❨InnerNoArg, ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerNoArg, "foo"❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArg "", ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArg "", "foo"❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArg "bar", ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArg "bar", "foo"❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArg "foo", ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArg "foo", "foo"❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArgs ❨"", 3❩, "foo"❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArgs ❨"bar", 2❩, "foo"❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, ""❩)
✅ Set by model(WithUnionNotTerminal ❨InnerWithArgs ❨"foo", 1❩, "foo"❩)

✅ Bolero.Tests.Web.Templating

✅ Attr hole
✅ Attr hole [multiple]("attrhole2-1")
✅ Attr hole [multiple]("attrhole2-2")
✅ Attr hole mixed with node hole
✅ Attr hole obj value
✅ Bind checkbox
✅ Bind float("-onchange")
⚪ Bind float("")
✅ Bind int("-onchange")
✅ Bind int("")
✅ Bind string to normal input("-onchange")
✅ Bind string to normal input("")
✅ Bind string to select
✅ Bind string to textarea("-onchange")
✅ Bind string to textarea("")
✅ Event hole
✅ File template is instantiated
✅ File template node hole filled
✅ Full attr hole
✅ Inline template is instantiated
✅ Nested template hole filled
✅ Nested template is instantiated
✅ Nested template is removed from its original parent
✅ Node hole filled with node
✅ Node hole filled with node [multiple]("nodehole4-1")
✅ Node hole filled with node [multiple]("nodehole4-2")
✅ Node hole filled with string
✅ Node hole filled with string [multiple]("nodehole3-1")
✅ Node hole filled with string [multiple]("nodehole3-2")
✅ Recursively nested template is instantiated
✅ Recursively nested template is removed from its original parent
✅ Regression #11: common hole in attrs and children
✅ Regression #256: attribute name case is respected
✅ Scoped CSS is propagated to elements that don't have holes
✅ Scoped CSS is propagated to elements that have holes
✅ Template element ref