Ran the codebase through rustfmt

This commit is contained in:
2026-02-23 23:32:46 -05:00
parent fa49e2ef70
commit cf46303659
27 changed files with 254 additions and 240 deletions

View File

@@ -3,7 +3,7 @@ use crate::{
libsh::error::{ShErr, ShErrKind, ShResult}, libsh::error::{ShErr, ShErrKind, ShResult},
parse::{NdRule, Node}, parse::{NdRule, Node},
prelude::*, prelude::*,
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
state::{self, read_logic, write_logic}, state::{self, read_logic, write_logic},
}; };

View File

@@ -3,12 +3,12 @@ use std::sync::LazyLock;
use crate::{ use crate::{
builtin::setup_builtin, builtin::setup_builtin,
expand::expand_prompt, expand::expand_prompt,
getopt::{Opt, OptSpec, get_opts_from_tokens}, getopt::{get_opts_from_tokens, Opt, OptSpec},
jobs::JobBldr, jobs::JobBldr,
libsh::error::{ShErr, ShErrKind, ShResult, ShResultExt}, libsh::error::{ShErr, ShErrKind, ShResult, ShResultExt},
parse::{NdRule, Node}, parse::{NdRule, Node},
prelude::*, prelude::*,
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
state, state,
}; };

View File

@@ -4,7 +4,7 @@ use crate::{
builtin::setup_builtin, builtin::setup_builtin,
jobs::JobBldr, jobs::JobBldr,
libsh::error::ShResult, libsh::error::ShResult,
parse::{NdRule, Node, execute::exec_input}, parse::{execute::exec_input, NdRule, Node},
procio::IoStack, procio::IoStack,
state, state,
}; };
@@ -25,7 +25,8 @@ pub fn eval(node: Node, io_stack: &mut IoStack, job: &mut JobBldr) -> ShResult<(
return Ok(()); return Ok(());
} }
let joined_argv = expanded_argv.into_iter() let joined_argv = expanded_argv
.into_iter()
.map(|(s, _)| s) .map(|(s, _)| s)
.collect::<Vec<_>>() .collect::<Vec<_>>()
.join(" "); .join(" ");

View File

@@ -4,7 +4,7 @@ use crate::{
builtin::setup_builtin, builtin::setup_builtin,
jobs::JobBldr, jobs::JobBldr,
libsh::error::{ShErr, ShErrKind, ShResult}, libsh::error::{ShErr, ShErrKind, ShResult},
parse::{NdRule, Node, execute::ExecArgs}, parse::{execute::ExecArgs, NdRule, Node},
procio::IoStack, procio::IoStack,
state, state,
}; };
@@ -40,11 +40,7 @@ pub fn exec_builtin(node: Node, io_stack: &mut IoStack, job: &mut JobBldr) -> Sh
// execvpe only returns on error // execvpe only returns on error
let cmd_str = cmd.to_str().unwrap().to_string(); let cmd_str = cmd.to_str().unwrap().to_string();
match e { match e {
Errno::ENOENT => { Errno::ENOENT => Err(ShErr::full(ShErrKind::CmdNotFound(cmd_str), "", span)),
Err(ShErr::full(ShErrKind::CmdNotFound(cmd_str), "", span)) _ => Err(ShErr::full(ShErrKind::Errno(e), format!("{e}"), span)),
}
_ => {
Err(ShErr::full(ShErrKind::Errno(e), format!("{e}"), span))
}
} }
} }

View File

