///|
const FEATURE_COUNT : Int = 1000

///|
const ITERATIONS : Int = 100

///|
const MIN_FEATURES_PER_SECOND : UInt64 = 10000UL

///|
const MAX_FIXTURE_BYTES : Int = 25000

///|
fn main {
  run() catch {
    error => abort("MoonMVT benchmark failed: \{error}")
  }
}

///|
fn build_fixture() -> @model.Tile raise {
  let layer = @builder.LayerBuilder::new("benchmark")
  for i in 0.. UInt64 {
  let safe_ms = if elapsed_ms == 0UL { 1UL } else { elapsed_ms }
  FEATURE_COUNT.to_uint64() * ITERATIONS.to_uint64() * 1000UL / safe_ms
}

///|
fn run() -> Unit raise {
  let tile = build_fixture()
  let warmup = @codec.encode_tile(tile)
  ignore(@codec.decode_tile(warmup))

  let encode_start = @env.now()
  let mut bytes = warmup
  for _ in 0.. MAX_FIXTURE_BYTES {
    abort("encoded fixture exceeded 25000-byte acceptance ceiling")
  }
  if encode_rate < MIN_FEATURES_PER_SECOND {
    abort("encode throughput fell below 10000 features/second")
  }
  if decode_rate < MIN_FEATURES_PER_SECOND {
    abort("decode throughput fell below 10000 features/second")
  }
  println("fixture_features=\{FEATURE_COUNT}")
  println("fixture_bytes=\{bytes.length()}")
  println("iterations=\{ITERATIONS}")
  println("encode_elapsed_ms=\{encode_ms}")
  println("decode_elapsed_ms=\{decode_ms}")
  println("encode_features_per_second=\{encode_rate}")
  println("decode_features_per_second=\{decode_rate}")
  println("acceptance_threshold=10000_features_per_second_and_25000_bytes")
  println("result=pass")
}