use std::{cmp, path};
use std::collections::HashMap;
use std::ffi::OsStr;
use std::path::{Path, PathBuf};
use chrono::*;
#[cfg(windows)]
use regex::Captures;
use termcolor::WriteColor;
use crate::calendar::Calendar;
use crate::colors::ColorMap;
use crate::config::{Config, FileKind, RecentKind};
use crate::error::MyResult;
use crate::file::File;
use crate::finder::Total;
use crate::regex;
const MODE_WIDTH: usize = 10; const TIME_WIDTH: usize = 20; const MONTH_WIDTH: usize = 8; const PAD_WIDTH: usize = 2;
pub struct IndentChars {
pub branching: char,
pub terminating: char,
pub horizontal: char,
pub vertical: char,
}
enum IndentToken {
BranchMiddle,
BranchFinal,
SpaceMiddle,
SpaceFinal,
}
#[derive(PartialEq)]
enum DirStyle {
None,
Separator,
Brackets,
}
#[allow(dead_code)]
pub struct Printer<'a, W: WriteColor> {
config: &'a Config,
calendar: Calendar,
writer: W,
counter: HashMap<PathBuf, usize>,
colors: ColorMap,
chars: IndentChars,
git_bash: bool,
separator: char,
separator_str: String,
}
impl<'a, W: WriteColor> Printer<'a, W> {
pub fn new<Tz: TimeZone>(
config: &'a Config,
zone: &Tz,
writer: W,
colors: ColorMap,
chars: IndentChars,
git_bash: bool,
) -> Printer<'a, W> {
let calendar = Calendar::from_time(&config.curr_time, zone);
let counter = HashMap::new();
let git_bash = git_bash && !config.win_path;
let separator = if git_bash { '/' } else { path::MAIN_SEPARATOR };
let separator_str = separator.to_string();
return Self {
config,
calendar,
writer,
counter,
colors,
chars,
git_bash,
separator,
separator_str,
};
}
pub fn print_files<Tz: TimeZone>(
&mut self,
files: &Vec<File>,
total: &Total,
zone: &Tz,
) -> MyResult<()> {
if self.config.show_indent {
self.count_parents(files);
}
if self.config.only_path {
for file in files {
self.print_path(file)?;
if self.config.null_path {
write!(self.writer, "\x00")?;
} else {
writeln!(self.writer)?;
}
}
} else {
let size_width = if self.config.show_total {
measure_size(self.config, total.total_size)
} else {
measure_size(self.config, total.max_size)
};
let time_width = measure_time(self.config);
if self.config.filter_recent != RecentKind::None {
self.print_start(total, zone, size_width, time_width)?;
}
for file in files {
self.print_file(file, total, zone, size_width)?;
}
if self.config.show_total {
self.print_total(total, size_width, time_width)?;
}
}
return Ok(());
}
fn print_start<Tz: TimeZone>(
&mut self,
total: &Total,
zone: &Tz,
size_width: usize,
time_width: usize,
) -> MyResult<()> {
if let Some(start_time) = &total.start_time {
self.print_text("Start", MODE_WIDTH + PAD_WIDTH + size_width + PAD_WIDTH)?;
self.print_time(start_time, zone, false)?;
writeln!(self.writer)?;
self.print_hyphens(MODE_WIDTH + PAD_WIDTH + size_width + PAD_WIDTH + time_width)?;
}
return Ok(());
}
fn print_file<Tz: TimeZone>(
&mut self,
file: &File,
total: &Total,
zone: &Tz,
size_width: usize,
) -> MyResult<()> {
self.print_mode(file.file_type, file.file_mode)?;
self.print_size(file.file_size, size_width)?;
self.print_time(&file.file_time, zone, true)?;
self.print_version(&file.file_ver, total.ver_width)?;
self.print_ext(&file.file_ext, total.ext_width)?;
self.print_path(file)?;
writeln!(self.writer)?;
return Ok(());
}
fn print_total(
&mut self,
total: &Total,
size_width: usize,
time_width: usize,
) -> MyResult<()> {
self.print_hyphens(MODE_WIDTH + PAD_WIDTH + size_width + PAD_WIDTH + time_width)?;
self.print_text("Total", MODE_WIDTH + PAD_WIDTH)?;
self.print_size(total.total_size, size_width)?;
self.print_spaces(time_width + PAD_WIDTH)?;
if total.ext_width > 0 {
self.print_spaces(total.ext_width + PAD_WIDTH)?;
}
self.print_summary(total)?;
writeln!(self.writer)?;
return Ok(());
}
fn print_summary(
&mut self,
total: &Total,
) -> MyResult<()> {
let files = if total.num_files == 1 { "file" } else { "files" };
let dirs = if total.num_dirs == 1 { "directory" } else { "directories" };
write!(
self.writer,
"{num_files} {files} {num_dirs} {dirs}",
num_files = total.num_files,
num_dirs = total.num_dirs,
)?;
return Ok(());
}
fn print_mode(
&mut self,
file_type: FileKind,
file_mode: u32,
) -> MyResult<()> {
match file_type {
FileKind::File(_) => write!(self.writer, "-")?,
FileKind::Dir => write!(self.writer, "d")?,
FileKind::Link(_) => write!(self.writer, "l")?,
FileKind::Other => write!(self.writer, "?")?,
};
for shift in [6, 3, 0] {
let file_mode = file_mode >> shift;
if (file_mode & 4) != 0 {
write!(self.writer, "r")?;
} else {
write!(self.writer, "-")?;
}
if (file_mode & 2) != 0 {
write!(self.writer, "w")?;
} else {
write!(self.writer, "-")?;
}
if (file_mode & 1) != 0 {
write!(self.writer, "x")?;
} else {
write!(self.writer, "-")?;
}
}
self.print_spaces(PAD_WIDTH)?;
return Ok(());
}
fn print_size(
&mut self,
file_size: u64,
size_width: usize,
) -> MyResult<()> {
if self.config.show_pretty {
if file_size < 1_000 {
write!(self.writer, "{0:3} B ", file_size)?;
} else if file_size < 1_000_000 {
write!(self.writer, "{0:3} KB", file_size / 1_000)?;
} else if file_size < 1_000_000_000 {
write!(self.writer, "{0:3} MB", file_size / 1_000_000)?;
} else if file_size < 1_000_000_000_000 {
write!(self.writer, "{0:3} GB", file_size / 1_000_000_000)?;
} else if file_size < 1_000_000_000_000_000 {
write!(self.writer, "{0:3} TB", file_size / 1_000_000_000_000)?;
} else if file_size < 1_000_000_000_000_000_000 {
write!(self.writer, "{0:3} PB", file_size / 1_000_000_000_000_000)?;
} else {
write!(self.writer, "{0:3} EB", file_size / 1_000_000_000_000_000_000)?;
}
} else {
self.print_thousand(file_size, size_width)?;
}
self.print_spaces(PAD_WIDTH)?;
return Ok(());
}
fn print_thousand(
&mut self,
file_size: u64,
size_width: usize,
) -> MyResult<()> {
if file_size < 1000 {
write!(self.writer, "{0:1$}", file_size, size_width)?;
} else {
self.print_thousand(file_size / 1000, cmp::max(size_width, 4) - 4)?;
write!(self.writer, ",{0:03}", file_size % 1000)?;
}
return Ok(());
}
fn print_time<Tz: TimeZone>(
&mut self,
file_time: &DateTime<Utc>,
zone: &Tz,
padding: bool,
) -> MyResult<()> {
if self.config.show_pretty {
let recent = RecentKind::from_times(&file_time, &self.config.curr_time, &self.calendar, zone);
match recent {
RecentKind::None => write!(self.writer, " future")?,
RecentKind::Sec(count) => write!(self.writer, "{:2} sec", count)?,
RecentKind::Min(count) => write!(self.writer, "{:2} min", count)?,
RecentKind::Hour(count) => write!(self.writer, "{:2} hour", count)?,
RecentKind::Day(count) => write!(self.writer, "{:2} day", count)?,
RecentKind::Week(count) => write!(self.writer, "{:2} week", count)?,
RecentKind::Month(count) => write!(self.writer, "{:2} month", count)?,
RecentKind::Year(count) => write!(self.writer, "{:2} year", count)?,
}
if padding {
match recent {
RecentKind::None => write!(self.writer, " ")?,
RecentKind::Sec(_) => write!(self.writer, " ")?,
RecentKind::Min(_) => write!(self.writer, " ")?,
RecentKind::Hour(_) => write!(self.writer, " ")?,
RecentKind::Day(_) => write!(self.writer, " ")?,
RecentKind::Week(_) => write!(self.writer, " ")?,
RecentKind::Month(_) => write!(self.writer, "")?,
RecentKind::Year(_) => write!(self.writer, " ")?,
}
}
} else {
let file_time = file_time.with_timezone(zone);
let day = file_time.day();
let month = convert_month(file_time.month());
let year = file_time.year();
let hour = file_time.hour();
let minute = file_time.minute();
let second = file_time.second();
write!(self.writer, "{day:02}-{month}-{year:04} {hour:02}:{minute:02}:{second:02}")?;
if self.config.show_utc {
write!(self.writer, "Z")?;
}
}
if padding {
self.print_spaces(PAD_WIDTH)?;
}
return Ok(());
}
fn print_version(
&mut self,
file_ver: &Option<String>,
ver_width: usize,
) -> MyResult<()> {
if ver_width > 0 {
if let Some(file_ver) = file_ver {
write!(self.writer, "{0:1$}", file_ver, ver_width)?;
self.print_spaces(PAD_WIDTH)?;
} else {
self.print_spaces(ver_width + PAD_WIDTH)?;
}
}
return Ok(());
}
fn print_ext(
&mut self,
file_ext: &str,
ext_width: usize,
) -> MyResult<()> {
if ext_width > 0 {
write!(self.writer, "{0:1$}", file_ext, ext_width)?;
self.print_spaces(PAD_WIDTH)?;
}
return Ok(());
}
fn print_path(
&mut self,
file: &File,
) -> MyResult<()> {
if self.config.show_indent {
self.print_prefix(file)?;
if file.file_type == FileKind::Dir {
let file_dir = file.select_name_for_indent().unwrap_or_default();
self.print_dir(file_dir, DirStyle::None)?;
} else {
self.print_name(&file.file_name, &file.file_ext, file.file_type)?;
}
self.print_link(&file.link_data)?;
} else {
let file_dir = file.select_dir(self.config.abs_path).to_str().unwrap_or_default();
if self.config.order_name {
self.print_name(&file.file_name, &file.file_ext, file.file_type)?;
self.print_dir(file_dir, DirStyle::Brackets)?;
self.print_link(&file.link_data)?;
} else {
self.print_dir(file_dir, DirStyle::Separator)?;
self.print_name(&file.file_name, &file.file_ext, file.file_type)?;
if !self.config.escape_path && !self.config.null_path {
self.print_link(&file.link_data)?;
}
}
}
return Ok(());
}
fn print_dir(
&mut self,
file_dir: &str,
dir_style: DirStyle,
) -> MyResult<()> {
if !file_dir.is_empty() && file_dir != "." {
if dir_style == DirStyle::Brackets {
write!(self.writer, " (")?;
}
self.writer.set_color(&self.colors.dir_color)?;
self.escape_dir(file_dir)?;
if dir_style == DirStyle::Separator && !file_dir.ends_with(path::MAIN_SEPARATOR) {
write!(self.writer, "{}", self.separator)?;
}
self.writer.reset()?;
if dir_style == DirStyle::Brackets {
write!(self.writer, ")")?;
}
}
return Ok(());
}
#[cfg(windows)]
fn escape_dir(
&mut self,
file_dir: &str,
) -> MyResult<()> {
if self.git_bash {
let drive_regex = regex!(r#"^([A-Z]):(.*)$"#);
let file_dir = file_dir.replace(path::MAIN_SEPARATOR, &self.separator_str);
let file_dir = drive_regex.replace(&file_dir, |caps: &Captures| {
format!("{}{}{}", self.separator, &caps[1].to_lowercase(), &caps[2])
});
if self.config.escape_path {
let escape_regex = regex!(r#"([\s"'])"#);
let file_dir = escape_regex.replace_all(&file_dir, "\\$1");
write!(self.writer, "{file_dir}")?;
} else {
write!(self.writer, "{file_dir}")?;
}
} else {
write!(self.writer, "{file_dir}")?;
}
return Ok(());
}
#[cfg(not(windows))]
fn escape_dir(
&mut self,
file_dir: &str,
) -> MyResult<()> {
if self.config.escape_path {
let escape_regex = regex!(r#"([\s"'\\])"#);
let file_dir = escape_regex.replace_all(file_dir, "\\$1");
write!(self.writer, "{file_dir}")?;
} else {
write!(self.writer, "{file_dir}")?;
}
return Ok(());
}
fn print_name(
&mut self,
file_name: &str,
file_ext: &str,
file_type: FileKind,
) -> MyResult<()> {
if !file_name.is_empty() {
match file_type {
FileKind::File(exec) => {
if exec {
self.writer.set_color(&self.colors.exec_color)?;
self.escape_name(file_name)?;
self.writer.reset()?;
} else if let Some(color) = self.colors.find_color(&file_ext) {
self.writer.set_color(color)?;
self.escape_name(file_name)?;
self.writer.reset()?;
} else {
self.escape_name(file_name)?;
}
}
FileKind::Dir => {
self.writer.set_color(&self.colors.dir_color)?;
self.escape_name(file_name)?;
write!(self.writer, "{}", self.separator)?;
self.writer.reset()?;
}
FileKind::Link(resolved) => {
if resolved {
self.writer.set_color(&self.colors.link_color)?;
} else {
self.writer.set_color(&self.colors.bad_color)?;
}
self.escape_name(file_name)?;
self.writer.reset()?;
}
FileKind::Other => {
self.escape_name(file_name)?;
}
}
}
return Ok(());
}
#[cfg(windows)]
fn escape_name(
&mut self,
file_name: &str,
) -> MyResult<()> {
if self.config.escape_path && self.git_bash {
let escape_regex = regex!(r#"([\s"'])"#);
let file_name = escape_regex.replace_all(file_name, "\\$1");
write!(self.writer, "{file_name}")?;
} else {
write!(self.writer, "{file_name}")?;
}
return Ok(());
}
#[cfg(not(windows))]
fn escape_name(
&mut self,
file_name: &str,
) -> MyResult<()> {
if self.config.escape_path {
let escape_regex = regex!(r#"([\s"'\\])"#);
let file_name = escape_regex.replace_all(file_name, "\\$1");
write!(self.writer, "{file_name}")?;
} else {
write!(self.writer, "{file_name}")?;
}
return Ok(());
}
fn print_link(
&mut self,
link_data: &Option<(PathBuf, FileKind)>,
) -> MyResult<()> {
if let Some((link_path, link_type)) = link_data {
if let Some(link_dir) = link_path.parent().and_then(Path::to_str) {
if let Some(link_name) = link_path.file_name().and_then(OsStr::to_str) {
write!(self.writer, " -> ")?;
let link_ext = link_path.extension().and_then(OsStr::to_str).unwrap_or_default();
self.print_dir(link_dir, DirStyle::Separator)?;
self.print_name(link_name, &link_ext, *link_type)?;
}
}
}
return Ok(());
}
fn count_parents(&mut self, files: &Vec<File>) {
for file in files {
if file.file_depth > 1 {
if let Some(parent) = file.select_parent_for_indent() {
let parent = PathBuf::from(parent);
let entry = self.counter.entry(parent).or_insert(0);
*entry += 1;
}
}
}
}
fn print_prefix(&mut self, file: &File) -> MyResult<()> {
let tokens = self.create_prefix(file);
for token in tokens {
match token {
IndentToken::BranchMiddle => {
write!(self.writer, " ")?;
self.writer.set_color(&self.colors.dir_color)?;
write!(self.writer, "{}", self.chars.branching)?;
write!(self.writer, "{}", self.chars.horizontal)?;
self.writer.reset()?;
write!(self.writer, " ")?;
}
IndentToken::BranchFinal => {
write!(self.writer, " ")?;
self.writer.set_color(&self.colors.dir_color)?;
write!(self.writer, "{}", self.chars.terminating)?;
write!(self.writer, "{}", self.chars.horizontal)?;
self.writer.reset()?;
write!(self.writer, " ")?;
}
IndentToken::SpaceMiddle => {
write!(self.writer, " ")?;
self.writer.set_color(&self.colors.dir_color)?;
write!(self.writer, "{}", self.chars.vertical)?;
self.writer.reset()?;
write!(self.writer, " ")?;
}
IndentToken::SpaceFinal => {
write!(self.writer, " ")?;
}
}
}
return Ok(());
}
fn create_prefix(&mut self, file: &File) -> Vec<IndentToken> {
let mut tokens = Vec::new();
if let Some(parent) = file.select_parent_for_indent() {
let mut path = PathBuf::from(parent);
if let Some(count) = self.counter.get_mut(&path) {
*count -= 1;
if *count > 0 {
tokens.push(IndentToken::BranchMiddle);
} else {
tokens.push(IndentToken::BranchFinal);
}
}
while let Some(parent) = path.parent() {
path = PathBuf::from(parent);
if let Some(count) = self.counter.get(&path) {
if *count > 0 {
tokens.push(IndentToken::SpaceMiddle);
} else {
tokens.push(IndentToken::SpaceFinal);
}
}
}
}
tokens.reverse();
return tokens;
}
fn print_text(&mut self, text: &str, width: usize) -> MyResult<()> {
write!(self.writer, "{0:<1$}", text, width)?;
return Ok(());
}
fn print_spaces(&mut self, width: usize) -> MyResult<()> {
write!(self.writer, "{0:<1$}", "", width)?;
return Ok(());
}
fn print_hyphens(&mut self, width: usize) -> MyResult<()> {
writeln!(self.writer, "{0:-<1$}", "", width)?;
return Ok(());
}
}
fn measure_size(config: &Config, size: u64) -> usize {
if config.show_pretty {
6
} else {
recurse_size(size)
}
}
fn recurse_size(size: u64) -> usize {
if size < 1000 {
3
} else {
recurse_size(size / 1000) + 4
}
}
fn measure_time(config: &Config) -> usize {
if config.show_pretty {
MONTH_WIDTH
} else if config.show_utc {
TIME_WIDTH + 1 } else {
TIME_WIDTH
}
}
fn convert_month(month: u32) -> &'static str {
match month {
1 => "Jan",
2 => "Feb",
3 => "Mar",
4 => "Apr",
5 => "May",
6 => "Jun",
7 => "Jul",
8 => "Aug",
9 => "Sep",
10 => "Oct",
11 => "Nov",
12 => "Dec",
_ => "???",
}
}
#[cfg(test)]
mod tests {
use std::cmp::Ordering;
use std::io;
use std::io::Write;
use std::path::PathBuf;
use path_clean::PathClean;
use pretty_assertions::assert_eq;
use termcolor::{Color, ColorSpec};
use crate::config::RecentKind;
use super::*;
#[test]
fn test_prints_type() {
assert_eq!("---------- ", wrap_mode(FileKind::File(false), 0o000));
assert_eq!("---------- ", wrap_mode(FileKind::File(true), 0o000));
assert_eq!("d--------- ", wrap_mode(FileKind::Dir, 0o000));
assert_eq!("l--------- ", wrap_mode(FileKind::Link(false), 0o000));
assert_eq!("l--------- ", wrap_mode(FileKind::Link(true), 0o000));
assert_eq!("?--------- ", wrap_mode(FileKind::Other, 0o000));
}
#[test]
fn test_prints_mode() {
assert_eq!("---------- ", wrap_mode(FileKind::File(false), 0o000));
assert_eq!("-r-------- ", wrap_mode(FileKind::File(false), 0o400));
assert_eq!("--w------- ", wrap_mode(FileKind::File(false), 0o200));
assert_eq!("---x------ ", wrap_mode(FileKind::File(false), 0o100));
assert_eq!("----r----- ", wrap_mode(FileKind::File(false), 0o040));
assert_eq!("-----w---- ", wrap_mode(FileKind::File(false), 0o020));
assert_eq!("------x--- ", wrap_mode(FileKind::File(false), 0o010));
assert_eq!("-------r-- ", wrap_mode(FileKind::File(false), 0o004));
assert_eq!("--------w- ", wrap_mode(FileKind::File(false), 0o002));
assert_eq!("---------x ", wrap_mode(FileKind::File(false), 0o001));
assert_eq!("-rwxrwxrwx ", wrap_mode(FileKind::File(false), 0o777));
}
#[test]
fn test_measures_size_for_integer() {
let config = Config::default();
assert_eq!(3, measure_size(&config, 0));
assert_eq!(3, measure_size(&config, 999));
assert_eq!(7, measure_size(&config, 1_000));
assert_eq!(7, measure_size(&config, 999_999));
assert_eq!(11, measure_size(&config, 1_000_000));
assert_eq!(11, measure_size(&config, 999_999_999));
}
#[test]
fn test_measures_size_for_si_units() {
let config = Config::default()
.with_show_pretty(true);
assert_eq!(6, measure_size(&config, 0));
assert_eq!(6, measure_size(&config, 999));
assert_eq!(6, measure_size(&config, 1_000));
assert_eq!(6, measure_size(&config, 999_999));
assert_eq!(6, measure_size(&config, 1_000_000));
assert_eq!(6, measure_size(&config, 999_999_999));
}
#[test]
fn test_prints_unpadded_size_as_integer() {
let config = Config::default();
assert_eq!("0 ", wrap_size(&config, 0, 0));
assert_eq!("9 ", wrap_size(&config, 9, 0));
assert_eq!("10 ", wrap_size(&config, 10, 0));
assert_eq!("99 ", wrap_size(&config, 99, 0));
assert_eq!("100 ", wrap_size(&config, 100, 0));
assert_eq!("999 ", wrap_size(&config, 999, 0));
assert_eq!("1,000 ", wrap_size(&config, 1_000, 0));
assert_eq!("9,999 ", wrap_size(&config, 9_999, 0));
assert_eq!("10,000 ", wrap_size(&config, 10_000, 0));
assert_eq!("99,999 ", wrap_size(&config, 99_999, 0));
assert_eq!("100,000 ", wrap_size(&config, 100_000, 0));
assert_eq!("999,999 ", wrap_size(&config, 999_999, 0));
assert_eq!("1,000,000 ", wrap_size(&config, 1_000_000, 0));
assert_eq!("9,999,999 ", wrap_size(&config, 9_999_999, 0));
assert_eq!("10,000,000 ", wrap_size(&config, 10_000_000, 0));
assert_eq!("99,999,999 ", wrap_size(&config, 99_999_999, 0));
assert_eq!("100,000,000 ", wrap_size(&config, 100_000_000, 0));
assert_eq!("999,999,999 ", wrap_size(&config, 999_999_999, 0));
assert_eq!("1,000,000,000 ", wrap_size(&config, 1_000_000_000, 0));
assert_eq!("9,999,999,999 ", wrap_size(&config, 9_999_999_999, 0));
assert_eq!("10,000,000,000 ", wrap_size(&config, 10_000_000_000, 0));
assert_eq!("99,999,999,999 ", wrap_size(&config, 99_999_999_999, 0));
assert_eq!("100,000,000,000 ", wrap_size(&config, 100_000_000_000, 0));
assert_eq!("999,999,999,999 ", wrap_size(&config, 999_999_999_999, 0));
assert_eq!("1,000,000,000,000 ", wrap_size(&config, 1_000_000_000_000, 0));
assert_eq!("9,999,999,999,999 ", wrap_size(&config, 9_999_999_999_999, 0));
assert_eq!("10,000,000,000,000 ", wrap_size(&config, 10_000_000_000_000, 0));
assert_eq!("99,999,999,999,999 ", wrap_size(&config, 99_999_999_999_999, 0));
assert_eq!("100,000,000,000,000 ", wrap_size(&config, 100_000_000_000_000, 0));
assert_eq!("999,999,999,999,999 ", wrap_size(&config, 999_999_999_999_999, 0));
assert_eq!("1,000,000,000,000,000 ", wrap_size(&config, 1_000_000_000_000_000, 0));
assert_eq!("9,999,999,999,999,999 ", wrap_size(&config, 9_999_999_999_999_999, 0));
assert_eq!("10,000,000,000,000,000 ", wrap_size(&config, 10_000_000_000_000_000, 0));
assert_eq!("99,999,999,999,999,999 ", wrap_size(&config, 99_999_999_999_999_999, 0));
assert_eq!("100,000,000,000,000,000 ", wrap_size(&config, 100_000_000_000_000_000, 0));
assert_eq!("999,999,999,999,999,999 ", wrap_size(&config, 999_999_999_999_999_999, 0));
assert_eq!("1,000,000,000,000,000,000 ", wrap_size(&config, 1_000_000_000_000_000_000, 0));
assert_eq!("9,999,999,999,999,999,999 ", wrap_size(&config, 9_999_999_999_999_999_999, 0));
assert_eq!("10,000,000,000,000,000,000 ", wrap_size(&config, 10_000_000_000_000_000_000, 0));
}
#[test]
fn test_prints_padded_size_as_integer() {
let config = Config::default();
assert_eq!(" 0 ", wrap_size(&config, 0, 26));
assert_eq!(" 9 ", wrap_size(&config, 9, 26));
assert_eq!(" 10 ", wrap_size(&config, 10, 26));
assert_eq!(" 99 ", wrap_size(&config, 99, 26));
assert_eq!(" 100 ", wrap_size(&config, 100, 26));
assert_eq!(" 999 ", wrap_size(&config, 999, 26));
assert_eq!(" 1,000 ", wrap_size(&config, 1_000, 26));
assert_eq!(" 9,999 ", wrap_size(&config, 9_999, 26));
assert_eq!(" 10,000 ", wrap_size(&config, 10_000, 26));
assert_eq!(" 99,999 ", wrap_size(&config, 99_999, 26));
assert_eq!(" 100,000 ", wrap_size(&config, 100_000, 26));
assert_eq!(" 999,999 ", wrap_size(&config, 999_999, 26));
assert_eq!(" 1,000,000 ", wrap_size(&config, 1_000_000, 26));
assert_eq!(" 9,999,999 ", wrap_size(&config, 9_999_999, 26));
assert_eq!(" 10,000,000 ", wrap_size(&config, 10_000_000, 26));
assert_eq!(" 99,999,999 ", wrap_size(&config, 99_999_999, 26));
assert_eq!(" 100,000,000 ", wrap_size(&config, 100_000_000, 26));
assert_eq!(" 999,999,999 ", wrap_size(&config, 999_999_999, 26));
assert_eq!(" 1,000,000,000 ", wrap_size(&config, 1_000_000_000, 26));
assert_eq!(" 9,999,999,999 ", wrap_size(&config, 9_999_999_999, 26));
assert_eq!(" 10,000,000,000 ", wrap_size(&config, 10_000_000_000, 26));
assert_eq!(" 99,999,999,999 ", wrap_size(&config, 99_999_999_999, 26));
assert_eq!(" 100,000,000,000 ", wrap_size(&config, 100_000_000_000, 26));
assert_eq!(" 999,999,999,999 ", wrap_size(&config, 999_999_999_999, 26));
assert_eq!(" 1,000,000,000,000 ", wrap_size(&config, 1_000_000_000_000, 26));
assert_eq!(" 9,999,999,999,999 ", wrap_size(&config, 9_999_999_999_999, 26));
assert_eq!(" 10,000,000,000,000 ", wrap_size(&config, 10_000_000_000_000, 26));
assert_eq!(" 99,999,999,999,999 ", wrap_size(&config, 99_999_999_999_999, 26));
assert_eq!(" 100,000,000,000,000 ", wrap_size(&config, 100_000_000_000_000, 26));
assert_eq!(" 999,999,999,999,999 ", wrap_size(&config, 999_999_999_999_999, 26));
assert_eq!(" 1,000,000,000,000,000 ", wrap_size(&config, 1_000_000_000_000_000, 26));
assert_eq!(" 9,999,999,999,999,999 ", wrap_size(&config, 9_999_999_999_999_999, 26));
assert_eq!(" 10,000,000,000,000,000 ", wrap_size(&config, 10_000_000_000_000_000, 26));
assert_eq!(" 99,999,999,999,999,999 ", wrap_size(&config, 99_999_999_999_999_999, 26));
assert_eq!(" 100,000,000,000,000,000 ", wrap_size(&config, 100_000_000_000_000_000, 26));
assert_eq!(" 999,999,999,999,999,999 ", wrap_size(&config, 999_999_999_999_999_999, 26));
assert_eq!(" 1,000,000,000,000,000,000 ", wrap_size(&config, 1_000_000_000_000_000_000, 26));
assert_eq!(" 9,999,999,999,999,999,999 ", wrap_size(&config, 9_999_999_999_999_999_999, 26));
assert_eq!("10,000,000,000,000,000,000 ", wrap_size(&config, 10_000_000_000_000_000_000, 26));
}
#[test]
fn test_prints_unpadded_size_in_si_units() {
let config = Config::default()
.with_show_pretty(true);
assert_eq!(" 0 B ", wrap_size(&config, 0, 0));
assert_eq!(" 9 B ", wrap_size(&config, 9, 0));
assert_eq!(" 10 B ", wrap_size(&config, 10, 0));
assert_eq!(" 99 B ", wrap_size(&config, 99, 0));
assert_eq!("100 B ", wrap_size(&config, 100, 0));
assert_eq!("999 B ", wrap_size(&config, 999, 0));
assert_eq!(" 1 KB ", wrap_size(&config, 1_000, 0));
assert_eq!(" 9 KB ", wrap_size(&config, 9_999, 0));
assert_eq!(" 10 KB ", wrap_size(&config, 10_000, 0));
assert_eq!(" 99 KB ", wrap_size(&config, 99_999, 0));
assert_eq!("100 KB ", wrap_size(&config, 100_000, 0));
assert_eq!("999 KB ", wrap_size(&config, 999_999, 0));
assert_eq!(" 1 MB ", wrap_size(&config, 1_000_000, 0));
assert_eq!(" 9 MB ", wrap_size(&config, 9_999_999, 0));
assert_eq!(" 10 MB ", wrap_size(&config, 10_000_000, 0));
assert_eq!(" 99 MB ", wrap_size(&config, 99_999_999, 0));
assert_eq!("100 MB ", wrap_size(&config, 100_000_000, 0));
assert_eq!("999 MB ", wrap_size(&config, 999_999_999, 0));
assert_eq!(" 1 GB ", wrap_size(&config, 1_000_000_000, 0));
assert_eq!(" 9 GB ", wrap_size(&config, 9_999_999_999, 0));
assert_eq!(" 10 GB ", wrap_size(&config, 10_000_000_000, 0));
assert_eq!(" 99 GB ", wrap_size(&config, 99_999_999_999, 0));
assert_eq!("100 GB ", wrap_size(&config, 100_000_000_000, 0));
assert_eq!("999 GB ", wrap_size(&config, 999_999_999_999, 0));
assert_eq!(" 1 TB ", wrap_size(&config, 1_000_000_000_000, 0));
assert_eq!(" 9 TB ", wrap_size(&config, 9_999_999_999_999, 0));
assert_eq!(" 10 TB ", wrap_size(&config, 10_000_000_000_000, 0));
assert_eq!(" 99 TB ", wrap_size(&config, 99_999_999_999_999, 0));
assert_eq!("100 TB ", wrap_size(&config, 100_000_000_000_000, 0));
assert_eq!("999 TB ", wrap_size(&config, 999_999_999_999_999, 0));
assert_eq!(" 1 PB ", wrap_size(&config, 1_000_000_000_000_000, 0));
assert_eq!(" 9 PB ", wrap_size(&config, 9_999_999_999_999_999, 0));
assert_eq!(" 10 PB ", wrap_size(&config, 10_000_000_000_000_000, 0));
assert_eq!(" 99 PB ", wrap_size(&config, 99_999_999_999_999_999, 0));
assert_eq!("100 PB ", wrap_size(&config, 100_000_000_000_000_000, 0));
assert_eq!("999 PB ", wrap_size(&config, 999_999_999_999_999_999, 0));
assert_eq!(" 1 EB ", wrap_size(&config, 1_000_000_000_000_000_000, 0));
assert_eq!(" 9 EB ", wrap_size(&config, 9_999_999_999_999_999_999, 0));
assert_eq!(" 10 EB ", wrap_size(&config, 10_000_000_000_000_000_000, 0));
}
#[test]
fn test_prints_time_as_local_timestamp() {
let config = Config::default()
.with_curr_time(2024, 10, 10, 10, 10, 30)
.with_show_utc(false);
assert_eq!("31-Jan-2024 00:00:00 ", wrap_time(&config, 2024, 1, 31, 0, 0, 0));
assert_eq!("29-Feb-2024 02:05:15 ", wrap_time(&config, 2024, 2, 29, 2, 5, 15));
assert_eq!("31-Mar-2024 04:10:30 ", wrap_time(&config, 2024, 3, 31, 4, 10, 30));
assert_eq!("30-Apr-2024 06:15:45 ", wrap_time(&config, 2024, 4, 30, 6, 15, 45));
assert_eq!("31-May-2024 08:20:00 ", wrap_time(&config, 2024, 5, 31, 8, 20, 0));
assert_eq!("30-Jun-2024 10:25:15 ", wrap_time(&config, 2024, 6, 30, 10, 25, 15));
assert_eq!("31-Jul-2024 12:30:30 ", wrap_time(&config, 2024, 7, 31, 12, 30, 30));
assert_eq!("31-Aug-2024 14:35:45 ", wrap_time(&config, 2024, 8, 31, 14, 35, 45));
assert_eq!("30-Sep-2024 16:40:00 ", wrap_time(&config, 2024, 9, 30, 16, 40, 0));
assert_eq!("31-Oct-2024 18:45:15 ", wrap_time(&config, 2024, 10, 31, 18, 45, 15));
assert_eq!("30-Nov-2024 20:50:30 ", wrap_time(&config, 2024, 11, 30, 20, 50, 30));
assert_eq!("31-Dec-2024 22:55:45 ", wrap_time(&config, 2024, 12, 31, 22, 55, 45));
}
#[test]
fn test_prints_time_as_utc_timestamp() {
let config = Config::default()
.with_curr_time(2024, 10, 10, 10, 10, 30)
.with_show_utc(true);
assert_eq!("31-Jan-2024 00:00:00Z ", wrap_time(&config, 2024, 1, 31, 0, 0, 0));
assert_eq!("29-Feb-2024 02:05:15Z ", wrap_time(&config, 2024, 2, 29, 2, 5, 15));
assert_eq!("31-Mar-2024 04:10:30Z ", wrap_time(&config, 2024, 3, 31, 4, 10, 30));
assert_eq!("30-Apr-2024 06:15:45Z ", wrap_time(&config, 2024, 4, 30, 6, 15, 45));
assert_eq!("31-May-2024 08:20:00Z ", wrap_time(&config, 2024, 5, 31, 8, 20, 0));
assert_eq!("30-Jun-2024 10:25:15Z ", wrap_time(&config, 2024, 6, 30, 10, 25, 15));
assert_eq!("31-Jul-2024 12:30:30Z ", wrap_time(&config, 2024, 7, 31, 12, 30, 30));
assert_eq!("31-Aug-2024 14:35:45Z ", wrap_time(&config, 2024, 8, 31, 14, 35, 45));
assert_eq!("30-Sep-2024 16:40:00Z ", wrap_time(&config, 2024, 9, 30, 16, 40, 0));
assert_eq!("31-Oct-2024 18:45:15Z ", wrap_time(&config, 2024, 10, 31, 18, 45, 15));
assert_eq!("30-Nov-2024 20:50:30Z ", wrap_time(&config, 2024, 11, 30, 20, 50, 30));
assert_eq!("31-Dec-2024 22:55:45Z ", wrap_time(&config, 2024, 12, 31, 22, 55, 45));
}
#[test]
fn test_prints_time_as_duration() {
let config = Config::default()
.with_curr_time(2024, 10, 10, 10, 10, 30)
.with_show_pretty(true);
assert_eq!(" future ", wrap_time(&config, 2024, 10, 10, 10, 10, 31));
assert_eq!(" 0 sec ", wrap_time(&config, 2024, 10, 10, 10, 10, 30));
assert_eq!(" 1 sec ", wrap_time(&config, 2024, 10, 10, 10, 10, 29));
assert_eq!("59 sec ", wrap_time(&config, 2024, 10, 10, 10, 9, 31));
assert_eq!(" 1 min ", wrap_time(&config, 2024, 10, 10, 10, 9, 30));
assert_eq!(" 1 min ", wrap_time(&config, 2024, 10, 10, 10, 9, 29));
assert_eq!(" 1 min ", wrap_time(&config, 2024, 10, 10, 10, 8, 31));
assert_eq!(" 2 min ", wrap_time(&config, 2024, 10, 10, 10, 8, 30));
assert_eq!(" 2 min ", wrap_time(&config, 2024, 10, 10, 10, 8, 29));
assert_eq!("58 min ", wrap_time(&config, 2024, 10, 10, 9, 11, 31));
assert_eq!("59 min ", wrap_time(&config, 2024, 10, 10, 9, 11, 30));
assert_eq!("59 min ", wrap_time(&config, 2024, 10, 10, 9, 11, 29));
assert_eq!("59 min ", wrap_time(&config, 2024, 10, 10, 9, 10, 31));
assert_eq!(" 1 hour ", wrap_time(&config, 2024, 10, 10, 9, 10, 30));
assert_eq!(" 1 hour ", wrap_time(&config, 2024, 10, 10, 9, 10, 29));
assert_eq!(" 1 hour ", wrap_time(&config, 2024, 10, 10, 8, 10, 31));
assert_eq!(" 2 hour ", wrap_time(&config, 2024, 10, 10, 8, 10, 30));
assert_eq!(" 2 hour ", wrap_time(&config, 2024, 10, 10, 8, 10, 29));
assert_eq!("22 hour ", wrap_time(&config, 2024, 10, 9, 11, 10, 31));
assert_eq!("23 hour ", wrap_time(&config, 2024, 10, 9, 11, 10, 30));
assert_eq!("23 hour ", wrap_time(&config, 2024, 10, 9, 11, 10, 29));
assert_eq!("23 hour ", wrap_time(&config, 2024, 10, 9, 10, 10, 31));
assert_eq!(" 1 day ", wrap_time(&config, 2024, 10, 9, 10, 10, 30));
assert_eq!(" 1 day ", wrap_time(&config, 2024, 10, 9, 10, 10, 29));
assert_eq!(" 1 day ", wrap_time(&config, 2024, 10, 8, 10, 10, 31));
assert_eq!(" 2 day ", wrap_time(&config, 2024, 10, 8, 10, 10, 30));
assert_eq!(" 2 day ", wrap_time(&config, 2024, 10, 8, 10, 10, 29));
assert_eq!("28 day ", wrap_time(&config, 2024, 9, 11, 10, 10, 31));
assert_eq!("29 day ", wrap_time(&config, 2024, 9, 11, 10, 10, 30));
assert_eq!("29 day ", wrap_time(&config, 2024, 9, 11, 10, 10, 29));
assert_eq!("29 day ", wrap_time(&config, 2024, 9, 10, 10, 10, 31));
assert_eq!(" 1 month ", wrap_time(&config, 2024, 9, 10, 10, 10, 30));
assert_eq!(" 1 month ", wrap_time(&config, 2024, 9, 10, 10, 10, 29));
assert_eq!(" 1 month ", wrap_time(&config, 2024, 8, 10, 10, 10, 31));
assert_eq!(" 2 month ", wrap_time(&config, 2024, 8, 10, 10, 10, 30));
assert_eq!(" 2 month ", wrap_time(&config, 2024, 8, 10, 10, 10, 29));
assert_eq!("10 month ", wrap_time(&config, 2023, 11, 10, 10, 10, 31));
assert_eq!("11 month ", wrap_time(&config, 2023, 11, 10, 10, 10, 30));
assert_eq!("11 month ", wrap_time(&config, 2023, 11, 10, 10, 10, 29));
assert_eq!("11 month ", wrap_time(&config, 2023, 10, 10, 10, 10, 31));
assert_eq!(" 1 year ", wrap_time(&config, 2023, 10, 10, 10, 10, 30));
assert_eq!(" 1 year ", wrap_time(&config, 2023, 10, 10, 10, 10, 29));
assert_eq!(" 1 year ", wrap_time(&config, 2022, 10, 10, 10, 10, 31));
assert_eq!(" 2 year ", wrap_time(&config, 2022, 10, 10, 10, 10, 30));
assert_eq!(" 2 year ", wrap_time(&config, 2022, 10, 10, 10, 10, 29));
}
#[test]
fn test_prints_unpadded_version() {
assert_eq!("", wrap_version(None, 0));
assert_eq!("", wrap_version(Some(""), 0));
assert_eq!("", wrap_version(Some("9.9.9.9"), 0));
assert_eq!("", wrap_version(Some("999.999.999.999"), 0));
}
#[test]
fn test_prints_padded_version() {
assert_eq!(" ", wrap_version(None, 10));
assert_eq!(" ", wrap_version(Some(""), 10));
assert_eq!("9.9.9.9 ", wrap_version(Some("9.9.9.9"), 10));
assert_eq!("999.999.999.999 ", wrap_version(Some("999.999.999.999"), 10));
}
#[test]
fn test_prints_unpadded_ext() {
assert_eq!("", wrap_ext("", 0));
assert_eq!("", wrap_ext(".txt", 0));
assert_eq!("", wrap_ext(".extension", 0));
}
#[test]
fn test_prints_padded_ext() {
assert_eq!(" ", wrap_ext("", 6));
assert_eq!(".txt ", wrap_ext(".txt", 6));
assert_eq!(".extension ", wrap_ext(".extension", 6));
}
#[test]
fn test_prints_total() {
assert_eq!("0 files 0 directories", wrap_total(0, 0));
assert_eq!("1 file 0 directories", wrap_total(1, 0));
assert_eq!("2 files 0 directories", wrap_total(2, 0));
assert_eq!("0 files 1 directory", wrap_total(0, 1));
assert_eq!("0 files 2 directories", wrap_total(0, 2));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_on_windows() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_on_git_bash() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_relative_paths_on_linux() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_on_windows() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]D:\\root\\[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]D:\\root\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_on_git_bash() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]/d/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]/d/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]/d/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]/d/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]/d/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]/d/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_absolute_paths_on_linux() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_start_header_on_windows() {
let expected = "\
Start 01-Jan-2023 00:00:00
-------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_start_header_on_git_bash() {
let expected = "\
Start 01-Jan-2023 00:00:00
-------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_relative_paths_with_start_header_on_linux() {
let expected = "\
Start 01-Jan-2023 00:00:00
-------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_start_header_on_windows() {
let expected = "\
Start 01-Jan-2023 00:00:00
-------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]D:\\root\\[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]D:\\root\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_start_header_on_git_bash() {
let expected = "\
Start 01-Jan-2023 00:00:00
-------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]/d/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]/d/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]/d/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]/d/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]/d/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]/d/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_absolute_paths_with_start_header_on_linux() {
let expected = "\
Start 01-Jan-2023 00:00:00
-------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_start_header_and_utc_on_windows() {
let expected = "\
Start 01-Jan-2023 00:00:00Z
--------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00Z .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00Z .sh [LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00Z .txt [LtBlue]files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00Z .txt [LtBlue]files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00Z .txt [LtBlue]files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00Z .sh [LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00Z .gz [LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00Z [LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00Z .txt [LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_show_utc(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_start_header_and_utc_on_git_bash() {
let expected = "\
Start 01-Jan-2023 00:00:00Z
--------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00Z .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00Z .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00Z .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00Z .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00Z .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00Z .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00Z .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00Z [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00Z .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_show_utc(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_relative_paths_with_start_header_and_utc_on_linux() {
let expected = "\
Start 01-Jan-2023 00:00:00Z
--------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00Z .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00Z .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00Z .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00Z .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00Z .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00Z .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00Z .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00Z [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00Z .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_show_utc(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_start_header_and_utc_on_windows() {
let expected = "\
Start 01-Jan-2023 00:00:00Z
--------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00Z .sh [LtBlue]D:\\root\\[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]D:\\root\\files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]D:\\root\\files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00Z .sh [LtBlue]D:\\root\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00Z .txt [LtBlue]D:\\root\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00Z .txt [LtBlue]D:\\root\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00Z .txt [LtBlue]D:\\root\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]D:\\root\\files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00Z .sh [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00Z .gz [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00Z [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00Z .txt [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_show_utc(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_start_header_and_utc_on_git_bash() {
let expected = "\
Start 01-Jan-2023 00:00:00Z
--------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00Z .sh [LtBlue]/d/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/d/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/d/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00Z .sh [LtBlue]/d/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00Z .txt [LtBlue]/d/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00Z .txt [LtBlue]/d/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00Z .txt [LtBlue]/d/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/d/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00Z .sh [LtBlue]/d/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00Z .gz [LtBlue]/d/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00Z [LtBlue]/d/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/d/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00Z .txt [LtBlue]/d/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_show_utc(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_absolute_paths_with_start_header_and_utc_on_linux() {
let expected = "\
Start 01-Jan-2023 00:00:00Z
--------------------------------------
-rwxr--r-- 10 01-Nov-2023 00:00:00Z .sh [LtBlue]/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00Z .sh [LtBlue]/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00Z .txt [LtBlue]/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00Z .txt [LtBlue]/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00Z .txt [LtBlue]/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00Z .sh [LtBlue]/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00Z .gz [LtBlue]/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00Z [LtBlue]/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00Z [LtBlue]/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00Z .txt [LtBlue]/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_filter_recent(RecentKind::Year(1))
.with_show_utc(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_total_footer_on_windows() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
-----------------------------------------
Total 1,279 9 files 4 directories
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_show_total(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_total_footer_on_git_bash() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
-----------------------------------------
Total 1,279 9 files 4 directories
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_show_total(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_relative_paths_with_total_footer_on_linux() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
-----------------------------------------
Total 1,279 9 files 4 directories
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_show_total(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_total_footer_on_windows() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]D:\\root\\[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\colours\\[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]D:\\root\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
-----------------------------------------
Total 1,279 9 files 4 directories
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_show_total(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_total_footer_on_git_bash() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]/d/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]/d/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]/d/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]/d/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]/d/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]/d/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/d/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]/d/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
-----------------------------------------
Total 1,279 9 files 4 directories
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_show_total(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_absolute_paths_with_total_footer_on_linux() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtBlue]/root/[Reset][LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/colours/[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]/root/files/colours/[Reset]red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/numbers/[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]/root/files/numbers/one two/[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
-----------------------------------------
Total 1,279 9 files 4 directories
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_show_total(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_pretty_fields_on_windows() {
let expected = "\
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\colours\\[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files\\colours\\[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files\\colours\\[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files\\numbers\\[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_pretty_fields_on_git_bash() {
let expected = "\
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_pretty_fields_on_linux() {
let expected = "\
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_pretty_fields_with_start_header_on_windows() {
let expected = "\
Start 1 year
----------------------------
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\colours\\[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files\\colours\\[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files\\colours\\[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files\\numbers\\[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_pretty_fields_with_start_header_on_git_bash() {
let expected = "\
Start 1 year
----------------------------
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_pretty_fields_with_start_header_on_linux() {
let expected = "\
Start 1 year
----------------------------
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_filter_recent(RecentKind::Year(1))
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_pretty_fields_with_total_footer_on_windows() {
let expected = "\
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\colours\\[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files\\colours\\[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files\\colours\\[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files\\numbers\\[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
----------------------------
Total 1 KB 9 files 4 directories
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_show_total(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_pretty_fields_with_total_footer_on_git_bash() {
let expected = "\
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
----------------------------
Total 1 KB 9 files 4 directories
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_show_total(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_pretty_fields_with_total_footer_on_linux() {
let expected = "\
-rwxr--r-- 10 B 2 month .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
----------------------------
Total 1 KB 9 files 4 directories
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_pretty(true)
.with_show_total(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_version_numbers_on_windows() {
let expected = "\
-rwxr--r-- 999 01-Jan-2024 00:00:00 12.3.4.0 .exe [LtGreen]binary.exe[Reset]
-rwxr--r-- 999 01-Jan-2024 00:00:00 5.67.89.0 .dll [LtGreen]library.dll[Reset]
-rw-r--r-- 999 01-Jan-2024 00:00:00 .txt readme.txt
";
let files = create_files_with_version();
let total = create_total(&files);
let config = Config::default()
.with_win_ver(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_version_numbers_on_git_bash() {
let expected = "\
-rwxr--r-- 999 01-Jan-2024 00:00:00 12.3.4.0 .exe [LtGreen]binary.exe[Reset]
-rwxr--r-- 999 01-Jan-2024 00:00:00 5.67.89.0 .dll [LtGreen]library.dll[Reset]
-rw-r--r-- 999 01-Jan-2024 00:00:00 .txt readme.txt
";
let files = create_files_with_version();
let total = create_total(&files);
let config = Config::default()
.with_win_ver(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_version_numbers_on_linux() {
let expected = "\
-rwxr--r-- 999 01-Jan-2024 00:00:00 12.3.4.0 .exe [LtGreen]binary.exe[Reset]
-rwxr--r-- 999 01-Jan-2024 00:00:00 5.67.89.0 .dll [LtGreen]library.dll[Reset]
-rw-r--r-- 999 01-Jan-2024 00:00:00 .txt readme.txt
";
let files = create_files_with_version();
let total = create_total(&files);
let config = Config::default()
.with_win_ver(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_no_attributes_on_windows() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files\\[Reset]
[LtBlue]files\\colours\\[Reset]
[LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]files\\colours\\[Reset]blue.txt
[LtBlue]files\\colours\\[Reset]green.txt
[LtBlue]files\\colours\\[Reset]red.txt
[LtBlue]files\\numbers\\[Reset]
[LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
[LtBlue]files\\numbers\\one two\\[Reset]
[LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_no_attributes_on_git_bash() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files/[Reset]
[LtBlue]files/colours/[Reset]
[LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]files/colours/[Reset]blue.txt
[LtBlue]files/colours/[Reset]green.txt
[LtBlue]files/colours/[Reset]red.txt
[LtBlue]files/numbers/[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]files/numbers/one two/[Reset]
[LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_relative_paths_no_attributes_on_linux() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files/[Reset]
[LtBlue]files/colours/[Reset]
[LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]files/colours/[Reset]blue.txt
[LtBlue]files/colours/[Reset]green.txt
[LtBlue]files/colours/[Reset]red.txt
[LtBlue]files/numbers/[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]files/numbers/one two/[Reset]
[LtBlue]files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_no_attributes_on_windows() {
let expected = "\
[LtBlue]D:\\root\\[Reset][LtGreen]find.sh[Reset]
[LtBlue]D:\\root\\files\\[Reset]
[LtBlue]D:\\root\\files\\colours\\[Reset]
[LtBlue]D:\\root\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]D:\\root\\files\\colours\\[Reset]blue.txt
[LtBlue]D:\\root\\files\\colours\\[Reset]green.txt
[LtBlue]D:\\root\\files\\colours\\[Reset]red.txt
[LtBlue]D:\\root\\files\\numbers\\[Reset]
[LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
[LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]
[LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_no_attributes_on_git_bash() {
let expected = "\
[LtBlue]/d/root/[Reset][LtGreen]find.sh[Reset]
[LtBlue]/d/root/files/[Reset]
[LtBlue]/d/root/files/colours/[Reset]
[LtBlue]/d/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/d/root/files/colours/[Reset]blue.txt
[LtBlue]/d/root/files/colours/[Reset]green.txt
[LtBlue]/d/root/files/colours/[Reset]red.txt
[LtBlue]/d/root/files/numbers/[Reset]
[LtBlue]/d/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]/d/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]/d/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]/d/root/files/numbers/one two/[Reset]
[LtBlue]/d/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_absolute_paths_no_attributes_on_linux() {
let expected = "\
[LtBlue]/root/[Reset][LtGreen]find.sh[Reset]
[LtBlue]/root/files/[Reset]
[LtBlue]/root/files/colours/[Reset]
[LtBlue]/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/root/files/colours/[Reset]blue.txt
[LtBlue]/root/files/colours/[Reset]green.txt
[LtBlue]/root/files/colours/[Reset]red.txt
[LtBlue]/root/files/numbers/[Reset]
[LtBlue]/root/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]/root/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]/root/files/numbers/one two/[Reset]
[LtBlue]/root/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_escaping_on_windows() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files\\[Reset]
[LtBlue]files\\colours\\[Reset]
[LtBlue]files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]files\\colours\\[Reset]blue.txt
[LtBlue]files\\colours\\[Reset]green.txt
[LtBlue]files\\colours\\[Reset]red.txt
[LtBlue]files\\numbers\\[Reset]
[LtBlue]files\\numbers\\[Reset][LtCyan]count.sh[Reset]
[LtBlue]files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]files\\numbers\\[Reset][LtCyan]ordinals[Reset]
[LtBlue]files\\numbers\\one two\\[Reset]
[LtBlue]files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_escape_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_with_escaping_on_git_bash() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files/[Reset]
[LtBlue]files/colours/[Reset]
[LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]files/colours/[Reset]blue.txt
[LtBlue]files/colours/[Reset]green.txt
[LtBlue]files/colours/[Reset]red.txt
[LtBlue]files/numbers/[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]files/numbers/one\\ two/[Reset]
[LtBlue]files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_escape_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_relative_paths_with_escaping_on_linux() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files/[Reset]
[LtBlue]files/colours/[Reset]
[LtBlue]files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]files/colours/[Reset]blue.txt
[LtBlue]files/colours/[Reset]green.txt
[LtBlue]files/colours/[Reset]red.txt
[LtBlue]files/numbers/[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]files/numbers/one\\ two/[Reset]
[LtBlue]files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_escape_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_escaping_on_windows() {
let expected = "\
[LtBlue]D:\\root\\[Reset][LtGreen]find.sh[Reset]
[LtBlue]D:\\root\\files\\[Reset]
[LtBlue]D:\\root\\files\\colours\\[Reset]
[LtBlue]D:\\root\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]D:\\root\\files\\colours\\[Reset]blue.txt
[LtBlue]D:\\root\\files\\colours\\[Reset]green.txt
[LtBlue]D:\\root\\files\\colours\\[Reset]red.txt
[LtBlue]D:\\root\\files\\numbers\\[Reset]
[LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]count.sh[Reset]
[LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]D:\\root\\files\\numbers\\[Reset][LtCyan]ordinals[Reset]
[LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]
[LtBlue]D:\\root\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_escape_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_with_escaping_on_git_bash() {
let expected = "\
[LtBlue]/d/root/[Reset][LtGreen]find.sh[Reset]
[LtBlue]/d/root/files/[Reset]
[LtBlue]/d/root/files/colours/[Reset]
[LtBlue]/d/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/d/root/files/colours/[Reset]blue.txt
[LtBlue]/d/root/files/colours/[Reset]green.txt
[LtBlue]/d/root/files/colours/[Reset]red.txt
[LtBlue]/d/root/files/numbers/[Reset]
[LtBlue]/d/root/files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]/d/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]/d/root/files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]/d/root/files/numbers/one\\ two/[Reset]
[LtBlue]/d/root/files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_escape_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_absolute_paths_with_escaping_on_linux() {
let expected = "\
[LtBlue]/root/[Reset][LtGreen]find.sh[Reset]
[LtBlue]/root/files/[Reset]
[LtBlue]/root/files/colours/[Reset]
[LtBlue]/root/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/root/files/colours/[Reset]blue.txt
[LtBlue]/root/files/colours/[Reset]green.txt
[LtBlue]/root/files/colours/[Reset]red.txt
[LtBlue]/root/files/numbers/[Reset]
[LtBlue]/root/files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]/root/files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]/root/files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]/root/files/numbers/one\\ two/[Reset]
[LtBlue]/root/files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_only_path(true)
.with_escape_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_sorted_by_name_on_windows() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]files\\colours[Reset])
blue.txt ([LtBlue]files\\colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[LtGreen]find.sh[Reset]
[LtCyan]googolplex.gz[Reset] ([LtBlue]files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]files\\colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
red.txt ([LtBlue]files\\colours[Reset])
\"three\" 'four'.txt ([LtBlue]files\\numbers\\one two[Reset])
";
let files = create_files_by_name("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_order_name(true)
.with_only_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_relative_paths_sorted_by_name_on_git_bash() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]files/colours[Reset])
blue.txt ([LtBlue]files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtGreen]find.sh[Reset]
[LtCyan]googolplex.gz[Reset] ([LtBlue]files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]files/numbers/one two[Reset])
";
let files = create_files_by_name("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_order_name(true)
.with_only_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_relative_paths_sorted_by_name_on_linux() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]files/colours[Reset])
blue.txt ([LtBlue]files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtGreen]find.sh[Reset]
[LtCyan]googolplex.gz[Reset] ([LtBlue]files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]files/numbers/one two[Reset])
";
let files = create_files_by_name("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_order_name(true)
.with_only_path(true)
.with_abs_path(false);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_sorted_by_name_on_windows() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]D:\\root\\files\\colours[Reset])
blue.txt ([LtBlue]D:\\root\\files\\colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]D:\\root\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[LtGreen]find.sh[Reset] ([LtBlue]D:\\root[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]D:\\root\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]D:\\root\\files\\colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]D:\\root\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
red.txt ([LtBlue]D:\\root\\files\\colours[Reset])
\"three\" 'four'.txt ([LtBlue]D:\\root\\files\\numbers\\one two[Reset])
";
let files = create_files_by_name("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_order_name(true)
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_absolute_paths_sorted_by_name_on_git_bash() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]/d/root/files/colours[Reset])
blue.txt ([LtBlue]/d/root/files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]/d/root/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtGreen]find.sh[Reset] ([LtBlue]/d/root[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]/d/root/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]/d/root/files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]/d/root/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]/d/root/files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]/d/root/files/numbers/one two[Reset])
";
let files = create_files_by_name("D:", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_order_name(true)
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_absolute_paths_sorted_by_name_on_linux() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]/root/files/colours[Reset])
blue.txt ([LtBlue]/root/files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]/root/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtGreen]find.sh[Reset] ([LtBlue]/root[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]/root/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]/root/files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]/root/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]/root/files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]/root/files/numbers/one two[Reset])
";
let files = create_files_by_name("", "/root", "");
let total = create_total(&files);
let config = Config::default()
.with_order_name(true)
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_indented_paths_with_attributes_on_windows() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let total = create_total(&files);
let config = Config::default()
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_indented_paths_with_attributes_on_git_bash() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let total = create_total(&files);
let config = Config::default()
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_indented_paths_with_attributes_on_linux() {
let expected = "\
-rwxr--r-- 10 01-Nov-2023 00:00:00 .sh [LtGreen]find.sh[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]files[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
-rwxr--r-- 20 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
-rw-r--r-- 40 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
-rw-r--r-- 50 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
lrwxr--r-- 60 01-Jun-2023 00:00:00 .sh [LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 01-May-2023 00:00:00 .gz [LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
-rw-r--r-- 70 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("", "/root", "../..");
let total = create_total(&files);
let config = Config::default()
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_indented_paths_no_attributes_on_windows() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files[Reset]
[LtBlue]+-[Reset] [LtBlue]colours[Reset]
[LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
[LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
[LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
[LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
[LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
[LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
[LtBlue]\\-[Reset] [LtBlue]one two[Reset]
[LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let total = create_total(&files);
let config = Config::default()
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
#[test]
#[cfg(windows)]
fn test_prints_indented_paths_no_attributes_on_git_bash() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files[Reset]
[LtBlue]+-[Reset] [LtBlue]colours[Reset]
[LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
[LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
[LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
[LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
[LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
[LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]\\-[Reset] [LtBlue]one two[Reset]
[LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let total = create_total(&files);
let config = Config::default()
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, true, &files, &total));
}
#[test]
#[cfg(not(windows))]
fn test_prints_indented_paths_no_attributes_on_linux() {
let expected = "\
[LtGreen]find.sh[Reset]
[LtBlue]files[Reset]
[LtBlue]+-[Reset] [LtBlue]colours[Reset]
[LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
[LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
[LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
[LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
[LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
[LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]\\-[Reset] [LtBlue]one two[Reset]
[LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("", "/root", "../..");
let total = create_total(&files);
let config = Config::default()
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
assert_eq!(expected, wrap_files(&config, false, &files, &total));
}
fn wrap_mode(file_type: FileKind, file_mode: u32) -> String {
let config = Config::default();
return wrap_function(&config, false, |p| p.print_mode(file_type, file_mode));
}
fn wrap_size(config: &Config, file_size: u64, size_width: usize) -> String {
return wrap_function(&config, false, |p| p.print_size(file_size, size_width));
}
fn wrap_time(config: &Config, year: i32, month: u32, day: u32, hour: u32, minute: u32, second: u32) -> String {
let time = Utc.with_ymd_and_hms(year, month, day, hour, minute, second).unwrap();
return wrap_function(&config, false, |p| p.print_time(&time, &Utc, true));
}
fn wrap_version(file_ver: Option<&str>, ver_width: usize) -> String {
let config = Config::default();
let file_ver = file_ver.map(str::to_string);
return wrap_function(&config, false, |p| p.print_version(&file_ver, ver_width))
}
fn wrap_ext(file_ext: &str, ext_width: usize) -> String {
let config = Config::default();
return wrap_function(&config, false, |p| p.print_ext(file_ext, ext_width));
}
fn wrap_total(num_files: usize, num_dirs: usize) -> String {
let config = Config::default();
let mut total = Total::new(None);
total.num_files = num_files;
total.num_dirs = num_dirs;
return wrap_function(&config, false, |p| p.print_summary(&total));
}
fn wrap_files(config: &Config, git_bash: bool, files: &Vec<File>, total: &Total) -> String {
return wrap_function(config, git_bash, |p| p.print_files(files, total, &Utc));
}
fn wrap_function<F>(config: &Config, git_bash: bool, func: F) -> String
where F: FnOnce(&mut Printer<BufferWrapper>) -> MyResult<()>
{
unsafe {
let mut buffer = String::new();
let writer = BufferWrapper::new(buffer.as_mut_vec());
let colors = Some(String::from("*.gz=01;31:*.png=01;35"));
let colors = ColorMap::new(colors);
let chars = IndentChars {
branching: '+',
terminating: '\\',
horizontal: '-',
vertical: '|',
};
let mut printer = Printer::new(
&config,
&Utc,
writer,
colors,
chars,
git_bash,
);
func(&mut printer).unwrap();
return buffer;
}
}
fn create_files(drive: &str, abs_prefix: &str, rel_prefix: &str) -> Vec<File> {
let abs_prefix = drive.to_string() + abs_prefix;
let link_exec = drive.to_string() + "/etc/numbers/count.sh";
let link_file = drive.to_string() + "/etc/numbers/googolplex.gz";
let link_dir = drive.to_string() + "/etc/numbers/ordinals";
return vec![
create_file(&abs_prefix, rel_prefix, FileKind::File(true), 0o744, 10, 2023, 11, 01, "", "find", ".sh", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::Dir, 0o755, 0, 2023, 12, 31, "files", "", "", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::Dir, 0o755, 0, 2023, 12, 31, "files/colours", "", "", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::File(true), 0o744, 20, 2023, 10, 01, "files/colours", "alpha", ".sh", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::File(false), 0o644, 30, 2023, 09, 01, "files/colours", "blue", ".txt", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::File(false), 0o644, 40, 2023, 08, 01, "files/colours", "green", ".txt", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::File(false), 0o644, 50, 2023, 07, 01, "files/colours", "red", ".txt", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::Dir, 0o755, 0, 2023, 12, 31, "files/numbers", "", "", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::Link(true), 0o744, 60, 2023, 06, 01, "files/numbers", "count", ".sh", None, Some((&link_exec, FileKind::File(true)))),
create_file(&abs_prefix, rel_prefix, FileKind::Link(true), 0o644, 999, 2023, 05, 01, "files/numbers", "googolplex", ".gz", None, Some((&link_file, FileKind::File(false)))),
create_file(&abs_prefix, rel_prefix, FileKind::Link(true), 0o644, 0, 2023, 04, 01, "files/numbers", "ordinals", "", None, Some((&link_dir, FileKind::Dir))),
create_file(&abs_prefix, rel_prefix, FileKind::Dir, 0o755, 0, 2023, 12, 31, "files/numbers/one two", "", "", None, None),
create_file(&abs_prefix, rel_prefix, FileKind::File(false), 0o644, 70, 2023, 03, 01, "files/numbers/one two", "\"three\" 'four'", ".txt", None, None),
];
}
fn create_files_by_name(drive: &str, abs_prefix: &str, rel_prefix: &str) -> Vec<File> {
let files = create_files(drive, abs_prefix, rel_prefix);
let mut files = files.into_iter()
.filter(|file| file.file_type != FileKind::Dir)
.collect::<Vec<File>>();
files.sort_by(&compare_files_by_name);
return files;
}
fn compare_files_by_name(left: &File, right: &File) -> Ordering {
let left = left.file_name.trim_start_matches("\"");
let right = right.file_name.trim_start_matches("\"");
return left.cmp(&right);
}
fn create_files_with_version() -> Vec<File> {
return vec![
create_file("", "", FileKind::File(true), 0o744, 999, 2024, 01, 01, "", "binary", ".exe", Some("12.3.4.0"), None),
create_file("", "", FileKind::File(true), 0o744, 999, 2024, 01, 01, "", "library", ".dll", Some("5.67.89.0"), None),
create_file("", "", FileKind::File(false), 0o644, 999, 2024, 01, 01, "", "readme", ".txt", None, None),
];
}
fn create_file(
abs_prefix: &str,
rel_prefix: &str,
file_type: FileKind,
file_mode: u32,
file_size: u64,
year: i32,
month: u32,
day: u32,
file_dir: &str,
file_name: &str,
file_ext: &str,
file_ver: Option<&str>,
link_data: Option<(&str, FileKind)>,
) -> File {
let abs_dir = PathBuf::from(abs_prefix).join(file_dir).clean();
let rel_dir = PathBuf::from(rel_prefix).join(file_dir).clean();
let file_depth = PathBuf::from(file_dir).join(file_name).components().count();
let file_name = format!("{file_name}{file_ext}");
let file_ext = String::from(file_ext);
let file_time = Utc.with_ymd_and_hms(year, month, day, 0, 0, 0).unwrap();
let file_ver = file_ver.map(str::to_string);
let link_data = link_data.map(|(p, t)| (PathBuf::from(p).clean(), t));
return File {
abs_dir,
rel_dir,
file_depth,
file_name,
file_ext,
file_type,
file_mode,
file_size,
file_time,
file_ver,
link_data,
};
}
fn create_total(files: &Vec<File>) -> Total {
let start_time = Some(Utc.with_ymd_and_hms(2023, 1, 1, 0, 0, 0).unwrap());
let max_size = files.iter().map(|f| f.file_size).max().unwrap_or(0);
let total_size = files.iter().map(|f| f.file_size).sum();
let ver_width = files.iter().flat_map(|f| &f.file_ver).map(|v| v.len()).max().unwrap_or(0);
let ext_width = files.iter().map(|f| f.file_ext.len()).max().unwrap_or(0);
let num_files = files.iter().filter(|f| f.file_type != FileKind::Dir).count();
let num_dirs = files.iter().filter(|f| f.file_type == FileKind::Dir).count();
return Total {
start_time,
max_size,
total_size,
ver_width,
ext_width,
num_files,
num_dirs,
};
}
struct BufferWrapper<'a> {
buffer: &'a mut Vec<u8>,
}
impl<'a> BufferWrapper<'a> {
fn new(buffer: &'a mut Vec<u8>) -> BufferWrapper {
Self { buffer }
}
}
impl<'a> Write for BufferWrapper<'a> {
fn write(&mut self, buffer: &[u8]) -> io::Result<usize> {
self.buffer.write(buffer)
}
fn flush(&mut self) -> io::Result<()> {
Ok(())
}
}
impl<'a> WriteColor for BufferWrapper<'a> {
fn supports_color(&self) -> bool {
false
}
fn set_color(&mut self, spec: &ColorSpec) -> io::Result<()> {
let bold = if spec.bold() { "Lt" } else { "Dk" };
let fg = match spec.fg() {
Some(Color::Black) => "Black",
Some(Color::Blue) => "Blue",
Some(Color::Green) => "Green",
Some(Color::Red) => "Red",
Some(Color::Cyan) => "Cyan",
Some(Color::Magenta) => "Magenta",
Some(Color::Yellow) => "Yellow",
Some(Color::White) => "White",
Some(_) => "Other",
None => "None",
};
write!(&mut self.buffer, "[{bold}{fg}]")?;
return Ok(());
}
fn reset(&mut self) -> io::Result<()> {
write!(&mut self.buffer, "[Reset]")?;
return Ok(());
}
}
}