@@ -3,8 +3,8 @@ use crate::{
libsh::error::ShResult, libsh::error::ShResult,
parse::{NdRule, Node}, parse::{NdRule, Node},
prelude::*, prelude::*,
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
state::{self, VarFlags, read_vars, write_vars}, state::{self, read_vars, write_vars, VarFlags},
}; };
use super::setup_builtin; use super::setup_builtin;
@@ -60,7 +60,8 @@ pub fn local(node: Node, io_stack: &mut IoStack, job: &mut JobBldr) -> ShResult<
if argv.is_empty() { if argv.is_empty() {
// Display the local variables // Display the local variables
let vars_output = read_vars(|v| { let vars_output = read_vars(|v| {
let mut vars = v.flatten_vars() let mut vars = v
.flatten_vars()
.into_iter() .into_iter()
.map(|(k, v)| format!("{}={}", k, v)) .map(|(k, v)| format!("{}={}", k, v))
.collect::<Vec<String>>(); .collect::<Vec<String>>();

View File

@@ -1,6 +1,6 @@
use crate::{ use crate::{
libsh::error::{ShErr, ShErrKind, ShResult}, libsh::error::{ShErr, ShErrKind, ShResult},
parse::{NdRule, Node, execute::prepare_argv}, parse::{execute::prepare_argv, NdRule, Node},
prelude::*, prelude::*,
}; };

View File

@@ -1,9 +1,9 @@
use crate::{ use crate::{
jobs::{JobBldr, JobCmdFlags, JobID}, jobs::{JobBldr, JobCmdFlags, JobID},
libsh::error::{ShErr, ShErrKind, ShResult}, libsh::error::{ShErr, ShErrKind, ShResult},
parse::{NdRule, Node, lex::Span}, parse::{lex::Span, NdRule, Node},
prelude::*, prelude::*,
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
state::{self, read_jobs, write_jobs}, state::{self, read_jobs, write_jobs},
}; };
@@ -196,7 +196,11 @@ pub fn disown(node: Node, io_stack: &mut IoStack, job: &mut JobBldr) -> ShResult
let curr_job_id = if let Some(id) = read_jobs(|j| j.curr_job()) { let curr_job_id = if let Some(id) = read_jobs(|j| j.curr_job()) {
id id
} else { } else {
return Err(ShErr::full(ShErrKind::ExecFail, "disown: No jobs to disown", blame)); return Err(ShErr::full(
ShErrKind::ExecFail,
"disown: No jobs to disown",
blame,
));
}; };
let mut tabid = curr_job_id; let mut tabid = curr_job_id;

View File

@@ -3,7 +3,7 @@ use crate::{
libsh::error::ShResult, libsh::error::ShResult,
parse::{NdRule, Node}, parse::{NdRule, Node},
prelude::*, prelude::*,
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
state, state,
}; };

View File

@@ -7,13 +7,13 @@ use nix::{
use crate::{ use crate::{
builtin::setup_builtin, builtin::setup_builtin,
getopt::{Opt, OptSpec, get_opts_from_tokens}, getopt::{get_opts_from_tokens, Opt, OptSpec},
jobs::JobBldr, jobs::JobBldr,
libsh::error::{ShErr, ShErrKind, ShResult, ShResultExt}, libsh::error::{ShErr, ShErrKind, ShResult, ShResultExt},
parse::{NdRule, Node}, parse::{NdRule, Node},
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
prompt::readline::term::RawModeGuard, prompt::readline::term::RawModeGuard,
state::{self, VarFlags, read_vars, write_vars}, state::{self, read_vars, write_vars, VarFlags},
}; };
pub const READ_OPTS: [OptSpec; 7] = [ pub const READ_OPTS: [OptSpec; 7] = [

View File

@@ -3,7 +3,7 @@ use crate::{
libsh::error::{ShResult, ShResultExt}, libsh::error::{ShResult, ShResultExt},
parse::{NdRule, Node}, parse::{NdRule, Node},
prelude::*, prelude::*,
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
state::write_shopts, state::write_shopts,
}; };

View File

@@ -8,7 +8,7 @@ use regex::Regex;
use crate::{ use crate::{
libsh::error::{ShErr, ShErrKind, ShResult}, libsh::error::{ShErr, ShErrKind, ShResult},
parse::{ConjunctOp, NdRule, Node, TEST_UNARY_OPS, TestCase}, parse::{ConjunctOp, NdRule, Node, TestCase, TEST_UNARY_OPS},
prelude::*, prelude::*,
}; };

View File

@@ -11,7 +11,7 @@ use crate::{
jobs::JobBldr, jobs::JobBldr,
libsh::error::{ShErr, ShErrKind, ShResult}, libsh::error::{ShErr, ShErrKind, ShResult},
parse::{NdRule, Node}, parse::{NdRule, Node},
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
state::{self, read_logic, write_logic}, state::{self, read_logic, write_logic},
}; };

View File

@@ -1,12 +1,12 @@
use std::{os::unix::fs::OpenOptionsExt, sync::LazyLock}; use std::{os::unix::fs::OpenOptionsExt, sync::LazyLock};
use crate::{ use crate::{
getopt::{Opt, OptSet, OptSpec, get_opts_from_tokens}, getopt::{get_opts_from_tokens, Opt, OptSet, OptSpec},
jobs::JobBldr, jobs::JobBldr,
libsh::error::{Note, ShErr, ShErrKind, ShResult, ShResultExt}, libsh::error::{Note, ShErr, ShErrKind, ShResult, ShResultExt},
parse::{NdRule, Node}, parse::{NdRule, Node},
prelude::*, prelude::*,
procio::{IoStack, borrow_fd}, procio::{borrow_fd, IoStack},
}; };
use super::setup_builtin; use super::setup_builtin;

View File

@@ -4,7 +4,7 @@ use crate::{
term::{Style, Styled}, term::{Style, Styled},
}, },
prelude::*, prelude::*,
procio::{IoMode, borrow_fd}, procio::{borrow_fd, IoMode},
signal::{disable_reaping, enable_reaping}, signal::{disable_reaping, enable_reaping},
state::{self, read_jobs, set_status, write_jobs}, state::{self, read_jobs, set_status, write_jobs},
}; };

View File

@@ -34,8 +34,7 @@ use crate::prelude::*;
pub(crate) static mut SAVED_TERMIOS: Option<Option<Termios>> = None; pub(crate) static mut SAVED_TERMIOS: Option<Option<Termios>> = None;
pub static TTY_FILENO: LazyLock<RawFd> = LazyLock::new(|| { pub static TTY_FILENO: LazyLock<RawFd> = LazyLock::new(|| {
open("/dev/tty", OFlag::O_RDWR, Mode::empty()) open("/dev/tty", OFlag::O_RDWR, Mode::empty()).expect("Failed to open /dev/tty")
.expect("Failed to open /dev/tty")
}); });
#[derive(Debug)] #[derive(Debug)]

View File

@@ -19,17 +19,17 @@ pub use std::os::unix::io::{AsRawFd, BorrowedFd, FromRawFd, IntoRawFd, OwnedFd,
pub use bitflags::bitflags; pub use bitflags::bitflags;
pub use nix::{ pub use nix::{
errno::Errno, errno::Errno,
fcntl::{OFlag, open}, fcntl::{open, OFlag},
libc::{self, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO}, libc::{self, STDERR_FILENO, STDIN_FILENO, STDOUT_FILENO},
sys::{ sys::{
signal::{self, SigHandler, SigSet, SigmaskHow, Signal, kill, killpg, pthread_sigmask, signal}, signal::{self, kill, killpg, pthread_sigmask, signal, SigHandler, SigSet, SigmaskHow, Signal},
stat::Mode, stat::Mode,
termios::{self}, termios::{self},
wait::{WaitPidFlag as WtFlag, WaitStatus as WtStat, waitpid}, wait::{waitpid, WaitPidFlag as WtFlag, WaitStatus as WtStat},
}, },
unistd::{ unistd::{
ForkResult, Pid, close, dup, dup2, execvpe, fork, getpgid, getpgrp, isatty, pipe, read, close, dup, dup2, execvpe, fork, getpgid, getpgrp, isatty, pipe, read, setpgid, tcgetpgrp,
setpgid, tcgetpgrp, tcsetpgrp, write, tcsetpgrp, write, ForkResult, Pid,
}, },
}; };

View File

@@ -9,7 +9,7 @@ use crate::{
error::{ShErr, ShErrKind, ShResult}, error::{ShErr, ShErrKind, ShResult},
utils::RedirVecUtils, utils::RedirVecUtils,
}, },
parse::{Redir, RedirType, get_redir_file}, parse::{get_redir_file, Redir, RedirType},
prelude::*, prelude::*,
}; };
@@ -41,7 +41,7 @@ pub enum IoMode {
}, },
Close { Close {
tgt_fd: RawFd, tgt_fd: RawFd,
} },
} }
impl IoMode { impl IoMode {

View File

@@ -9,8 +9,11 @@ use std::{
time::{Duration, SystemTime, UNIX_EPOCH}, time::{Duration, SystemTime, UNIX_EPOCH},
}; };
use crate::{libsh::error::{ShErr, ShErrKind, ShResult}, prompt::readline::linebuf::LineBuf};
use crate::prelude::*; use crate::prelude::*;
use crate::{
libsh::error::{ShErr, ShErrKind, ShResult},
prompt::readline::linebuf::LineBuf,
};
use super::vicmd::Direction; // surprisingly useful use super::vicmd::Direction; // surprisingly useful

View File

@@ -18,7 +18,13 @@ use unicode_width::{UnicodeWidthChar, UnicodeWidthStr};
use vte::{Parser, Perform}; use vte::{Parser, Perform};
use crate::{ use crate::{
libsh::{error::{ShErr, ShErrKind, ShResult}, sys::TTY_FILENO}, prompt::readline::keys::{KeyCode, ModKeys}, shopt::FernBellStyle, state::read_shopts libsh::{
error::{ShErr, ShErrKind, ShResult},
sys::TTY_FILENO,
},
prompt::readline::keys::{KeyCode, ModKeys},
shopt::FernBellStyle,
state::read_shopts,
}; };
use crate::{ use crate::{
prelude::*, prelude::*,
@@ -107,7 +113,8 @@ fn write_all(fd: RawFd, buf: &str) -> nix::Result<()> {
Ok(()) Ok(())
} }
/// Check if a string ends with a newline, ignoring any trailing ANSI escape sequences. /// Check if a string ends with a newline, ignoring any trailing ANSI escape
/// sequences.
fn ends_with_newline(s: &str) -> bool { fn ends_with_newline(s: &str) -> bool {
let bytes = s.as_bytes(); let bytes = s.as_bytes();
let mut i = bytes.len(); let mut i = bytes.len();
@@ -757,12 +764,7 @@ impl Layout {
end: Pos::default(), end: Pos::default(),
} }
} }
pub fn from_parts( pub fn from_parts(term_width: u16, prompt: &str, to_cursor: &str, to_end: &str) -> Self {
term_width: u16,
prompt: &str,
to_cursor: &str,
to_end: &str,
) -> Self {
let prompt_end = Self::calc_pos(term_width, prompt, Pos { col: 0, row: 0 }); let prompt_end = Self::calc_pos(term_width, prompt, Pos { col: 0, row: 0 });
let cursor = Self::calc_pos(term_width, to_cursor, prompt_end); let cursor = Self::calc_pos(term_width, to_cursor, prompt_end);
let end = Self::calc_pos(term_width, to_end, prompt_end); let end = Self::calc_pos(term_width, to_end, prompt_end);
@@ -1004,5 +1006,4 @@ impl LineWriter for TermWriter {
} }
Ok(()) Ok(())
} }
} }

