test "bench: render_to_html - simple element" (b : @bench.T) {
  let node = div("hello")
  b.bench(fn() { b.keep(render_to_html(node)) })
}

test "bench: render_to_html - nested tree (depth 5)" (b : @bench.T) {
  let node = div(
    [
      h1("Title"),
      div(
        [
          p("paragraph 1"),
          p("paragraph 2"),
          div([span("inner 1"), span("inner 2"), span("inner 3")]),
        ],
      ),
      ul(
        [
          li("item 1"),
          li("item 2"),
          li("item 3"),
          li("item 4"),
          li("item 5"),
        ],
      ),
    ],
  )
  b.bench(fn() { b.keep(render_to_html(node)) })
}

test "bench: render_to_html - wide list (100 items)" (b : @bench.T) {
  let items : Array[Node] = Array::new(capacity=100)
  for i = 0; i < 100; i = i + 1 {
    items.push(li("item " + i.to_string()))
  }
  let node = ul(items)
  b.bench(fn() { b.keep(render_to_html(node)) })
}

test "bench: render_to_html - attributes" (b : @bench.T) {
  let node = div(
    attrs={"class": "container mx-auto", "id": "main", "data-value": "42"},
    [
      a(attrs={"href": "/about", "class": "link"}, "About"),
      img(attrs={"src": "/img.png", "alt": "photo", "width": "200"}),
      input(
        attrs={
          "type": "text",
          "name": "q",
          "placeholder": "Search...",
          "class": "input",
        },
      ),
    ],
  )
  b.bench(fn() { b.keep(render_to_html(node)) })
}

test "bench: render_to_html - html escape" (b : @bench.T) {
  let node = div(
    [
      p(""),
      p("Tom & Jerry"),
      p("a < b > c & d \"e\" f'g'"),
    ],
  )
  b.bench(fn() { b.keep(render_to_html(node)) })
}

test "bench: render_to_html - counter component" (b : @bench.T) {
  let count = @signals.signal(0)
  let node = div(
    [
      p(dyn_text(fn() { "Count: " + count.get().to_string() })),
      button("-") |> on_click(fn(_) { count.update(fn(n) { n - 1 }) }),
      button("+") |> on_click(fn(_) { count.update(fn(n) { n + 1 }) }),
    ],
  )
  b.bench(fn() { b.keep(render_to_html(node)) })
}

test "bench: render_to_html - large page" (b : @bench.T) {
  let rows : Array[Node] = Array::new(capacity=50)
  for i = 0; i < 50; i = i + 1 {
    rows.push(
      div(
        attrs={"class": "row"},
        [
          span(attrs={"class": "col"}, "Name " + i.to_string()),
          span(attrs={"class": "col"}, "Value " + (i * 10).to_string()),
          button(attrs={"class": "btn"}, "Edit"),
        ],
      ),
    )
  }
  let node = div(
    attrs={"class": "app"},
    [
      header(attrs={"class": "header"}, [h1("Dashboard"), nav([a("Home"), a("Settings")])]),
      main_tag(attrs={"class": "main"}, rows),
      footer(attrs={"class": "footer"}, [p("© 2025")]),
    ],
  )
  b.bench(fn() { b.keep(render_to_html(node)) })
}