///|
fn main raise {
  let original = @lens.EventLog::new([
    @lens.LogEvent::new(
      "a",
      "ticket1",
      "create",
      1700000000000L,
      1700000001000L,
      resource=Some("alice"),
    ),
    @lens.LogEvent::new(
      "b",
      "ticket1",
      "approve",
      1700000010000L,
      1700000011000L,
      resource=Some("bob"),
    ),
    @lens.LogEvent::new(
      "c",
      "ticket2",
      "create",
      1700000020000L,
      1700000021000L,
      resource=Some("alice"),
    ),
    @lens.LogEvent::new(
      "d",
      "ticket2",
      "approve",
      1700000080000L,
      1700000081000L,
      resource=Some("alice"),
    ),
  ])
  let log = @lens.parse_xes(original.to_xes())
  assert_eq(@lens.log_to_json(original), @lens.log_to_json(log))
  let policies : Array[@lens.ProcessPolicy] = [
    Response(
      id="approval-sla",
      trigger="create",
      target="approve",
      within_ms=Some(30000L),
    ),
    SeparationOfDuties(id="four-eyes", first="create", second="approve"),
  ]
  let report = log.check_policies(policies)
  assert_true(report[0].status == Satisfied && report[1].status == Satisfied)
  assert_true(report[2].status == Violated && report[3].status == Violated)
  let slow = log.select_cases({
    ..@lens.CaseSelection::all(),
    minimum_cycle: Some(30000L),
  })
  assert_eq(slow.case_count(), 1)
  let network = log.resource_handoffs()
  assert_eq(network.length(), 1)
  assert_eq(network[0].source, "alice")
  println(
    "XES + business audit: delayed self-approval found; slow-case cohort and resource handoff verified",
  )
  println(@lens.policy_results_to_json(report).stringify())
}