///|
fn main raise {
  let codec = try! @lib.Codec::new(3, 2)
  let data = [b"page0000", b"metadata", b"journal0"]
  let parity = try! codec.encode(data)
  // Only two old and two replacement data bytes are provided, not a full page.
  let next = try! codec.update_parity_ranges(parity, [
    { index: 0, offset: 4, old_data: b"00", new_data: b"XY", },
  ])
  let changed = [b"pageXY00", data[1], data[2]]
  assert_eq(next, try! codec.encode(changed))
  assert_eq(parity, try! codec.encode(data))
  let available : Array[Bytes?] = [
    None,
    Some(changed[1]),
    Some(changed[2]),
    Some(next[0]),
    None,
  ]
  assert_eq(try! codec.reconstruct_selected(available, [0]), [changed[0]])
  assert_true(
    try {
      ignore(
        codec.update_parity_ranges(parity, [
          { index: 0, offset: 4, old_data: b"00", new_data: b"XY", },
          { index: 0, offset: 5, old_data: b"0", new_data: b"Z", },
        ]),
      )
      false
    } catch {
      _ => true
    },
  )
  println(
    "Range update: local byte patch matches full encoding; two-erasure recovery and overlap rejection passed",
  )
}