///| GFM table parsing benchmarks (split from bench.mbt).

// Table parsing benchmarks

///|
let table_simple : String = "| A | B |\n|---|---|\n| 1 | 2 |\n"

///|
let table_medium : String = "| Col1 | Col2 | Col3 | Col4 |\n|:---|:---:|---:|---|\n| a | b | c | d |\n| e | f | g | h |\n| i | j | k | l |\n| m | n | o | p |\n| q | r | s | t |\n"

///|
fn generate_large_table(rows : Int, cols : Int) -> String {
  let buf = StringBuilder::new()
  // Header
  buf.write_string("|")
  for c = 0; c < cols; c = c + 1 {
    buf.write_string(" H\{c} |")
  }
  buf.write_string("\n|")
  for c = 0; c < cols; c = c + 1 {
    buf.write_string("---|")
  }
  buf.write_string("\n")
  // Rows
  for r = 0; r < rows; r = r + 1 {
    buf.write_string("|")
    for c = 0; c < cols; c = c + 1 {
      buf.write_string(" R\{r}C\{c} |")
    }
    buf.write_string("\n")
  }
  buf.to_string()
}

///|
let table_large : String = generate_large_table(20, 5)

///|
test "table: simple 2x1" (b : @bench.T) {
  b.bench(fn() {
    let result = parse(table_simple)
    b.keep(result)
  })
}

///|
test "table: medium 4x5" (b : @bench.T) {
  b.bench(fn() {
    let result = parse(table_medium)
    b.keep(result)
  })
}

///|
test "table: large 5x20" (b : @bench.T) {
  b.bench(fn() {
    let result = parse(table_large)
    b.keep(result)
  })
}