///|
fn main raise {
  let s = @sdmx.Structure::new(@sdmx.StructureRef::new("DEMO", "SCALE", "1"), [
    @sdmx.Component::new("ENTITY", @sdmx.Dimension, @sdmx.Text),
    @sdmx.Component::new("TIME_PERIOD", @sdmx.TimeDimension, @sdmx.Period),
    @sdmx.Component::new("OBS_VALUE", @sdmx.Measure, @sdmx.Decimal),
    @sdmx.Component::new("UNIT", @sdmx.Attribute([]), @sdmx.Text, required=true),
  ])
  let before = @env.now()
  let rows = Array::makei(10000, i => {
    @sdmx.Observation::new(
      s,
      ["entity-\{i}", "2026-01"],
      [if i % 7 == 0 { None } else { Some(i.to_string()) }],
      [Some("count")],
    )
  })
  let data = @sdmx.Dataset::new(s, rows)
  let message = @sdmx.DataMessage::new(@sdmx.Datastructure, s.reference(), data)
  let encoded = message.encode_json2(
    id="scale",
    sender="DEMO",
    prepared="2026-10-23T00:00:00Z",
  )
  let restored = @sdmx.decode_json2(encoded, expected=Some(s)).dataset()
  assert_eq(restored.fingerprint(), data.fingerprint())
  let snapshot = @sdmx.PageSnapshot::new(restored)
  let mut cursor : @sdmx.PageCursor? = None
  let mut count = 0
  let mut pages = 0
  while true {
    let page = snapshot.page(page_size=127, after=cursor)
    count += page.observations().length()
    pages += 1
    cursor = page.next_cursor()
    if cursor is None {
      break
    }
  }
  assert_eq(count, 10000)
  assert_eq(pages, 79)
  assert_eq(data.coverage().measures()[0].omitted, 1429)
  println(
    "scale: n=10000 json_utf16=\{encoded.length()} pages=\{pages} omitted=1429 elapsed_ms=\{@env.now() - before}; content fingerprints equal",
  )
}