///|
fn main {
  let config = @src.Config::new(44100, 48000, 2).unwrap()
  let input = Array::make(882, 0.25)
  let converted = @src.resample(config, input[:]).unwrap()
  if converted.length() != 960 {
    abort("wrong batch frame count")
  }
  let encoded = @wav.encode(48000, 2, converted[:]).unwrap()
  let decoded = @wav.decode(encoded.bytes).unwrap()
  if decoded.rate != 48000 ||
    decoded.channels != 2 ||
    decoded.samples.length() != 960 {
    abort("WAV metadata mismatch")
  }
  if @pcm.encode([0.25][:]).unwrap().bytes != b"\x00\x20" {
    abort("PCM quantization mismatch")
  }
  let stream = @src.Resampler::new(config)
  let buffer = FixedArray::make(14, 0.0)
  let mut consumed = 0
  while consumed < input.length() {
    let progress = stream.process(input[consumed:], buffer).unwrap()
    if progress.consumed_frames == 0 && progress.produced_frames == 0 {
      abort("no progress")
    }
    consumed += progress.consumed_frames * 2
  }
  while !stream.is_finished() {
    ignore(stream.finish(buffer).unwrap())
  }
  if stream.stats().output_frames != 480L {
    abort("wrong stream frame count")
  }
  let legacy_tag = match @wav.decode(b"RIFF") {
    Err(error) => legacy_error_tag(error)
    Ok(_) => abort("malformed WAV unexpectedly accepted")
  }
  if legacy_tag != 1 {
    abort("0.1.0 error contract changed")
  }
  println(
    "public_api_consumer frames=480 channels=2 lookahead_in=\{stream.latency().input_frames}",
  )
}

///|
fn legacy_error_tag(error : @wav.WavError) -> Int {
  match error {
    InvalidHeader => 0
    Truncated => 1
    UnsupportedFormat => 2
    InvalidFormat => 3
    InvalidChannels => 4
    InvalidRate => 5
    MissingFormat => 6
    MissingData => 7
    DuplicateChunk => 8
    FrameAlignment => 9
    NonFinite(_) => 10
    ResourceLimit => 11
  }
}