pub const BIN_TYPESET: i32 = 0; pub const BIN_BG: i32 = 1; pub const BIN_FG: i32 = 2; pub const BIN_JOBS: i32 = 3; pub const BIN_WAIT: i32 = 4; pub const BIN_DISOWN: i32 = 5; pub const BIN_BREAK: i32 = 6; pub const BIN_CONTINUE: i32 = 7; pub const BIN_EXIT: i32 = 8; pub const BIN_RETURN: i32 = 9; pub const BIN_CD: i32 = 10; pub const BIN_POPD: i32 = 11; pub const BIN_PUSHD: i32 = 12; pub const BIN_PRINT: i32 = 13; pub const BIN_EVAL: i32 = 14; pub const BIN_SCHED: i32 = 15; pub const BIN_FC: i32 = 16; pub const BIN_R: i32 = 17; pub const BIN_PUSHLINE: i32 = 18; pub const BIN_LOGOUT: i32 = 19; pub const BIN_TEST: i32 = 20; pub const BIN_BRACKET: i32 = 21; pub const BIN_READONLY: i32 = 22; pub const BIN_ECHO: i32 = 23; pub const BIN_DISABLE: i32 = 24; pub const BIN_ENABLE: i32 = 25; pub const BIN_PRINTF: i32 = 26; pub const BIN_COMMAND: i32 = 27; pub const BIN_UNHASH: i32 = 28; pub const BIN_UNALIAS: i32 = 29; pub const BIN_UNFUNCTION: i32 = 30; pub const BIN_UNSET: i32 = 31; pub const BIN_EXPORT: i32 = 32;
pub const BIN_SETOPT: i32 = 0; pub const BIN_UNSETOPT: i32 = 1;
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn overloaded_bin_ids_are_pairwise_distinct() {
let ids = [
BIN_TYPESET, BIN_BG, BIN_FG, BIN_JOBS, BIN_WAIT, BIN_DISOWN,
BIN_BREAK, BIN_CONTINUE, BIN_EXIT, BIN_RETURN,
BIN_CD, BIN_POPD, BIN_PUSHD, BIN_PRINT, BIN_EVAL, BIN_SCHED,
BIN_FC, BIN_R, BIN_PUSHLINE, BIN_LOGOUT, BIN_TEST, BIN_BRACKET,
BIN_READONLY, BIN_ECHO, BIN_DISABLE, BIN_ENABLE, BIN_PRINTF,
BIN_COMMAND, BIN_UNHASH, BIN_UNALIAS, BIN_UNFUNCTION, BIN_UNSET,
BIN_EXPORT,
];
let mut sorted = ids.to_vec();
sorted.sort();
sorted.dedup();
assert_eq!(sorted.len(), ids.len());
}
#[test]
fn bin_constants_match_c_source_position_for_position() {
let table = [
("BIN_TYPESET", BIN_TYPESET, 0), ("BIN_BG", BIN_BG, 1), ("BIN_FG", BIN_FG, 2), ("BIN_JOBS", BIN_JOBS, 3), ("BIN_WAIT", BIN_WAIT, 4), ("BIN_DISOWN", BIN_DISOWN, 5), ("BIN_BREAK", BIN_BREAK, 6), ("BIN_CONTINUE", BIN_CONTINUE, 7), ("BIN_EXIT", BIN_EXIT, 8), ("BIN_RETURN", BIN_RETURN, 9), ("BIN_CD", BIN_CD, 10), ("BIN_POPD", BIN_POPD, 11), ("BIN_PUSHD", BIN_PUSHD, 12), ("BIN_PRINT", BIN_PRINT, 13), ("BIN_EVAL", BIN_EVAL, 14), ("BIN_SCHED", BIN_SCHED, 15), ("BIN_FC", BIN_FC, 16), ("BIN_R", BIN_R, 17), ("BIN_PUSHLINE", BIN_PUSHLINE, 18), ("BIN_LOGOUT", BIN_LOGOUT, 19), ("BIN_TEST", BIN_TEST, 20), ("BIN_BRACKET", BIN_BRACKET, 21), ("BIN_READONLY", BIN_READONLY, 22), ("BIN_ECHO", BIN_ECHO, 23), ("BIN_DISABLE", BIN_DISABLE, 24), ("BIN_ENABLE", BIN_ENABLE, 25), ("BIN_PRINTF", BIN_PRINTF, 26), ("BIN_COMMAND", BIN_COMMAND, 27), ("BIN_UNHASH", BIN_UNHASH, 28), ("BIN_UNALIAS", BIN_UNALIAS, 29), ("BIN_UNFUNCTION", BIN_UNFUNCTION, 30), ("BIN_UNSET", BIN_UNSET, 31), ("BIN_EXPORT", BIN_EXPORT, 32), ];
for (name, got, want) in table {
assert_eq!(got, want,
"c:34-66 — {} must be {} (C source value)", name, want);
}
}
#[test]
fn setopt_unsetopt_pin_to_zero_and_one() {
assert_eq!(BIN_SETOPT, 0,
"c:69 — BIN_SETOPT must be 0 (load-bearing per c:68 comment)");
assert_eq!(BIN_UNSETOPT, 1,
"c:70 — BIN_UNSETOPT must be 1 (load-bearing per c:68 comment)");
assert_eq!(BIN_SETOPT, BIN_TYPESET,
"c:68 — intentional overlap: setopt/unsetopt vs typeset/bg use disjoint dispatch");
assert_eq!(BIN_UNSETOPT, BIN_BG);
}
}