///|
test "decimal accepts zero" {
  assert_i64_eq(parse_decimal_int64("0").unwrap(), 0L)
}

///|
test "decimal accepts leading zeros" {
  assert_i64_eq(parse_decimal_int64("00042").unwrap(), 42L)
}

///|
test "decimal accepts Int64 maximum" {
  assert_i64_eq(
    parse_decimal_int64("9223372036854775807").unwrap(),
    @int64.MAX_VALUE,
  )
}

///|
test "decimal rejects Int64 maximum plus one" {
  assert_true(
    parse_decimal_int64("9223372036854775808")
    is Err(RangeError(_, IntegerOverflow, _, _)),
  )
}

///|
test "decimal rejects very large integer before accumulation" {
  assert_true(
    parse_decimal_int64("999999999999999999999999999999")
    is Err(RangeError(_, LimitExceeded, _, _)),
  )
}

///|
test "decimal rejects empty input" {
  assert_true(
    parse_decimal_int64("") is Err(RangeError(_, MissingNumber, _, _)),
  )
}

///|
test "decimal rejects signs" {
  assert_true(
    parse_decimal_int64("+1") is Err(RangeError(_, InvalidNumber, _, _)),
  )
}

///|
test "decimal rejects non digits" {
  assert_true(
    parse_decimal_int64("12x") is Err(RangeError(_, InvalidNumber, _, _)),
  )
}

///|
test "decimal reports zero based code unit offset" {
  assert_int_eq(parse_decimal_int64("1x").unwrap_err().offset(), 1)
}