use crate::ported::init::source;
use crate::ported::params::getsparam;
use crate::ported::zsh_h::{module, EMULATE_ZSH, EMULATION};
use std::path::PathBuf;
#[allow(unused_variables)]
pub fn setup_(m: *const module) -> i32 {
0 }
#[allow(unused_variables)]
pub fn features_(m: *const module, features: &mut Vec<String>) -> i32 {
1 }
#[allow(unused_variables)]
pub fn enables_(m: *const module, enables: &mut Option<Vec<i32>>) -> i32 {
0 }
pub fn check_dotfile(dotdir: &str, fname: &str) -> i32 {
let mut p = PathBuf::from(dotdir); p.push(fname); if p.exists() {
0
} else {
-1
} }
#[allow(unused_variables)]
pub fn boot_(m: *const module) -> i32 {
let mut dotdir: String = getsparam("ZDOTDIR").unwrap_or_default();
let spaths: Vec<String> = std::env::var("ZSH_SITESCRIPT_DIR")
.ok()
.into_iter()
.chain(std::env::var("ZSH_SCRIPT_DIR").ok())
.chain(std::iter::once("/etc/zsh".to_string()))
.collect();
if !EMULATION(EMULATE_ZSH) {
return 0; } else {
}
if dotdir.is_empty() {
dotdir = getsparam("HOME") .unwrap_or_default();
if dotdir.is_empty() {
return 0; }
}
if check_dotfile(&dotdir, ".zshenv") == 0 || check_dotfile(&dotdir, ".zprofile") == 0 || check_dotfile(&dotdir, ".zshrc") == 0 || check_dotfile(&dotdir, ".zlogin") == 0
{
return 0; }
for sp in &spaths {
let buf = format!("{}/newuser", sp); if source(&buf) != SOURCE_NOT_FOUND {
break; }
}
0 }
#[allow(unused_variables)]
pub fn cleanup_(m: *const module) -> i32 {
0 }
#[allow(unused_variables)]
pub fn finish_(m: *const module) -> i32 {
0 }
const SOURCE_NOT_FOUND: i32 = 1;
#[cfg(test)]
mod tests {
use super::*;
use std::fs;
#[test]
fn check_dotfile_returns_zero_when_file_exists() {
let _g = crate::test_util::global_state_lock();
let tmp = std::env::temp_dir();
let p = tmp.join("zshrs_test_dotfile_exists");
fs::write(&p, "").expect("write tmp");
assert_eq!(
check_dotfile(tmp.to_str().unwrap(), "zshrs_test_dotfile_exists"),
0
);
let _ = fs::remove_file(&p);
}
#[test]
fn check_dotfile_returns_minus_one_when_missing() {
let _g = crate::test_util::global_state_lock();
let tmp = std::env::temp_dir();
assert_eq!(
check_dotfile(tmp.to_str().unwrap(), "zshrs_test_definitely_nothere_xyz"),
-1
);
}
#[test]
fn module_entry_points_return_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(setup_(std::ptr::null()), 0);
assert_eq!(cleanup_(std::ptr::null()), 0);
assert_eq!(finish_(std::ptr::null()), 0);
}
#[test]
fn newuser_corpus_check_dotfile_existing_returns_zero() {
let _g = crate::test_util::global_state_lock();
let dir = tempfile::tempdir().unwrap();
let p = dir.path().join(".zshrc");
std::fs::File::create(&p).unwrap();
assert_eq!(
check_dotfile(dir.path().to_str().unwrap(), ".zshrc"),
0,
"existing file = 0 per c:62"
);
}
#[test]
fn newuser_corpus_check_dotfile_missing_in_existing_dir() {
let _g = crate::test_util::global_state_lock();
let dir = tempfile::tempdir().unwrap();
assert_eq!(
check_dotfile(dir.path().to_str().unwrap(), "zshrs_no_such_file_xyz"),
-1,
"missing file = -1",
);
}
#[test]
fn newuser_corpus_check_dotfile_missing_dir_returns_neg_one() {
let _g = crate::test_util::global_state_lock();
assert_eq!(check_dotfile("/never/exists/zshrs_xyz", ".zshrc"), -1,);
}
#[test]
fn newuser_corpus_boot_returns_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(boot_(std::ptr::null()), 0);
}
#[test]
fn newuser_corpus_features_returns_one_no_features() {
let _g = crate::test_util::global_state_lock();
let mut features = Vec::new();
assert_eq!(
features_(std::ptr::null(), &mut features),
1,
"newuser has no advertised features"
);
}
#[test]
fn check_dotfile_real_dir_empty_fname_returns_zero() {
let _g = crate::test_util::global_state_lock();
let r = check_dotfile("/tmp", "");
assert_eq!(r, 0, "/tmp exists → check_dotfile returns 0");
}
#[test]
fn check_dotfile_existing_in_tmp_returns_zero() {
let _g = crate::test_util::global_state_lock();
let dir = tempfile::tempdir().unwrap();
std::fs::write(dir.path().join(".zshrc_test"), "").unwrap();
let r = check_dotfile(dir.path().to_str().unwrap(), ".zshrc_test");
assert_eq!(r, 0, "existing file → 0");
}
#[test]
fn check_dotfile_missing_in_real_dir_returns_neg_one() {
let _g = crate::test_util::global_state_lock();
let r = check_dotfile("/tmp", ".zshrs_never_real_xyz_zzz");
assert_eq!(r, -1, "missing file → -1");
}
#[test]
fn check_dotfile_empty_dotdir_missing_returns_neg_one() {
let _g = crate::test_util::global_state_lock();
let r = check_dotfile("", "zshrs_never_exists_xyz");
assert_eq!(r, -1);
}
#[test]
fn newuser_setup_returns_zero_pin() {
let _g = crate::test_util::global_state_lock();
assert_eq!(setup_(std::ptr::null()), 0);
}
#[test]
fn newuser_enables_no_panic() {
let _g = crate::test_util::global_state_lock();
let mut e: Option<Vec<i32>> = None;
let _ = enables_(std::ptr::null(), &mut e);
}
#[test]
fn newuser_cleanup_returns_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(cleanup_(std::ptr::null()), 0);
}
#[test]
fn newuser_finish_returns_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(finish_(std::ptr::null()), 0);
}
#[test]
fn check_dotfile_returns_zero_or_minus_one_only() {
let _g = crate::test_util::global_state_lock();
for (dir, fname) in [
("/tmp", "xyz_nonexistent_zshrs_test"),
("/nonexistent_dir_xyz_zshrs", "anything"),
("/", "etc"),
("", ""),
] {
let r = check_dotfile(dir, fname);
assert!(
r == 0 || r == -1,
"result must be 0 or -1, got {} for ({:?}, {:?})",
r,
dir,
fname
);
}
}
#[test]
fn check_dotfile_is_deterministic() {
let _g = crate::test_util::global_state_lock();
for _ in 0..5 {
assert_eq!(check_dotfile("/tmp", "xyz_nonexistent"), -1);
}
}
#[test]
fn check_dotfile_relative_path_no_panic() {
let _g = crate::test_util::global_state_lock();
let _ = check_dotfile("relative", ".zshrc");
let _ = check_dotfile(".", ".gitignore"); let _ = check_dotfile("..", "anything");
}
#[test]
fn check_dotfile_multibyte_path_no_panic() {
let _g = crate::test_util::global_state_lock();
let _ = check_dotfile("/tmp/日本", ".zshrc");
let _ = check_dotfile("/tmp", "包含中文");
}
#[test]
fn newuser_boot_null_returns_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(boot_(std::ptr::null()), 0, "boot_ MUST return 0");
}
#[test]
fn newuser_boot_idempotent() {
let _g = crate::test_util::global_state_lock();
for _ in 0..5 {
assert_eq!(boot_(std::ptr::null()), 0);
}
}
#[test]
fn newuser_full_lifecycle_returns_zero_for_all() {
let _g = crate::test_util::global_state_lock();
let null = std::ptr::null();
assert_eq!(setup_(null), 0);
let mut feats = Vec::new();
let _ = features_(null, &mut feats);
let mut enables: Option<Vec<i32>> = None;
let _ = enables_(null, &mut enables);
assert_eq!(boot_(null), 0);
assert_eq!(cleanup_(null), 0);
assert_eq!(finish_(null), 0);
}
#[test]
fn check_dotfile_empty_fname_with_tmp_returns_zero() {
let _g = crate::test_util::global_state_lock();
assert_eq!(check_dotfile("/tmp", ""), 0);
}
#[test]
fn check_dotfile_special_chars_in_path_no_panic() {
let _g = crate::test_util::global_state_lock();
let _ = check_dotfile("/tmp", ".hidden");
let _ = check_dotfile("/tmp", "file with spaces");
let _ = check_dotfile("/tmp/sub/dir/that/does/not/exist", "file");
}
#[test]
fn newuser_setup_returns_i32_type() {
let _g = crate::test_util::global_state_lock();
let _: i32 = setup_(std::ptr::null());
}
#[test]
fn newuser_features_returns_one_for_no_feature_table() {
let _g = crate::test_util::global_state_lock();
let mut v: Vec<String> = Vec::new();
let r = features_(std::ptr::null(), &mut v);
assert_eq!(
r, 1,
"c:44 — features_ MUST return 1 (no feature table), not 0"
);
}
#[test]
fn newuser_features_does_not_populate_vec() {
let _g = crate::test_util::global_state_lock();
let mut v: Vec<String> = vec!["pre-existing".to_string()];
let _ = features_(std::ptr::null(), &mut v);
assert_eq!(v.len(), 1, "features_ must not add entries");
assert_eq!(v[0], "pre-existing", "must not clear caller's Vec");
}
#[test]
fn newuser_enables_returns_zero_distinct_from_features() {
let _g = crate::test_util::global_state_lock();
let mut e: Option<Vec<i32>> = None;
let r = enables_(std::ptr::null(), &mut e);
assert_eq!(r, 0, "c:51 — enables_ MUST return 0");
}
#[test]
fn check_dotfile_returns_i32_type() {
let _g = crate::test_util::global_state_lock();
let _: i32 = check_dotfile("/tmp", "anything");
}
#[test]
fn check_dotfile_missing_returns_minus_one() {
let _g = crate::test_util::global_state_lock();
let r = check_dotfile("/tmp", "__definitely_does_not_exist_xyz_42");
assert_eq!(r, -1, "missing file MUST return -1, got {}", r);
}
#[test]
fn check_dotfile_existing_returns_zero() {
let _g = crate::test_util::global_state_lock();
let r = check_dotfile("/", "tmp");
assert_eq!(r, 0, "/ + tmp must exist on Unix; got {}", r);
}
#[test]
fn newuser_boot_returns_i32_type() {
let _g = crate::test_util::global_state_lock();
let _: i32 = boot_(std::ptr::null());
}
#[test]
fn check_dotfile_all_four_dotfile_names_against_missing_dir() {
let _g = crate::test_util::global_state_lock();
for fname in &[".zshenv", ".zprofile", ".zshrc", ".zlogin"] {
let r = check_dotfile("/__no_such_dir_xyz_zshrs__", fname);
assert_eq!(r, -1, "missing dir + {} must return -1, got {}", fname, r);
}
}
#[test]
fn newuser_enables_deterministic() {
let _g = crate::test_util::global_state_lock();
for _ in 0..10 {
let mut e: Option<Vec<i32>> = None;
assert_eq!(enables_(std::ptr::null(), &mut e), 0);
}
}
#[test]
fn newuser_features_deterministic() {
let _g = crate::test_util::global_state_lock();
for _ in 0..10 {
let mut v: Vec<String> = Vec::new();
assert_eq!(features_(std::ptr::null(), &mut v), 1);
}
}
#[test]
fn newuser_setup_idempotent() {
let _g = crate::test_util::global_state_lock();
for _ in 0..10 {
assert_eq!(setup_(std::ptr::null()), 0);
}
}
#[test]
fn newuser_cleanup_idempotent_returns_zero() {
let _g = crate::test_util::global_state_lock();
for _ in 0..10 {
assert_eq!(cleanup_(std::ptr::null()), 0);
}
}
#[test]
fn newuser_finish_idempotent_returns_zero() {
let _g = crate::test_util::global_state_lock();
for _ in 0..10 {
assert_eq!(finish_(std::ptr::null()), 0);
}
}
#[test]
fn newuser_cleanup_returns_i32_type() {
let _g = crate::test_util::global_state_lock();
let _: i32 = cleanup_(std::ptr::null());
}
#[test]
fn newuser_finish_returns_i32_type() {
let _g = crate::test_util::global_state_lock();
let _: i32 = finish_(std::ptr::null());
}
#[test]
fn newuser_enables_returns_i32_type() {
let _g = crate::test_util::global_state_lock();
let mut e: Option<Vec<i32>> = None;
let _: i32 = enables_(std::ptr::null(), &mut e);
}
#[test]
fn check_dotfile_both_empty_no_panic() {
let _g = crate::test_util::global_state_lock();
let _ = check_dotfile("", "");
}
#[test]
fn check_dotfile_deterministic_for_same_input() {
let _g = crate::test_util::global_state_lock();
let r1 = check_dotfile("/tmp", ".zshrc");
let r2 = check_dotfile("/tmp", ".zshrc");
assert_eq!(r1, r2, "check_dotfile must be pure");
}
#[test]
fn check_dotfile_return_in_canonical_range() {
let _g = crate::test_util::global_state_lock();
for fname in [".zshrc", ".zshenv", ".zprofile", ".zlogin"] {
let r = check_dotfile("/tmp/__never_exists_xyz__", fname);
assert!(r >= -1, "check_dotfile must return ≥ -1; got {}", r);
}
}
#[test]
fn check_dotfile_long_path_no_panic() {
let _g = crate::test_util::global_state_lock();
let long = "x".repeat(500);
let _ = check_dotfile(&long, ".zshrc");
}
#[test]
fn newuser_boot_idempotent_alt() {
let _g = crate::test_util::global_state_lock();
for _ in 0..10 {
let _ = boot_(std::ptr::null());
}
}
#[test]
fn check_dotfile_various_dotdirs_no_panic() {
let _g = crate::test_util::global_state_lock();
for dir in ["/tmp", "/", "/var", "/usr"] {
let _ = check_dotfile(dir, ".zshrc");
}
}
}