View File

@@ -212,12 +212,10 @@ impl ShOptCore {
} }
"bell_enabled" => { "bell_enabled" => {
let Ok(val) = val.parse::<bool>() else { let Ok(val) = val.parse::<bool>() else {
return Err( return Err(ShErr::simple(
ShErr::simple(
ShErrKind::SyntaxErr, ShErrKind::SyntaxErr,
"shopt: expected 'true' or 'false' for bell_enabled value", "shopt: expected 'true' or 'false' for bell_enabled value",
), ));
);
}; };
self.bell_enabled = val; self.bell_enabled = val;
} }
@@ -371,7 +369,7 @@ pub struct ShOptPrompt {
pub edit_mode: FernEditMode, pub edit_mode: FernEditMode,
pub comp_limit: usize, pub comp_limit: usize,
pub highlight: bool, pub highlight: bool,
pub auto_indent: bool pub auto_indent: bool,
} }
impl ShOptPrompt { impl ShOptPrompt {
@@ -481,7 +479,8 @@ impl ShOptPrompt {
Ok(Some(output)) Ok(Some(output))
} }
"auto_indent" => { "auto_indent" => {
let mut output = String::from("Whether to automatically indent new lines in multiline commands\n"); let mut output =
String::from("Whether to automatically indent new lines in multiline commands\n");
output.push_str(&format!("{}", self.auto_indent)); output.push_str(&format!("{}", self.auto_indent));
Ok(Some(output)) Ok(Some(output))
} }
@@ -530,7 +529,7 @@ impl Default for ShOptPrompt {
edit_mode: FernEditMode::Vi, edit_mode: FernEditMode::Vi,
comp_limit: 100, comp_limit: 100,
highlight: true, highlight: true,
auto_indent: true auto_indent: true,
} }
} }
} }

