///|
fn main {
  let source =
    #|{"schema_version":1,"timetable":{"name":"commute","stops":[{"id":"A"},{"id":"B","min_change":2},{"id":"D"}],"trips":[{"id":"first","calls":[{"stop":"A","arrival":10,"departure":10},{"stop":"B","arrival":20,"departure":20}]},{"id":"second","calls":[{"stop":"B","arrival":22,"departure":22},{"stop":"D","arrival":30,"departure":30}]},{"id":"direct","calls":[{"stop":"A","arrival":12,"departure":12},{"stop":"D","arrival":40,"departure":40}]}]},"query":{"from":"A","to":"D","departure":0,"max_walk":0}}
  let (t, q) = @p.decode_request(source) catch { _ => abort("invalid example") }
  let report = @p.plan(t, q) catch { _ => abort("search failed") }
  if report.journeys.length() != 2 {
    abort("wrong frontier cardinality")
  }
  for j in report.journeys {
    if !(@p.verify_journey(t, q, j) catch { _ => false }) {
      abort("invalid itinerary")
    }
    println(
      "arrival=\{j.arrival}, boardings=\{j.boardings}, walked=\{j.walked}",
    )
  }
  let delayed = @p.scenario(t, [{ id: "first", delay: 1, cancelled: false, }]) catch {
    _ => abort("invalid scenario")
  }
  let after = @p.plan(delayed, q) catch { _ => abort("scenario failed") }
  if after.journeys[0].arrival != 40 {
    abort("delay did not invalidate transfer")
  }
  println("after delay: arrival=\{after.journeys[0].arrival}")
}