#[allow(unused_imports)]
use crate::ported::zle::{
textobjects::*, zle_h::*, zle_hist::*, zle_main::*, zle_misc::*, zle_move::*, zle_params::*,
zle_refresh::*, zle_tricky::*, zle_utils::*, zle_vi::*, zle_word::*,
};
#[allow(unused_imports)]
pub fn deltochar() -> i32 {
let c = match getfullchar(false) {
Some(ch) => ch,
None => return 1,
};
let mut dest = ZLECS.load(std::sync::atomic::Ordering::SeqCst); let mut ok = 0i32; let mut n: i32 = if ZMOD.lock().unwrap().flags & MOD_MULT != 0 {
ZMOD.lock().unwrap().mult
} else {
1
}; let zap = BINDK.lock().unwrap().as_ref().map(|t| t.nam.as_str()) == Some("zap-to-char");
if n > 0 {
while n > 0 && dest != ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
n -= 1;
while dest != ZLELL.load(std::sync::atomic::Ordering::SeqCst)
&& ZLELINE.lock().unwrap().get(dest).copied() != Some(c)
{
dest += 1; }
if dest != ZLELL.load(std::sync::atomic::Ordering::SeqCst) {
if !zap || n > 0 {
dest += 1; }
if n == 0 {
let ct =
(dest as i32) - (ZLECS.load(std::sync::atomic::Ordering::SeqCst) as i32); forekill(ct, 0); ok += 1; }
}
}
} else {
if dest > 0 {
dest -= 1; }
while n < 0 && dest != 0 {
n += 1;
while dest != 0 && ZLELINE.lock().unwrap().get(dest).copied() != Some(c) {
dest -= 1; }
if ZLELINE.lock().unwrap().get(dest).copied() == Some(c) {
if n == 0 {
let zap_adj = if zap { 1 } else { 0 }; let ct = (ZLECS.load(std::sync::atomic::Ordering::SeqCst) as i32)
- (dest as i32)
- zap_adj;
backkill(ct, 0); ok += 1; }
if dest > 0 {
dest -= 1; }
}
}
}
if ok != 0 {
0
} else {
1
} }
pub fn setup_() -> i32 {
0 }
pub fn features_() -> i32 {
0 }
pub fn enables_() -> i32 {
0 }
pub fn boot_() -> i32 {
0 }
pub fn cleanup_() -> i32 {
0 }
pub fn finish_() -> i32 {
0 }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn deltochar_returns_one_when_no_input_available() {
let _g = crate::test_util::global_state_lock();
let _g = zle_test_setup();
assert_eq!(deltochar(), 1);
}
#[test]
fn module_lifecycle_shims_all_return_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(setup_(), 0);
assert_eq!(features_(), 0);
assert_eq!(enables_(), 0);
assert_eq!(boot_(), 0);
assert_eq!(cleanup_(), 0);
assert_eq!(finish_(), 0);
}
#[test]
fn deltochar_setup_returns_zero() {
assert_eq!(setup_(), 0);
}
#[test]
fn deltochar_features_returns_zero() {
assert_eq!(features_(), 0);
}
#[test]
fn deltochar_enables_returns_zero() {
assert_eq!(enables_(), 0);
}
#[test]
fn deltochar_boot_returns_zero() {
assert_eq!(boot_(), 0);
}
#[test]
fn deltochar_cleanup_returns_zero() {
assert_eq!(cleanup_(), 0);
}
#[test]
fn deltochar_finish_returns_zero() {
assert_eq!(finish_(), 0);
}
#[test]
fn deltochar_no_input_is_deterministic() {
let _g = crate::test_util::global_state_lock();
let _g2 = zle_test_setup();
let first = deltochar();
for _ in 0..5 {
assert_eq!(deltochar(), first, "must be deterministic");
}
}
#[test]
fn deltochar_return_value_is_boolean() {
let _g = crate::test_util::global_state_lock();
let _g2 = zle_test_setup();
let r = deltochar();
assert!(r == 0 || r == 1, "must be 0 or 1; got {}", r);
}
#[test]
fn deltochar_setup_idempotent() {
for _ in 0..10 {
assert_eq!(setup_(), 0);
}
}
#[test]
fn deltochar_finish_idempotent() {
for _ in 0..10 {
assert_eq!(finish_(), 0);
}
}
#[test]
fn deltochar_cleanup_idempotent() {
for _ in 0..10 {
assert_eq!(cleanup_(), 0);
}
}
#[test]
fn deltochar_boot_idempotent() {
for _ in 0..10 {
assert_eq!(boot_(), 0);
}
}
#[test]
fn deltochar_features_idempotent() {
for _ in 0..10 {
assert_eq!(features_(), 0);
}
}
#[test]
fn deltochar_enables_idempotent() {
for _ in 0..10 {
assert_eq!(enables_(), 0);
}
}
#[test]
fn deltochar_full_lifecycle_sequence_safe() {
assert_eq!(setup_(), 0);
assert_eq!(features_(), 0);
assert_eq!(enables_(), 0);
assert_eq!(boot_(), 0);
assert_eq!(cleanup_(), 0);
assert_eq!(finish_(), 0);
}
#[test]
fn deltochar_repeated_load_unload_cycles_safe() {
for _ in 0..3 {
assert_eq!(setup_(), 0);
assert_eq!(boot_(), 0);
assert_eq!(cleanup_(), 0);
assert_eq!(finish_(), 0);
}
}
#[test]
fn deltochar_no_input_does_not_mutate_zle_state() {
let _g = crate::test_util::global_state_lock();
let _g2 = zle_test_setup();
let cs_before = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let ll_before = ZLELL.load(std::sync::atomic::Ordering::SeqCst);
let _ = deltochar();
let cs_after = ZLECS.load(std::sync::atomic::Ordering::SeqCst);
let ll_after = ZLELL.load(std::sync::atomic::Ordering::SeqCst);
assert_eq!(cs_before, cs_after, "ZLECS unchanged on early-return");
assert_eq!(ll_before, ll_after, "ZLELL unchanged on early-return");
}
}