View File

@@ -6,7 +6,7 @@ use tempfile::TempDir;
use crate::prompt::readline::complete::Completer; use crate::prompt::readline::complete::Completer;
use crate::prompt::readline::markers; use crate::prompt::readline::markers;
use crate::state::{VarFlags, write_logic, write_vars}; use crate::state::{write_logic, write_vars, VarFlags};
use super::*; use super::*;
@@ -192,12 +192,10 @@ fn complete_filename_with_slash() {
// Should complete files in subdir/ // Should complete files in subdir/
if result.is_some() { if result.is_some() {
assert!( assert!(completer
completer
.candidates .candidates
.iter() .iter()
.any(|c| c.contains("nested.txt")) .any(|c| c.contains("nested.txt")));
);
} }
} }
@@ -704,12 +702,10 @@ fn complete_special_characters_in_filename() {
if result.is_some() { if result.is_some() {
// Should handle special chars in filenames // Should handle special chars in filenames
assert!( assert!(completer
completer
.candidates .candidates
.iter() .iter()
.any(|c| c.contains("file-with-dash") || c.contains("file_with_underscore")) .any(|c| c.contains("file-with-dash") || c.contains("file_with_underscore")));
);
} }
} }

View File

@@ -1,6 +1,6 @@
use std::collections::HashSet; use std::collections::HashSet;
use crate::expand::{DUB_QUOTE, VAR_SUB, perform_param_expansion}; use crate::expand::{perform_param_expansion, DUB_QUOTE, VAR_SUB};
use crate::state::VarFlags; use crate::state::VarFlags;
use super::*; use super::*;

