use ms_codec::bch::bch_verify_regular;
const BECH32_ALPHABET: &[u8; 32] = b"qpzry9x8gf2tvdw0s3jn54khce6mua7l";
fn data_part_to_u5(s: &str) -> Vec<u8> {
let sep = s.rfind('1').expect("missing '1' separator");
let mut inv = [0xFFu8; 128];
for (i, &c) in BECH32_ALPHABET.iter().enumerate() {
inv[c as usize] = i as u8;
}
s[sep + 1..]
.chars()
.map(|c| {
let b = c as usize;
assert!(b < 128, "non-ASCII char in data part: {c:?}");
let v = inv[b];
assert!(v != 0xFF, "char {c:?} not in bech32 alphabet");
v
})
.collect()
}
#[test]
fn bch_verify_regular_holds_for_known_valid_ms1() {
const VALID_MS1: &str = "ms10entrsqqqqqqqqqqqqqqqqqqqqqqqqqqqqcj9sxraq34v7f";
let data_with_checksum = data_part_to_u5(VALID_MS1);
assert!(
bch_verify_regular("ms", &data_with_checksum),
"bch_verify_regular rejected canonical 12-word abandon ms1 vector — \
either MS_REGULAR_CONST drifted or a polymod primitive regressed"
);
}
#[test]
fn bch_verify_regular_rejects_corrupted_ms1() {
const CORRUPTED_MS1: &str = "ms10entrspqqqqqqqqqqqqqqqqqqqqqqqqqqqcj9sxraq34v7f";
let data_with_checksum = data_part_to_u5(CORRUPTED_MS1);
assert!(
!bch_verify_regular("ms", &data_with_checksum),
"bch_verify_regular accepted a corrupted ms1 vector — verify routine \
is silently passing all inputs (false-positive regression)"
);
}