program main
  fn u32_zero_text() -> string
    call std.num.u32_to_string
      u32 0
  fn u32_high_text() -> string
    call std.num.u32_to_string
      u32 4294967295
  fn u64_zero_text() -> string
    call std.num.u64_to_string
      u64 0
  fn u64_high_text() -> string
    call std.num.u64_to_string
      u64 18446744073709551615
  fn u64_beyond_u32_text() -> string
    call std.num.u64_to_string
      u64 4294967296
  fn main() -> i32
    call std.io.print_string
      call u32_zero_text
    call std.io.print_string
      call u32_high_text
    call std.io.print_string
      call u64_zero_text
    call std.io.print_string
      call u64_high_text
    call std.io.print_string
      call u64_beyond_u32_text
    if
      binary =
        call std.string.len
          call u64_beyond_u32_text
        int 10
      int 0
      int 1
  test "u32 zero to string"
    binary =
      call u32_zero_text
      string "0"
  test "u32 high to string"
    binary =
      call u32_high_text
      string "4294967295"
  test "u32 high string length"
    binary =
      call std.string.len
        call u32_high_text
      int 10
  test "u64 zero to string"
    binary =
      call u64_zero_text
      string "0"
  test "u64 high to string"
    binary =
      call u64_high_text
      string "18446744073709551615"
  test "u64 beyond u32 to string"
    binary =
      call u64_beyond_u32_text
      string "4294967296"
  test "u64 high string length"
    binary =
      call std.string.len
        call u64_high_text
      int 20