View File

@@ -4,9 +4,8 @@ use super::*;
use crate::expand::{expand_aliases, unescape_str}; use crate::expand::{expand_aliases, unescape_str};
use crate::libsh::error::{Note, ShErr, ShErrKind}; use crate::libsh::error::{Note, ShErr, ShErrKind};
use crate::parse::{ use crate::parse::{
NdRule, Node, ParseStream,
lex::{LexFlags, LexStream, Tk, TkRule}, lex::{LexFlags, LexStream, Tk, TkRule},
node_operation, node_operation, NdRule, Node, ParseStream,
}; };
use crate::state::{write_logic, write_vars}; use crate::state::{write_logic, write_vars};

View File

@@ -6,12 +6,12 @@ use crate::{
term::{Style, Styled}, term::{Style, Styled},
}, },
prompt::readline::{ prompt::readline::{
FernVi,
history::History, history::History,
keys::{KeyCode, KeyEvent, ModKeys}, keys::{KeyCode, KeyEvent, ModKeys},
linebuf::LineBuf, linebuf::LineBuf,
term::{KeyReader, LineWriter, raw_mode}, term::{raw_mode, KeyReader, LineWriter},
vimode::{ViInsert, ViMode, ViNormal}, vimode::{ViInsert, ViMode, ViNormal},
FernVi,
}, },
}; };
@@ -605,31 +605,27 @@ fn editor_delete_line_up() {
#[test] #[test]
fn editor_insert_at_line_start() { fn editor_insert_at_line_start() {
// I should move cursor to position 0 when line starts with non-whitespace // I should move cursor to position 0 when line starts with non-whitespace
assert_eq!( assert_eq!(normal_cmd("I", "hello world", 5), ("hello world".into(), 0));
normal_cmd("I", "hello world", 5),
("hello world".into(), 0)
);
// I should skip leading whitespace // I should skip leading whitespace
assert_eq!( assert_eq!(
normal_cmd("I", " hello world", 8), normal_cmd("I", " hello world", 8),
(" hello world".into(), 2) (" hello world".into(), 2)
); );
// I should move to the first non-whitespace on the current line in a multiline buffer // I should move to the first non-whitespace on the current line in a multiline
// buffer
assert_eq!( assert_eq!(
normal_cmd("I", "first line\nsecond line", 14), normal_cmd("I", "first line\nsecond line", 14),
("first line\nsecond line".into(), 11) ("first line\nsecond line".into(), 11)
); );
// I should land on position 0 when cursor is already at 0 // I should land on position 0 when cursor is already at 0
assert_eq!( assert_eq!(normal_cmd("I", "hello", 0), ("hello".into(), 0));
normal_cmd("I", "hello", 0),
("hello".into(), 0)
);
} }
#[test] #[test]
fn editor_f_char_from_position_zero() { fn editor_f_char_from_position_zero() {
// f<char> at position 0 should skip the cursor and find the next occurrence // f<char> at position 0 should skip the cursor and find the next occurrence
// Regression: previously at pos 0, f would match the char under the cursor itself // Regression: previously at pos 0, f would match the char under the cursor
// itself
assert_eq!( assert_eq!(
normal_cmd("fa", "abcaef", 0), normal_cmd("fa", "abcaef", 0),
("abcaef".into(), 3) // should find second 'a', not the 'a' at position 0 ("abcaef".into(), 3) // should find second 'a', not the 'a' at position 0

View File

@@ -1,8 +1,8 @@
use std::sync::Arc; use std::sync::Arc;
use crate::parse::{ use crate::parse::{
NdRule, Node, ParseStream, Redir, RedirType,
lex::{LexFlags, LexStream}, lex::{LexFlags, LexStream},
NdRule, Node, ParseStream, Redir, RedirType,
}; };
use crate::procio::{IoFrame, IoMode, IoStack}; use crate::procio::{IoFrame, IoMode, IoStack};

View File

@@ -1,5 +1,5 @@
use std::path::PathBuf;
use crate::state::{LogTab, MetaTab, ScopeStack, ShellParam, VarFlags, VarTab}; use crate::state::{LogTab, MetaTab, ScopeStack, ShellParam, VarFlags, VarTab};
use std::path::PathBuf;
// ============================================================================ // ============================================================================
// ScopeStack Tests - Variable Scoping // ScopeStack Tests - Variable Scoping
@@ -296,13 +296,21 @@ fn scopestack_local_var_mutation() {
// `foo="bar"` — reassign without LOCAL flag (plain assignment) // `foo="bar"` — reassign without LOCAL flag (plain assignment)
stack.set_var("foo", "bar", VarFlags::NONE); stack.set_var("foo", "bar", VarFlags::NONE);
assert_eq!(stack.get_var("foo"), "bar", "Local var should be mutated in place"); assert_eq!(
stack.get_var("foo"),
"bar",
"Local var should be mutated in place"
);
// Ascend back to global // Ascend back to global
stack.ascend(); stack.ascend();
// foo should not exist in global scope // foo should not exist in global scope
assert_eq!(stack.get_var("foo"), "", "Local var should not leak to global scope"); assert_eq!(
stack.get_var("foo"),
"",
"Local var should not leak to global scope"
);
} }
#[test] #[test]
@@ -318,13 +326,21 @@ fn scopestack_local_var_uninitialized() {
// `foo="bar"` — assign a value later // `foo="bar"` — assign a value later
stack.set_var("foo", "bar", VarFlags::NONE); stack.set_var("foo", "bar", VarFlags::NONE);
assert_eq!(stack.get_var("foo"), "bar", "Uninitialized local should be assignable"); assert_eq!(
stack.get_var("foo"),
"bar",
"Uninitialized local should be assignable"
);
// Ascend back to global // Ascend back to global
stack.ascend(); stack.ascend();
// foo should not exist in global scope // foo should not exist in global scope
assert_eq!(stack.get_var("foo"), "", "Local var should not leak to global scope"); assert_eq!(
stack.get_var("foo"),
"",
"Local var should not leak to global scope"
);
} }
// ============================================================================ // ============================================================================
@@ -740,11 +756,14 @@ fn dirstack_pushd_rotation_with_cwd() {
assert_eq!(new_cwd, Some(PathBuf::from("/var"))); assert_eq!(new_cwd, Some(PathBuf::from("/var")));
let remaining: Vec<_> = meta.dirs().iter().collect(); let remaining: Vec<_> = meta.dirs().iter().collect();
assert_eq!(remaining, vec![ assert_eq!(
remaining,
vec![
&PathBuf::from("/etc"), &PathBuf::from("/etc"),
&PathBuf::from("/home"), &PathBuf::from("/home"),
&PathBuf::from("/tmp"), &PathBuf::from("/tmp"),
]); ]
);
} }
#[test] #[test]
@@ -821,10 +840,10 @@ fn dirstack_popd_plus_n_offset() {
assert_eq!(removed, Some(PathBuf::from("/var"))); assert_eq!(removed, Some(PathBuf::from("/var")));
let remaining: Vec<_> = meta.dirs().iter().collect(); let remaining: Vec<_> = meta.dirs().iter().collect();
assert_eq!(remaining, vec![ assert_eq!(
&PathBuf::from("/tmp"), remaining,
&PathBuf::from("/etc"), vec![&PathBuf::from("/tmp"), &PathBuf::from("/etc"),]
]); );
} }
#[test] #[test]