use crate::cli::file::{ExecKind, FileKind};
use crate::cli::recent::RecentKind;
use crate::config::Config;
use crate::error::MyResult;
use crate::fs::file::{File, Signature};
use crate::fs::total::Total;
use crate::git::flags::GitFlags;
use crate::regex;
use crate::util::calendar::Calendar;
use crate::util::color::ColorMap;
use chrono::*;
#[cfg(windows)]
use regex::Captures;
use std::collections::HashMap;
use std::ffi::OsStr;
use std::path::{Component, Path, PathBuf};
#[cfg(unix)]
use std::rc::Rc;
use std::{cmp, path};
use termcolor::WriteColor;
const MODE_WIDTH: usize = 10; const GIT_WIDTH: usize = 5; const TIME_WIDTH: usize = 24; const MONTH_WIDTH: usize = 8; const CRC_WIDTH: usize = 8; const SIG_WIDTH: usize = 13; 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,
}
#[allow(dead_code)]
pub struct Printer<'a, W: WriteColor> {
config: &'a Config,
calendar: Calendar,
writer: W,
counter: HashMap<PathBuf, isize>,
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,
) -> Self {
let calendar = Calendar::from_time(config.curr_time(), zone);
let counter = HashMap::new();
#[cfg(windows)]
let git_bash = git_bash && !config.win_path();
let separator = if git_bash { '/' } else { path::MAIN_SEPARATOR };
let separator_str = separator.to_string();
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, false)?;
self.print_newline()?;
}
} else {
let mode_width = measure_mode(self.config);
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, mode_width, 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, mode_width, size_width, time_width)?;
}
}
Ok(())
}
fn print_start<Tz: TimeZone>(
&mut self,
total: &Total,
zone: &Tz,
mode_width: usize,
size_width: usize,
time_width: usize,
) -> MyResult<()> {
let mut print = |label: &str, time: &DateTime<Utc>| -> MyResult<()> {
let mut combined_width = mode_width + PAD_WIDTH + size_width;
if self.config.filter_git().is_some() {
combined_width += 1 + GIT_WIDTH;
}
#[cfg(unix)]
if self.config.show_owner() {
combined_width += PAD_WIDTH + total.user_width + 1 + total.group_width;
}
self.print_text(label, combined_width)?;
self.print_time(time, zone, false)?;
writeln!(self.writer)?;
self.print_hyphens(combined_width + PAD_WIDTH + time_width)?;
Ok(())
};
match total.start_time {
RecentKind::None => (),
RecentKind::Before(time) => print("Before", &time)?,
RecentKind::After(time) => print("After", &time)?,
}
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, file.inner_depth)?;
self.print_git(file.git_flags)?;
#[cfg(unix)]
self.print_owner(&file.owner_user, &file.owner_group, total.user_width, total.group_width)?;
self.print_size(file.file_size, size_width)?;
self.print_time(&file.file_time, zone, true)?;
self.print_crc(file.file_crc)?;
self.print_sig(file.file_sig)?;
#[cfg(windows)]
self.print_version(&file.file_ver, total.ver_width)?;
self.print_ext(&file.file_ext, total.ext_width)?;
#[cfg(debug_assertions)]
self.print_debug(file.file_depth, file.inner_depth)?;
self.print_path(file, true)?;
writeln!(self.writer)?;
Ok(())
}
#[allow(unused_mut)]
fn print_total(
&mut self,
total: &Total,
mode_width: usize,
size_width: usize,
time_width: usize,
) -> MyResult<()> {
let mut combined_width = mode_width;
if self.config.filter_git().is_some() {
combined_width += 1 + GIT_WIDTH;
}
#[cfg(unix)]
if self.config.show_owner() {
combined_width += PAD_WIDTH + total.user_width + 1 + total.group_width;
}
self.print_hyphens(combined_width + PAD_WIDTH + size_width + PAD_WIDTH + time_width)?;
self.print_text("Total", combined_width)?;
self.print_size(total.total_size, size_width)?;
self.print_spaces(PAD_WIDTH + PAD_WIDTH + time_width)?;
if self.config.show_crc() {
self.print_spaces(PAD_WIDTH + CRC_WIDTH)?;
}
if self.config.show_sig() {
self.print_spaces(PAD_WIDTH + SIG_WIDTH)?;
}
if total.ext_width > 0 {
self.print_spaces(PAD_WIDTH + total.ext_width)?;
}
self.print_summary(total)?;
writeln!(self.writer)?;
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,
)?;
Ok(())
}
fn print_mode(
&mut self,
file_type: FileKind,
file_mode: u32,
inner_depth: Option<usize>,
) -> MyResult<()> {
if self.config.zip_expand() {
if inner_depth.is_some() {
write!(self.writer, "z")?;
} else {
write!(self.writer, "-")?;
}
}
match file_type {
FileKind::File(_) => write!(self.writer, "-")?,
FileKind::Dir => write!(self.writer, "d")?,
FileKind::Link(_) => write!(self.writer, "l")?,
FileKind::Block => write!(self.writer, "b")?,
FileKind::Char => write!(self.writer, "c")?,
FileKind::Pipe => write!(self.writer, "p")?,
FileKind::Socket => write!(self.writer, "s")?,
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, "-")?;
}
}
Ok(())
}
fn print_git(
&mut self,
git_flags: Option<GitFlags>,
) -> MyResult<()> {
if self.config.filter_git().is_some() {
if let Some(git_flags) = git_flags {
write!(self.writer, " ")?;
write!(self.writer, "{}", if git_flags.added { 'A' } else { '-' })?;
write!(self.writer, "{}", if git_flags.modified { 'M' } else { '-' })?;
write!(self.writer, "{}", if git_flags.renamed { 'R' } else { '-' })?;
write!(self.writer, "{}", if git_flags.untracked { 'U' } else { '-' })?;
write!(self.writer, "{}", if git_flags.ignored { 'I' } else { '-' })?;
} else {
write!(self.writer, " -----")?;
}
}
Ok(())
}
#[cfg(unix)]
fn print_owner(
&mut self,
owner_user: &Option<Rc<String>>,
owner_group: &Option<Rc<String>>,
user_width: usize,
group_width: usize,
) -> MyResult<()> {
if self.config.show_owner() {
self.print_spaces(PAD_WIDTH)?;
if let Some(user) = owner_user {
write!(self.writer, "{0:1$}", user, user_width + 1)?;
} else {
write!(self.writer, "{0:1$}", "-", user_width + 1)?;
}
if let Some(group) = owner_group {
write!(self.writer, "{0:1$}", group, group_width)?;
} else {
write!(self.writer, "{0:1$}", "-", group_width)?;
}
}
Ok(())
}
fn print_size(
&mut self,
file_size: u64,
size_width: usize,
) -> MyResult<()> {
self.print_spaces(PAD_WIDTH)?;
if self.config.show_precise() {
self.print_thousand(file_size, size_width)?;
} else {
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)?;
}
}
Ok(())
}
fn print_thousand(
&mut self,
file_size: u64,
size_width: usize,
) -> MyResult<()> {
if file_size >= 1000 {
self.print_thousand(file_size / 1000, cmp::max(size_width, 4) - 4)?;
write!(self.writer, ",{0:03}", file_size % 1000)?;
} else {
write!(self.writer, "{0:1$}", file_size, size_width)?;
}
Ok(())
}
fn print_time<Tz: TimeZone>(
&mut self,
file_time: &DateTime<Utc>,
zone: &Tz,
padding: bool,
) -> MyResult<()> {
self.print_spaces(PAD_WIDTH)?;
if self.config.show_precise() {
if file_time.timestamp() != 0 {
let file_time = file_time.with_timezone(zone);
let weekday = convert_weekday(file_time.weekday());
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, "{weekday} {day:02}-{month}-{year:04} {hour:02}:{minute:02}:{second:02}")?;
if self.config.show_utc() {
write!(self.writer, "Z")?;
}
} else {
write!(self.writer, "{0:-<1$}", "", TIME_WIDTH)?;
if self.config.show_utc() {
write!(self.writer, "-")?;
}
}
} else {
if file_time.timestamp() != 0 {
let recent = RecentKind::from_times(&file_time, self.config.curr_time(), &self.calendar, zone);
match recent {
RecentKind::None => {
write!(self.writer, " future")?;
if padding {
write!(self.writer, " ")?;
}
}
RecentKind::Before(period) => period.print_time(&mut self.writer, padding)?,
RecentKind::After(period) => period.print_time(&mut self.writer, padding)?,
}
} else {
write!(self.writer, "{0:-<1$}", "", MONTH_WIDTH)?;
}
}
Ok(())
}
fn print_crc(&mut self, file_crc: u32) -> MyResult<()> {
if self.config.show_crc() {
self.print_spaces(PAD_WIDTH)?;
write!(self.writer, "{:08x}", file_crc)?;
}
Ok(())
}
fn print_sig(&mut self, file_sig: Signature) -> MyResult<()> {
if self.config.show_sig() {
self.print_spaces(PAD_WIDTH)?;
for byte in file_sig {
write!(self.writer, "{:02x}", byte)?;
}
write!(self.writer, " ")?;
for byte in file_sig {
write!(self.writer, "{}", printable_char(byte))?;
}
}
Ok(())
}
#[cfg(windows)]
fn print_version(
&mut self,
file_ver: &Option<String>,
ver_width: usize,
) -> MyResult<()> {
if ver_width > 0 {
self.print_spaces(PAD_WIDTH)?;
if let Some(file_ver) = file_ver {
write!(self.writer, "{0:1$}", file_ver, ver_width)?;
} else {
self.print_spaces(ver_width)?;
}
}
Ok(())
}
fn print_ext(
&mut self,
file_ext: &str,
ext_width: usize,
) -> MyResult<()> {
if ext_width > 0 {
self.print_spaces(PAD_WIDTH)?;
write!(self.writer, "{0:1$}", file_ext, ext_width)?;
}
Ok(())
}
#[cfg(debug_assertions)]
fn print_debug(
&mut self,
file_depth: usize,
inner_depth: Option<usize>,
) -> MyResult<()> {
if self.config.show_debug() {
self.writer.set_color(&self.colors.debug_color)?;
if self.config.zip_expand() {
let inner_depth = inner_depth
.map(|depth| depth.to_string())
.unwrap_or_else(|| "-".to_string());
write!(self.writer, "[{}][{}]", file_depth, inner_depth)?;
} else {
write!(self.writer, "[{}]", file_depth)?;
}
self.writer.reset()?;
write!(self.writer, " ")?;
}
Ok(())
}
fn print_path(
&mut self,
file: &File,
padding: bool,
) -> MyResult<()> {
if padding {
self.print_spaces(PAD_WIDTH)?;
}
if self.config.show_indent() {
self.print_prefix(file)?;
if file.file_type == FileKind::Dir {
self.indent_dir(&file.rel_dir, file.inner_depth, file.file_type.dir_offset())?;
} 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());
if self.config.sort_name() {
self.print_name(&file.file_name, &file.file_ext, file.file_type)?;
self.print_dir(file_dir, file.inner_depth, file.file_type.dir_offset(), true)?;
self.print_link(&file.link_data)?;
} else {
self.print_dir(file_dir, file.inner_depth, file.file_type.dir_offset(), false)?;
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)?;
}
}
}
Ok(())
}
fn print_dir(
&mut self,
file_dir: &Path,
inner_depth: Option<usize>,
inner_offset: usize,
sort_name: bool,
) -> MyResult<()> {
if !is_trivial(file_dir) {
if sort_name {
write!(self.writer, " (")?;
self.iterate_dir(file_dir, inner_depth, inner_offset, false)?;
write!(self.writer, ")")?;
} else {
self.iterate_dir(file_dir, inner_depth, inner_offset, true)?;
}
}
Ok(())
}
fn iterate_dir(
&mut self,
file_dir: &Path,
inner_depth: Option<usize>,
inner_offset: usize,
trailing_slash: bool,
) -> MyResult<()> {
self.writer.set_color(&self.colors.dir_color)?;
let components = file_dir.components().into_iter().collect::<Vec<_>>();
let count = components.len();
for (index, component) in components.iter().enumerate() {
if let Some(text) = component.as_os_str().to_str() {
let color = inner_depth
.is_some_and(|depth| depth + inner_offset + index == count)
.then(|| get_extension(component))
.and_then(|ext| self.colors.find_color(ext));
if let Some(color) = color {
self.writer.set_color(color)?;
self.escape_dir(text)?;
self.writer.set_color(&self.colors.dir_color)?;
} else {
self.escape_dir(text)?;
}
if is_joinable(&component) {
if index + 1 < count || trailing_slash {
write!(self.writer, "{}", self.separator)?;
}
}
}
}
self.writer.reset()?;
Ok(())
}
fn indent_dir(
&mut self,
file_dir: &Path,
inner_depth: Option<usize>,
inner_offset: usize,
) -> MyResult<()> {
if let Some(component) = file_dir.components().last() {
if let Some(text) = component.as_os_str().to_str() {
let color = inner_depth
.is_some_and(|depth| depth + inner_offset == 1)
.then(|| get_extension(&component))
.and_then(|ext| self.colors.find_color(ext))
.unwrap_or(&self.colors.dir_color);
self.writer.set_color(color)?;
self.escape_dir(text)?;
self.writer.reset()?;
}
}
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}")?;
}
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}")?;
}
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 == ExecKind::User {
self.writer.set_color(&self.colors.exec_color)?;
self.escape_name(file_name)?;
self.writer.reset()?;
} else if exec == ExecKind::Other {
self.writer.set_color(&self.colors.exec_other)?;
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::Block => {
self.writer.set_color(&self.colors.block_color)?;
self.escape_name(file_name)?;
self.writer.reset()?;
}
FileKind::Char => {
self.writer.set_color(&self.colors.char_color)?;
self.escape_name(file_name)?;
self.writer.reset()?;
}
FileKind::Pipe => {
self.writer.set_color(&self.colors.pipe_color)?;
self.escape_name(file_name)?;
self.writer.reset()?;
}
FileKind::Socket => {
self.writer.set_color(&self.colors.socket_color)?;
self.escape_name(file_name)?;
self.writer.reset()?;
}
FileKind::Other => {
self.escape_name(file_name)?;
}
}
}
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}")?;
}
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}")?;
}
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() {
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, None, 0, false)?;
self.print_name(link_name, &link_ext, *link_type)?;
}
}
}
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 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, " ")?;
}
}
}
Ok(())
}
fn create_prefix(&mut self, file: &File) -> Vec<IndentToken> {
let mut tokens = Vec::new();
if let Some(mut path) = file.select_parent_for_indent() {
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();
tokens
}
fn print_text(&mut self, text: &str, width: usize) -> MyResult<()> {
write!(self.writer, "{0:<1$}", text, width)?;
Ok(())
}
fn print_spaces(&mut self, width: usize) -> MyResult<()> {
write!(self.writer, "{0:<1$}", "", width)?;
Ok(())
}
fn print_hyphens(&mut self, width: usize) -> MyResult<()> {
writeln!(self.writer, "{0:-<1$}", "", width)?;
Ok(())
}
fn print_newline(&mut self) -> MyResult<()> {
if self.config.null_path() {
write!(self.writer, "\x00")?;
} else {
writeln!(self.writer)?;
}
Ok(())
}
}
fn measure_mode(config: &Config) -> usize {
if config.zip_expand() {
MODE_WIDTH + 1
} else {
MODE_WIDTH
}
}
fn measure_size(config: &Config, size: u64) -> usize {
if config.show_precise() {
recurse_size(size)
} else {
6
}
}
fn recurse_size(size: u64) -> usize {
if size >= 1000 {
recurse_size(size / 1000) + 4
} else {
3
}
}
fn measure_time(config: &Config) -> usize {
if config.show_precise() {
if config.show_utc() {
TIME_WIDTH + 1 } else {
TIME_WIDTH
}
} else {
MONTH_WIDTH
}
}
fn convert_weekday(weekday: Weekday) -> &'static str {
match weekday {
Weekday::Mon => "Mon",
Weekday::Tue => "Tue",
Weekday::Wed => "Wed",
Weekday::Thu => "Thu",
Weekday::Fri => "Fri",
Weekday::Sat => "Sat",
Weekday::Sun => "Sun",
}
}
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",
_ => "???",
}
}
#[inline]
fn printable_char(byte: u8) -> char {
if byte >= 32 && byte <= 126 { byte as char } else { '.' }
}
fn is_trivial(file_dir: &Path) -> bool {
let file_dir = file_dir.to_str().unwrap_or_default();
file_dir.is_empty() || file_dir == "."
}
fn is_joinable(component: &Component) -> bool {
match component {
Component::Prefix(_) => false,
Component::RootDir => false,
Component::CurDir => true,
Component::ParentDir => true,
Component::Normal(_) => true,
}
}
fn get_extension<'a>(component: &'a Component) -> &'a str {
let component = component.as_os_str();
let (_, ext) = rsplit_file_at_dot(component);
ext.and_then(OsStr::to_str).unwrap_or_default()
}
fn rsplit_file_at_dot(file: &OsStr) -> (Option<&OsStr>, Option<&OsStr>) {
if file.as_encoded_bytes() == b".." {
(Some(file), None)
} else {
let mut iter = file.as_encoded_bytes().rsplitn(2, |b| *b == b'.');
let after = iter.next();
let before = iter.next();
if before == Some(b"") {
(Some(file), None)
} else {
unsafe {
let before = before.map(|s| OsStr::from_encoded_bytes_unchecked(s));
let after = after.map(|s| OsStr::from_encoded_bytes_unchecked(s));
(before, after)
}
}
}
}
#[cfg(test)]
mod tests {
use crate::cli::file::{ExecKind, FileKind};
use crate::cli::recent::{PeriodKind, RecentKind};
use crate::config::Config;
use crate::error::MyResult;
use crate::fs::file::File;
use crate::fs::total::Total;
use crate::git::flags::GitFlags;
use crate::printer::{measure_mode, measure_size, IndentChars, Printer};
use crate::util::color::ColorMap;
use crate::util::time::tests::{create_date, create_time};
use chrono::Utc;
use googletest::prelude::*;
use path_clean::PathClean;
use std::cmp::Ordering;
use std::io;
use std::io::Write;
use std::path::{Component, Path, PathBuf};
use termcolor::{Color, ColorSpec, WriteColor};
#[gtest]
fn test_measures_mode_no_expand() {
let config = Config::default()
.with_zip_expand(false);
expect_eq!(measure_mode(&config), 10);
}
#[gtest]
fn test_measures_mode_with_expand() {
let config = Config::default()
.with_zip_expand(true);
expect_eq!(measure_mode(&config), 11);
}
#[gtest]
fn test_prints_type_no_expand() {
expect_eq!(wrap_mode(false, None, 0o000, FileKind::File(ExecKind::None)), "----------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::File(ExecKind::User)), "----------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::File(ExecKind::Other)), "----------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Dir), "d---------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Link(false)), "l---------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Link(true)), "l---------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Block), "b---------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Char), "c---------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Pipe), "p---------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Socket), "s---------");
expect_eq!(wrap_mode(false, None, 0o000, FileKind::Other), "?---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::File(ExecKind::None)), "----------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::File(ExecKind::User)), "----------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::File(ExecKind::Other)), "----------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Dir), "d---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Link(false)), "l---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Link(true)), "l---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Block), "b---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Char), "c---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Pipe), "p---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Socket), "s---------");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::Other), "?---------");
}
#[gtest]
fn test_prints_type_with_expand() {
expect_eq!(wrap_mode(true, None, 0o000, FileKind::File(ExecKind::None)), "-----------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::File(ExecKind::User)), "-----------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::File(ExecKind::Other)), "-----------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Dir), "-d---------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Link(false)), "-l---------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Link(true)), "-l---------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Block), "-b---------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Char), "-c---------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Pipe), "-p---------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Socket), "-s---------");
expect_eq!(wrap_mode(true, None, 0o000, FileKind::Other), "-?---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::File(ExecKind::None)), "z----------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::File(ExecKind::User)), "z----------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::File(ExecKind::Other)), "z----------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Dir), "zd---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Link(false)), "zl---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Link(true)), "zl---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Block), "zb---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Char), "zc---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Pipe), "zp---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Socket), "zs---------");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::Other), "z?---------");
}
#[gtest]
fn test_prints_mode_no_expand() {
expect_eq!(wrap_mode(false, None, 0o000, FileKind::File(ExecKind::None)), "----------");
expect_eq!(wrap_mode(false, None, 0o400, FileKind::File(ExecKind::None)), "-r--------");
expect_eq!(wrap_mode(false, None, 0o200, FileKind::File(ExecKind::None)), "--w-------");
expect_eq!(wrap_mode(false, None, 0o100, FileKind::File(ExecKind::None)), "---x------");
expect_eq!(wrap_mode(false, None, 0o040, FileKind::File(ExecKind::None)), "----r-----");
expect_eq!(wrap_mode(false, None, 0o020, FileKind::File(ExecKind::None)), "-----w----");
expect_eq!(wrap_mode(false, None, 0o010, FileKind::File(ExecKind::None)), "------x---");
expect_eq!(wrap_mode(false, None, 0o004, FileKind::File(ExecKind::None)), "-------r--");
expect_eq!(wrap_mode(false, None, 0o002, FileKind::File(ExecKind::None)), "--------w-");
expect_eq!(wrap_mode(false, None, 0o001, FileKind::File(ExecKind::None)), "---------x");
expect_eq!(wrap_mode(false, None, 0o777, FileKind::File(ExecKind::None)), "-rwxrwxrwx");
expect_eq!(wrap_mode(false, Some(0), 0o000, FileKind::File(ExecKind::None)), "----------");
expect_eq!(wrap_mode(false, Some(0), 0o400, FileKind::File(ExecKind::None)), "-r--------");
expect_eq!(wrap_mode(false, Some(0), 0o200, FileKind::File(ExecKind::None)), "--w-------");
expect_eq!(wrap_mode(false, Some(0), 0o100, FileKind::File(ExecKind::None)), "---x------");
expect_eq!(wrap_mode(false, Some(0), 0o040, FileKind::File(ExecKind::None)), "----r-----");
expect_eq!(wrap_mode(false, Some(0), 0o020, FileKind::File(ExecKind::None)), "-----w----");
expect_eq!(wrap_mode(false, Some(0), 0o010, FileKind::File(ExecKind::None)), "------x---");
expect_eq!(wrap_mode(false, Some(0), 0o004, FileKind::File(ExecKind::None)), "-------r--");
expect_eq!(wrap_mode(false, Some(0), 0o002, FileKind::File(ExecKind::None)), "--------w-");
expect_eq!(wrap_mode(false, Some(0), 0o001, FileKind::File(ExecKind::None)), "---------x");
expect_eq!(wrap_mode(false, Some(0), 0o777, FileKind::File(ExecKind::None)), "-rwxrwxrwx");
}
#[gtest]
fn test_prints_mode_with_expand() {
expect_eq!(wrap_mode(true, None, 0o000, FileKind::File(ExecKind::None)), "-----------");
expect_eq!(wrap_mode(true, None, 0o400, FileKind::File(ExecKind::None)), "--r--------");
expect_eq!(wrap_mode(true, None, 0o200, FileKind::File(ExecKind::None)), "---w-------");
expect_eq!(wrap_mode(true, None, 0o100, FileKind::File(ExecKind::None)), "----x------");
expect_eq!(wrap_mode(true, None, 0o040, FileKind::File(ExecKind::None)), "-----r-----");
expect_eq!(wrap_mode(true, None, 0o020, FileKind::File(ExecKind::None)), "------w----");
expect_eq!(wrap_mode(true, None, 0o010, FileKind::File(ExecKind::None)), "-------x---");
expect_eq!(wrap_mode(true, None, 0o004, FileKind::File(ExecKind::None)), "--------r--");
expect_eq!(wrap_mode(true, None, 0o002, FileKind::File(ExecKind::None)), "---------w-");
expect_eq!(wrap_mode(true, None, 0o001, FileKind::File(ExecKind::None)), "----------x");
expect_eq!(wrap_mode(true, None, 0o777, FileKind::File(ExecKind::None)), "--rwxrwxrwx");
expect_eq!(wrap_mode(true, Some(0), 0o000, FileKind::File(ExecKind::None)), "z----------");
expect_eq!(wrap_mode(true, Some(0), 0o400, FileKind::File(ExecKind::None)), "z-r--------");
expect_eq!(wrap_mode(true, Some(0), 0o200, FileKind::File(ExecKind::None)), "z--w-------");
expect_eq!(wrap_mode(true, Some(0), 0o100, FileKind::File(ExecKind::None)), "z---x------");
expect_eq!(wrap_mode(true, Some(0), 0o040, FileKind::File(ExecKind::None)), "z----r-----");
expect_eq!(wrap_mode(true, Some(0), 0o020, FileKind::File(ExecKind::None)), "z-----w----");
expect_eq!(wrap_mode(true, Some(0), 0o010, FileKind::File(ExecKind::None)), "z------x---");
expect_eq!(wrap_mode(true, Some(0), 0o004, FileKind::File(ExecKind::None)), "z-------r--");
expect_eq!(wrap_mode(true, Some(0), 0o002, FileKind::File(ExecKind::None)), "z--------w-");
expect_eq!(wrap_mode(true, Some(0), 0o001, FileKind::File(ExecKind::None)), "z---------x");
expect_eq!(wrap_mode(true, Some(0), 0o777, FileKind::File(ExecKind::None)), "z-rwxrwxrwx");
}
#[gtest]
fn test_measures_size_for_integer() {
let config = Config::default()
.with_show_precise(true);
expect_eq!(measure_size(&config, 0), 3);
expect_eq!(measure_size(&config, 999), 3);
expect_eq!(measure_size(&config, 1_000), 7);
expect_eq!(measure_size(&config, 999_999), 7);
expect_eq!(measure_size(&config, 1_000_000), 11);
expect_eq!(measure_size(&config, 999_999_999), 11);
}
#[gtest]
fn test_measures_size_for_si_units() {
let config = Config::default()
.with_show_precise(false);
expect_eq!(measure_size(&config, 0), 6);
expect_eq!(measure_size(&config, 999), 6);
expect_eq!(measure_size(&config, 1_000), 6);
expect_eq!(measure_size(&config, 999_999), 6);
expect_eq!(measure_size(&config, 1_000_000), 6);
expect_eq!(measure_size(&config, 999_999_999), 6);
}
#[gtest]
fn test_prints_unpadded_size_as_integer() {
let config = Config::default()
.with_show_precise(true);
expect_eq!(wrap_size(&config, 0, 0), " 0");
expect_eq!(wrap_size(&config, 9, 0), " 9");
expect_eq!(wrap_size(&config, 10, 0), " 10");
expect_eq!(wrap_size(&config, 99, 0), " 99");
expect_eq!(wrap_size(&config, 100, 0), " 100");
expect_eq!(wrap_size(&config, 999, 0), " 999");
expect_eq!(wrap_size(&config, 1_000, 0), " 1,000");
expect_eq!(wrap_size(&config, 9_999, 0), " 9,999");
expect_eq!(wrap_size(&config, 10_000, 0), " 10,000");
expect_eq!(wrap_size(&config, 99_999, 0), " 99,999");
expect_eq!(wrap_size(&config, 100_000, 0), " 100,000");
expect_eq!(wrap_size(&config, 999_999, 0), " 999,999");
expect_eq!(wrap_size(&config, 1_000_000, 0), " 1,000,000");
expect_eq!(wrap_size(&config, 9_999_999, 0), " 9,999,999");
expect_eq!(wrap_size(&config, 10_000_000, 0), " 10,000,000");
expect_eq!(wrap_size(&config, 99_999_999, 0), " 99,999,999");
expect_eq!(wrap_size(&config, 100_000_000, 0), " 100,000,000");
expect_eq!(wrap_size(&config, 999_999_999, 0), " 999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000, 0), " 1,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999, 0), " 9,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000, 0), " 10,000,000,000");
expect_eq!(wrap_size(&config, 99_999_999_999, 0), " 99,999,999,999");
expect_eq!(wrap_size(&config, 100_000_000_000, 0), " 100,000,000,000");
expect_eq!(wrap_size(&config, 999_999_999_999, 0), " 999,999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000_000, 0), " 1,000,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999_999, 0), " 9,999,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000_000, 0), " 10,000,000,000,000");
expect_eq!(wrap_size(&config, 99_999_999_999_999, 0), " 99,999,999,999,999");
expect_eq!(wrap_size(&config, 100_000_000_000_000, 0), " 100,000,000,000,000");
expect_eq!(wrap_size(&config, 999_999_999_999_999, 0), " 999,999,999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000_000_000, 0), " 1,000,000,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999_999_999, 0), " 9,999,999,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000_000_000, 0), " 10,000,000,000,000,000");
expect_eq!(wrap_size(&config, 99_999_999_999_999_999, 0), " 99,999,999,999,999,999");
expect_eq!(wrap_size(&config, 100_000_000_000_000_000, 0), " 100,000,000,000,000,000");
expect_eq!(wrap_size(&config, 999_999_999_999_999_999, 0), " 999,999,999,999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000_000_000_000, 0), " 1,000,000,000,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999_999_999_999, 0), " 9,999,999,999,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000_000_000_000, 0), " 10,000,000,000,000,000,000");
}
#[gtest]
fn test_prints_padded_size_as_integer() {
let config = Config::default()
.with_show_precise(true);
expect_eq!(wrap_size(&config, 0, 26), " 0");
expect_eq!(wrap_size(&config, 9, 26), " 9");
expect_eq!(wrap_size(&config, 10, 26), " 10");
expect_eq!(wrap_size(&config, 99, 26), " 99");
expect_eq!(wrap_size(&config, 100, 26), " 100");
expect_eq!(wrap_size(&config, 999, 26), " 999");
expect_eq!(wrap_size(&config, 1_000, 26), " 1,000");
expect_eq!(wrap_size(&config, 9_999, 26), " 9,999");
expect_eq!(wrap_size(&config, 10_000, 26), " 10,000");
expect_eq!(wrap_size(&config, 99_999, 26), " 99,999");
expect_eq!(wrap_size(&config, 100_000, 26), " 100,000");
expect_eq!(wrap_size(&config, 999_999, 26), " 999,999");
expect_eq!(wrap_size(&config, 1_000_000, 26), " 1,000,000");
expect_eq!(wrap_size(&config, 9_999_999, 26), " 9,999,999");
expect_eq!(wrap_size(&config, 10_000_000, 26), " 10,000,000");
expect_eq!(wrap_size(&config, 99_999_999, 26), " 99,999,999");
expect_eq!(wrap_size(&config, 100_000_000, 26), " 100,000,000");
expect_eq!(wrap_size(&config, 999_999_999, 26), " 999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000, 26), " 1,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999, 26), " 9,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000, 26), " 10,000,000,000");
expect_eq!(wrap_size(&config, 99_999_999_999, 26), " 99,999,999,999");
expect_eq!(wrap_size(&config, 100_000_000_000, 26), " 100,000,000,000");
expect_eq!(wrap_size(&config, 999_999_999_999, 26), " 999,999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000_000, 26), " 1,000,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999_999, 26), " 9,999,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000_000, 26), " 10,000,000,000,000");
expect_eq!(wrap_size(&config, 99_999_999_999_999, 26), " 99,999,999,999,999");
expect_eq!(wrap_size(&config, 100_000_000_000_000, 26), " 100,000,000,000,000");
expect_eq!(wrap_size(&config, 999_999_999_999_999, 26), " 999,999,999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000_000_000, 26), " 1,000,000,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999_999_999, 26), " 9,999,999,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000_000_000, 26), " 10,000,000,000,000,000");
expect_eq!(wrap_size(&config, 99_999_999_999_999_999, 26), " 99,999,999,999,999,999");
expect_eq!(wrap_size(&config, 100_000_000_000_000_000, 26), " 100,000,000,000,000,000");
expect_eq!(wrap_size(&config, 999_999_999_999_999_999, 26), " 999,999,999,999,999,999");
expect_eq!(wrap_size(&config, 1_000_000_000_000_000_000, 26), " 1,000,000,000,000,000,000");
expect_eq!(wrap_size(&config, 9_999_999_999_999_999_999, 26), " 9,999,999,999,999,999,999");
expect_eq!(wrap_size(&config, 10_000_000_000_000_000_000, 26), " 10,000,000,000,000,000,000");
}
#[gtest]
fn test_prints_unpadded_size_in_si_units() {
let config = Config::default()
.with_show_precise(false);
expect_eq!(wrap_size(&config, 0, 0), " 0 B ");
expect_eq!(wrap_size(&config, 9, 0), " 9 B ");
expect_eq!(wrap_size(&config, 10, 0), " 10 B ");
expect_eq!(wrap_size(&config, 99, 0), " 99 B ");
expect_eq!(wrap_size(&config, 100, 0), " 100 B ");
expect_eq!(wrap_size(&config, 999, 0), " 999 B ");
expect_eq!(wrap_size(&config, 1_000, 0), " 1 KB");
expect_eq!(wrap_size(&config, 9_999, 0), " 9 KB");
expect_eq!(wrap_size(&config, 10_000, 0), " 10 KB");
expect_eq!(wrap_size(&config, 99_999, 0), " 99 KB");
expect_eq!(wrap_size(&config, 100_000, 0), " 100 KB");
expect_eq!(wrap_size(&config, 999_999, 0), " 999 KB");
expect_eq!(wrap_size(&config, 1_000_000, 0), " 1 MB");
expect_eq!(wrap_size(&config, 9_999_999, 0), " 9 MB");
expect_eq!(wrap_size(&config, 10_000_000, 0), " 10 MB");
expect_eq!(wrap_size(&config, 99_999_999, 0), " 99 MB");
expect_eq!(wrap_size(&config, 100_000_000, 0), " 100 MB");
expect_eq!(wrap_size(&config, 999_999_999, 0), " 999 MB");
expect_eq!(wrap_size(&config, 1_000_000_000, 0), " 1 GB");
expect_eq!(wrap_size(&config, 9_999_999_999, 0), " 9 GB");
expect_eq!(wrap_size(&config, 10_000_000_000, 0), " 10 GB");
expect_eq!(wrap_size(&config, 99_999_999_999, 0), " 99 GB");
expect_eq!(wrap_size(&config, 100_000_000_000, 0), " 100 GB");
expect_eq!(wrap_size(&config, 999_999_999_999, 0), " 999 GB");
expect_eq!(wrap_size(&config, 1_000_000_000_000, 0), " 1 TB");
expect_eq!(wrap_size(&config, 9_999_999_999_999, 0), " 9 TB");
expect_eq!(wrap_size(&config, 10_000_000_000_000, 0), " 10 TB");
expect_eq!(wrap_size(&config, 99_999_999_999_999, 0), " 99 TB");
expect_eq!(wrap_size(&config, 100_000_000_000_000, 0), " 100 TB");
expect_eq!(wrap_size(&config, 999_999_999_999_999, 0), " 999 TB");
expect_eq!(wrap_size(&config, 1_000_000_000_000_000, 0), " 1 PB");
expect_eq!(wrap_size(&config, 9_999_999_999_999_999, 0), " 9 PB");
expect_eq!(wrap_size(&config, 10_000_000_000_000_000, 0), " 10 PB");
expect_eq!(wrap_size(&config, 99_999_999_999_999_999, 0), " 99 PB");
expect_eq!(wrap_size(&config, 100_000_000_000_000_000, 0), " 100 PB");
expect_eq!(wrap_size(&config, 999_999_999_999_999_999, 0), " 999 PB");
expect_eq!(wrap_size(&config, 1_000_000_000_000_000_000, 0), " 1 EB");
expect_eq!(wrap_size(&config, 9_999_999_999_999_999_999, 0), " 9 EB");
expect_eq!(wrap_size(&config, 10_000_000_000_000_000_000, 0), " 10 EB");
}
#[gtest]
fn test_prints_time_as_local_timestamp() {
let config = Config::default()
.with_curr_time(2024, 10, 10, 10, 10, 30)
.with_show_precise(true)
.with_show_utc(false);
expect_eq!(wrap_time(&config, 2024, 1, 31, 0, 0, 0), " Wed 31-Jan-2024 00:00:00");
expect_eq!(wrap_time(&config, 2024, 2, 29, 2, 5, 15), " Thu 29-Feb-2024 02:05:15");
expect_eq!(wrap_time(&config, 2024, 3, 31, 4, 10, 30), " Sun 31-Mar-2024 04:10:30");
expect_eq!(wrap_time(&config, 2024, 4, 30, 6, 15, 45), " Tue 30-Apr-2024 06:15:45");
expect_eq!(wrap_time(&config, 2024, 5, 31, 8, 20, 0), " Fri 31-May-2024 08:20:00");
expect_eq!(wrap_time(&config, 2024, 6, 30, 10, 25, 15), " Sun 30-Jun-2024 10:25:15");
expect_eq!(wrap_time(&config, 2024, 7, 31, 12, 30, 30), " Wed 31-Jul-2024 12:30:30");
expect_eq!(wrap_time(&config, 2024, 8, 31, 14, 35, 45), " Sat 31-Aug-2024 14:35:45");
expect_eq!(wrap_time(&config, 2024, 9, 30, 16, 40, 0), " Mon 30-Sep-2024 16:40:00");
expect_eq!(wrap_time(&config, 2024, 10, 31, 18, 45, 15), " Thu 31-Oct-2024 18:45:15");
expect_eq!(wrap_time(&config, 2024, 11, 30, 20, 50, 30), " Sat 30-Nov-2024 20:50:30");
expect_eq!(wrap_time(&config, 2024, 12, 31, 22, 55, 45), " Tue 31-Dec-2024 22:55:45");
expect_eq!(wrap_time(&config, 1970, 1, 1, 0, 0, 0), " ------------------------");
}
#[gtest]
fn test_prints_time_as_utc_timestamp() {
let config = Config::default()
.with_curr_time(2024, 10, 10, 10, 10, 30)
.with_show_precise(true)
.with_show_utc(true);
expect_eq!(wrap_time(&config, 2024, 1, 31, 0, 0, 0), " Wed 31-Jan-2024 00:00:00Z");
expect_eq!(wrap_time(&config, 2024, 2, 29, 2, 5, 15), " Thu 29-Feb-2024 02:05:15Z");
expect_eq!(wrap_time(&config, 2024, 3, 31, 4, 10, 30), " Sun 31-Mar-2024 04:10:30Z");
expect_eq!(wrap_time(&config, 2024, 4, 30, 6, 15, 45), " Tue 30-Apr-2024 06:15:45Z");
expect_eq!(wrap_time(&config, 2024, 5, 31, 8, 20, 0), " Fri 31-May-2024 08:20:00Z");
expect_eq!(wrap_time(&config, 2024, 6, 30, 10, 25, 15), " Sun 30-Jun-2024 10:25:15Z");
expect_eq!(wrap_time(&config, 2024, 7, 31, 12, 30, 30), " Wed 31-Jul-2024 12:30:30Z");
expect_eq!(wrap_time(&config, 2024, 8, 31, 14, 35, 45), " Sat 31-Aug-2024 14:35:45Z");
expect_eq!(wrap_time(&config, 2024, 9, 30, 16, 40, 0), " Mon 30-Sep-2024 16:40:00Z");
expect_eq!(wrap_time(&config, 2024, 10, 31, 18, 45, 15), " Thu 31-Oct-2024 18:45:15Z");
expect_eq!(wrap_time(&config, 2024, 11, 30, 20, 50, 30), " Sat 30-Nov-2024 20:50:30Z");
expect_eq!(wrap_time(&config, 2024, 12, 31, 22, 55, 45), " Tue 31-Dec-2024 22:55:45Z");
expect_eq!(wrap_time(&config, 1970, 1, 1, 0, 0, 0), " -------------------------");
}
#[gtest]
fn test_prints_time_as_duration() {
let config = Config::default()
.with_curr_time(2024, 10, 10, 10, 10, 30)
.with_show_precise(false);
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 10, 31), " future ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 10, 30), " 0 sec ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 10, 29), " 1 sec ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 9, 31), " 59 sec ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 9, 30), " 1 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 9, 29), " 1 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 8, 31), " 1 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 8, 30), " 2 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 10, 8, 29), " 2 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 9, 11, 31), " 58 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 9, 11, 30), " 59 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 9, 11, 29), " 59 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 9, 10, 31), " 59 min ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 9, 10, 30), " 1 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 9, 10, 29), " 1 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 8, 10, 31), " 1 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 8, 10, 30), " 2 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 10, 8, 10, 29), " 2 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 9, 11, 10, 31), " 22 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 9, 11, 10, 30), " 23 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 9, 11, 10, 29), " 23 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 9, 10, 10, 31), " 23 hour ");
expect_eq!(wrap_time(&config, 2024, 10, 9, 10, 10, 30), " 1 day ");
expect_eq!(wrap_time(&config, 2024, 10, 9, 10, 10, 29), " 1 day ");
expect_eq!(wrap_time(&config, 2024, 10, 8, 10, 10, 31), " 1 day ");
expect_eq!(wrap_time(&config, 2024, 10, 8, 10, 10, 30), " 2 day ");
expect_eq!(wrap_time(&config, 2024, 10, 8, 10, 10, 29), " 2 day ");
expect_eq!(wrap_time(&config, 2024, 9, 11, 10, 10, 31), " 28 day ");
expect_eq!(wrap_time(&config, 2024, 9, 11, 10, 10, 30), " 29 day ");
expect_eq!(wrap_time(&config, 2024, 9, 11, 10, 10, 29), " 29 day ");
expect_eq!(wrap_time(&config, 2024, 9, 10, 10, 10, 31), " 29 day ");
expect_eq!(wrap_time(&config, 2024, 9, 10, 10, 10, 30), " 1 month");
expect_eq!(wrap_time(&config, 2024, 9, 10, 10, 10, 29), " 1 month");
expect_eq!(wrap_time(&config, 2024, 8, 10, 10, 10, 31), " 1 month");
expect_eq!(wrap_time(&config, 2024, 8, 10, 10, 10, 30), " 2 month");
expect_eq!(wrap_time(&config, 2024, 8, 10, 10, 10, 29), " 2 month");
expect_eq!(wrap_time(&config, 2023, 11, 10, 10, 10, 31), " 10 month");
expect_eq!(wrap_time(&config, 2023, 11, 10, 10, 10, 30), " 11 month");
expect_eq!(wrap_time(&config, 2023, 11, 10, 10, 10, 29), " 11 month");
expect_eq!(wrap_time(&config, 2023, 10, 10, 10, 10, 31), " 11 month");
expect_eq!(wrap_time(&config, 2023, 10, 10, 10, 10, 30), " 1 year ");
expect_eq!(wrap_time(&config, 2023, 10, 10, 10, 10, 29), " 1 year ");
expect_eq!(wrap_time(&config, 2022, 10, 10, 10, 10, 31), " 1 year ");
expect_eq!(wrap_time(&config, 2022, 10, 10, 10, 10, 30), " 2 year ");
expect_eq!(wrap_time(&config, 2022, 10, 10, 10, 10, 29), " 2 year ");
expect_eq!(wrap_time(&config, 1970, 1, 1, 0, 0, 0), " --------");
}
#[gtest]
#[cfg(windows)]
fn test_prints_unpadded_version() {
expect_eq!(wrap_version(None, 0), "");
expect_eq!(wrap_version(Some(""), 0), "");
expect_eq!(wrap_version(Some("9.9.9.9"), 0), "");
expect_eq!(wrap_version(Some("999.999.999.999"), 0), "");
}
#[gtest]
#[cfg(windows)]
fn test_prints_padded_version() {
expect_eq!(wrap_version(None, 10), " ");
expect_eq!(wrap_version(Some(""), 10), " ");
expect_eq!(wrap_version(Some("9.9.9.9"), 10), " 9.9.9.9 ");
expect_eq!(wrap_version(Some("999.999.999.999"), 10), " 999.999.999.999");
}
#[gtest]
fn test_prints_unpadded_ext() {
expect_eq!(wrap_ext("", 0), "");
expect_eq!(wrap_ext(".txt", 0), "");
expect_eq!(wrap_ext(".extension", 0), "");
}
#[gtest]
fn test_prints_padded_ext() {
expect_eq!(wrap_ext("", 6), " ");
expect_eq!(wrap_ext(".txt", 6), " .txt ");
expect_eq!(wrap_ext(".extension", 6), " .extension");
}
#[gtest]
fn test_prints_total() {
expect_eq!(wrap_total(0, 0), "0 files 0 directories");
expect_eq!(wrap_total(1, 0), "1 file 0 directories");
expect_eq!(wrap_total(2, 0), "2 files 0 directories");
expect_eq!(wrap_total(0, 1), "0 files 1 directory");
expect_eq!(wrap_total(0, 2), "0 files 2 directories");
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_on_windows() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_on_git_bash() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_relative_paths_on_linux() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_on_windows() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]D:\\root\\example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]D:\\root\\example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_on_git_bash() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]/d/root/example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]/d/root/example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]/d/root/example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]/d/root/example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]/d/root/example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]/d/root/example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_absolute_paths_on_linux() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]/root/example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]/root/example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]/root/example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]/root/example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]/root/example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]/root/example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]/root/example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]/root/example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]/root/example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_with_zip_on_windows() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[LtRed]files.zip[LtBlue]\\[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset][LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers\\one two\\[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_with_zip_on_git_bash() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset][LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_relative_paths_with_zip_on_linux() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset][LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/colours/[Reset]red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_with_zip_on_windows() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]D:\\root\\example\\[Reset][DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset][LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours\\[Reset]red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers\\one two\\[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_with_zip_on_git_bash() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]/d/root/example/[Reset][DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset][LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_absolute_paths_with_zip_on_linux() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]/root/example/[Reset][DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset][LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours/[Reset]red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_paths_with_before_header_on_windows() {
let expected = "\
Before Sun 01-Jan-2023 00:00:00
-----------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::Before(PeriodKind::Sec(1)))
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_paths_with_before_header_on_git_bash() {
let expected = "\
Before Sun 01-Jan-2023 00:00:00
-----------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::Before(PeriodKind::Sec(1)))
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_paths_with_before_header_on_linux() {
let expected = "\
Before Sun 01-Jan-2023 00:00:00
-----------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::Before(PeriodKind::Sec(1)))
.with_show_precise(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_paths_with_after_header_and_utc_on_windows() {
let expected = "\
After Sun 01-Jan-2023 00:00:00Z
------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00Z .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00Z .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00Z .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00Z .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00Z .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00Z .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00Z .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00Z [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00Z .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_utc(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_paths_with_after_header_and_utc_on_git_bash() {
let expected = "\
After Sun 01-Jan-2023 00:00:00Z
------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00Z .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00Z .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00Z .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00Z .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00Z .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00Z .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00Z .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00Z [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00Z .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_utc(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_paths_with_after_header_and_utc_on_linux() {
let expected = "\
After Sun 01-Jan-2023 00:00:00Z
------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00Z .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00Z .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00Z .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00Z .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00Z .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00Z .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00Z .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00Z [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00Z [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00Z .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_utc(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_paths_with_total_footer_on_windows() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_total(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_paths_with_total_footer_on_git_bash() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_total(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_paths_with_total_footer_on_linux() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_total(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_pretty_fields_on_windows() {
let expected = "\
drwxr-xr-x 0 B 1 day [LtBlue]example\\[Reset]
-rwxr-xr-x 10 B 2 month .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]example\\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]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_precise(false)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_pretty_fields_on_git_bash() {
let expected = "\
drwxr-xr-x 0 B 1 day [LtBlue]example/[Reset]
-rwxr-xr-x 10 B 2 month .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]example/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]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_precise(false)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_pretty_fields_on_linux() {
let expected = "\
drwxr-xr-x 0 B 1 day [LtBlue]example/[Reset]
-rwxr-xr-x 10 B 2 month .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_precise(false)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_pretty_fields_with_header_and_footer_on_windows() {
let expected = "\
After 1 year
----------------------------
drwxr-xr-x 0 B 1 day [LtBlue]example\\[Reset]
-rwxr-xr-x 10 B 2 month .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]example\\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]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
----------------------------
Total 1 KB 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(false)
.with_show_total(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_pretty_fields_with_header_and_footer_on_git_bash() {
let expected = "\
After 1 year
----------------------------
drwxr-xr-x 0 B 1 day [LtBlue]example/[Reset]
-rwxr-xr-x 10 B 2 month .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]example/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]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
----------------------------
Total 1 KB 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(false)
.with_show_total(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_pretty_fields_with_header_and_footer_on_linux() {
let expected = "\
After 1 year
----------------------------
drwxr-xr-x 0 B 1 day [LtBlue]example/[Reset]
-rwxr-xr-x 10 B 2 month .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 B 3 month .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 B 4 month .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 B 5 month .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 B 6 month .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 B 7 month .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 B 8 month .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 B 9 month [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 B 1 day [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 B 10 month .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
----------------------------
Total 1 KB 9 files 5 directories
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(false)
.with_show_total(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_git_flags_on_windows() {
let expected = "\
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[Reset]
-rwxr-xr-x AMRUI 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- A---- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- -M--- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- --R-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- ---U- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- ----- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- ----- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- ----- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- ----I 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_git(GitFlags::default())
.with_show_precise(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_git_flags_on_git_bash() {
let expected = "\
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x AMRUI 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- A---- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- -M--- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- --R-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- ---U- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- ----- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- ----- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- ----- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- ----I 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_git(GitFlags::default())
.with_show_precise(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_git_flags_on_linux() {
let expected = "\
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x AMRUI 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- A---- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- -M--- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- --R-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- ---U- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- ----- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- ----- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- ----- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- ----I 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_filter_git(GitFlags::default())
.with_show_precise(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_git_flags_with_header_and_footer_on_windows() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------------
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\[Reset]
-rwxr-xr-x AMRUI 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- A---- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- -M--- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- --R-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- ---U- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- ----- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- ----- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- ----- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- ----I 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
---------------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_filter_git(GitFlags::default());
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_git_flags_with_header_and_footer_on_git_bash() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------------
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x AMRUI 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- A---- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- -M--- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- --R-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- ---U- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- ----- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- ----- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- ----- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- ----I 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_filter_git(GitFlags::default());
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_git_flags_with_header_and_footer_on_linux() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------------
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/[Reset]
-rwxr-xr-x AMRUI 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- A---- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- -M--- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- --R-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- ---U- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- ----- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- ----- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- ----- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x ----- 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- ----I 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_filter_git(GitFlags::default());
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_crc_on_windows() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 983f4ec5 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 983f4ec5 .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 a8a32700 .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 c3074b19 .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 6cc61d05 .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 983f4ec5 .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 95c416b2 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_crc(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_crc_on_git_bash() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 983f4ec5 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 a8a32700 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 c3074b19 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 6cc61d05 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 95c416b2 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_crc(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_file_crc_on_linux() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 983f4ec5 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 a8a32700 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 c3074b19 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 6cc61d05 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 95c416b2 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_crc(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_crc_with_header_and_footer_on_windows() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 983f4ec5 .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 983f4ec5 .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 a8a32700 .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 c3074b19 .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 6cc61d05 .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 983f4ec5 .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 95c416b2 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_show_crc(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_crc_with_header_and_footer_on_git_bash() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 983f4ec5 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 a8a32700 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 c3074b19 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 6cc61d05 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 95c416b2 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_show_crc(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_file_crc_with_header_and_footer_on_linux() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 983f4ec5 .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 a8a32700 .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 c3074b19 .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 6cc61d05 .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 983f4ec5 .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 95c416b2 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_show_crc(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_signature_on_windows() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 424c5545 BLUE .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 47524545 GREE .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 52454400 RED. .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .... .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 .... [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 fffe3334 ..34 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_sig(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_signature_on_git_bash() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 424c5545 BLUE .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 47524545 GREE .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 52454400 RED. .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .... .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 fffe3334 ..34 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_sig(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_file_signature_on_linux() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 424c5545 BLUE .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 47524545 GREE .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 52454400 RED. .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .... .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 fffe3334 ..34 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_show_precise(true)
.with_show_sig(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_signature_with_header_and_footer_on_windows() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\colours\\[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 424c5545 BLUE .txt [LtBlue]example\\files\\colours\\[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 47524545 GREE .txt [LtBlue]example\\files\\colours\\[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 52454400 RED. .txt [LtBlue]example\\files\\colours\\[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\numbers\\[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .... .gz [LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 .... [LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example\\files\\numbers\\one two\\[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 fffe3334 ..34 .txt [LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_show_sig(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_file_signature_with_header_and_footer_on_git_bash() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 424c5545 BLUE .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 47524545 GREE .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 52454400 RED. .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .... .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 fffe3334 ..34 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_show_sig(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_file_signature_with_header_and_footer_on_linux() {
let expected = "\
After Sun 01-Jan-2023 00:00:00
---------------------------------------------
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/colours/[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 424c5545 BLUE .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 47524545 GREE .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 52454400 RED. .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 23212f75 #!/u .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- 999 Mon 01-May-2023 00:00:00 00000000 .... .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 00000000 .... [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 fffe3334 ..34 .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
---------------------------------------------
Total 1,279 9 files 5 directories
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(true)
.with_show_total(true)
.with_show_sig(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
#[cfg(unix)]
fn test_prints_owner_information_on_linux() {
let expected = "\
drwxr-xr-x alice public 0 B 1 day [LtBlue]example/[Reset]
-rwxr-xr-x root root 10 B 2 month .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x alice public 0 B 1 day [LtBlue]example/files/[Reset]
drwxr-xr-x alice public 0 B 1 day [LtBlue]example/files/colours/[Reset]
-rwxr--r-- alice public 20 B 3 month .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- alice public 30 B 4 month .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- alice public 40 B 5 month .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- alice public 50 B 6 month .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x bob public 0 B 1 day [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- bob public 60 B 7 month .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- bob public 999 B 8 month .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- bob public 0 B 9 month [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x - - 0 B 1 day [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- - - 70 B 10 month .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_show_precise(false)
.with_show_owner(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
#[cfg(unix)]
fn test_prints_owner_information_with_header_and_footer_on_linux() {
let expected = "\
After 1 year
------------------------------------------
drwxr-xr-x alice public 0 B 1 day [LtBlue]example/[Reset]
-rwxr-xr-x root root 10 B 2 month .sh [LtBlue]example/[Reset][DkGreen]find.sh[Reset]
drwxr-xr-x alice public 0 B 1 day [LtBlue]example/files/[Reset]
drwxr-xr-x alice public 0 B 1 day [LtBlue]example/files/colours/[Reset]
-rwxr--r-- alice public 20 B 3 month .sh [LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
-rw-r--r-- alice public 30 B 4 month .txt [LtBlue]example/files/colours/[Reset]blue.txt
-rw-r--r-- alice public 40 B 5 month .txt [LtBlue]example/files/colours/[Reset]green.txt
-rw-r--r-- alice public 50 B 6 month .txt [LtBlue]example/files/colours/[Reset]red.txt
drwxr-xr-x bob public 0 B 1 day [LtBlue]example/files/numbers/[Reset]
lrwxr--r-- bob public 60 B 7 month .sh [LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
lrw-r--r-- bob public 999 B 8 month .gz [LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
lrw-r--r-- bob public 0 B 9 month [LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x - - 0 B 1 day [LtBlue]example/files/numbers/one two/[Reset]
-rw-r--r-- - - 70 B 10 month .txt [LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
------------------------------------------
Total 1 KB 9 files 5 directories
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_curr_time(2024, 1, 1, 0, 0, 0)
.with_filter_recent(RecentKind::After(PeriodKind::Year(1)))
.with_show_precise(false)
.with_show_owner(true)
.with_show_total(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_version_numbers_on_windows() {
let expected = "\
-rwxr--r-- 999 Mon 01-Jan-2024 00:00:00 12.3.4.0 .exe [LtGreen]binary.exe[Reset]
-rwxr--r-- 999 Mon 01-Jan-2024 00:00:00 5.67.89.0 .dll library.dll
-rw-r--r-- 999 Mon 01-Jan-2024 00:00:00 .txt readme.txt
";
let files = create_files_with_version();
let config = Config::default()
.with_show_precise(true)
.with_win_ver(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_version_numbers_on_git_bash() {
let expected = "\
-rwxr--r-- 999 Mon 01-Jan-2024 00:00:00 12.3.4.0 .exe [LtGreen]binary.exe[Reset]
-rwxr--r-- 999 Mon 01-Jan-2024 00:00:00 5.67.89.0 .dll library.dll
-rw-r--r-- 999 Mon 01-Jan-2024 00:00:00 .txt readme.txt
";
let files = create_files_with_version();
let config = Config::default()
.with_show_precise(true)
.with_win_ver(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_no_attributes_on_windows() {
let expected = "\
[LtBlue]example\\[Reset]
[LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
[LtBlue]example\\files\\[Reset]
[LtBlue]example\\files\\colours\\[Reset]
[LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]example\\files\\colours\\[Reset]blue.txt
[LtBlue]example\\files\\colours\\[Reset]green.txt
[LtBlue]example\\files\\colours\\[Reset]red.txt
[LtBlue]example\\files\\numbers\\[Reset]
[LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
[LtBlue]example\\files\\numbers\\one two\\[Reset]
[LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_no_attributes_on_git_bash() {
let expected = "\
[LtBlue]example/[Reset]
[LtBlue]example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]example/files/[Reset]
[LtBlue]example/files/colours/[Reset]
[LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]example/files/colours/[Reset]blue.txt
[LtBlue]example/files/colours/[Reset]green.txt
[LtBlue]example/files/colours/[Reset]red.txt
[LtBlue]example/files/numbers/[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]example/files/numbers/one two/[Reset]
[LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_relative_paths_no_attributes_on_linux() {
let expected = "\
[LtBlue]example/[Reset]
[LtBlue]example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]example/files/[Reset]
[LtBlue]example/files/colours/[Reset]
[LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]example/files/colours/[Reset]blue.txt
[LtBlue]example/files/colours/[Reset]green.txt
[LtBlue]example/files/colours/[Reset]red.txt
[LtBlue]example/files/numbers/[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]example/files/numbers/one two/[Reset]
[LtBlue]example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_no_attributes_on_windows() {
let expected = "\
[LtBlue]D:\\root\\example\\[Reset]
[LtBlue]D:\\root\\example\\[Reset][DkGreen]find.sh[Reset]
[LtBlue]D:\\root\\example\\files\\[Reset]
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]
[LtBlue]D:\\root\\example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]blue.txt
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]green.txt
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]red.txt
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\one two\\[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_no_attributes_on_git_bash() {
let expected = "\
[LtBlue]/d/root/example/[Reset]
[LtBlue]/d/root/example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]/d/root/example/files/[Reset]
[LtBlue]/d/root/example/files/colours/[Reset]
[LtBlue]/d/root/example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/d/root/example/files/colours/[Reset]blue.txt
[LtBlue]/d/root/example/files/colours/[Reset]green.txt
[LtBlue]/d/root/example/files/colours/[Reset]red.txt
[LtBlue]/d/root/example/files/numbers/[Reset]
[LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]/d/root/example/files/numbers/one two/[Reset]
[LtBlue]/d/root/example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_absolute_paths_no_attributes_on_linux() {
let expected = "\
[LtBlue]/root/example/[Reset]
[LtBlue]/root/example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]/root/example/files/[Reset]
[LtBlue]/root/example/files/colours/[Reset]
[LtBlue]/root/example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/root/example/files/colours/[Reset]blue.txt
[LtBlue]/root/example/files/colours/[Reset]green.txt
[LtBlue]/root/example/files/colours/[Reset]red.txt
[LtBlue]/root/example/files/numbers/[Reset]
[LtBlue]/root/example/files/numbers/[Reset][LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[LtBlue]/root/example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
[LtBlue]/root/example/files/numbers/[Reset][LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
[LtBlue]/root/example/files/numbers/one two/[Reset]
[LtBlue]/root/example/files/numbers/one two/[Reset]\"three\" 'four'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_with_escaping_on_windows() {
let expected = "\
[LtBlue]example\\[Reset]
[LtBlue]example\\[Reset][DkGreen]find.sh[Reset]
[LtBlue]example\\files\\[Reset]
[LtBlue]example\\files\\colours\\[Reset]
[LtBlue]example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]example\\files\\colours\\[Reset]blue.txt
[LtBlue]example\\files\\colours\\[Reset]green.txt
[LtBlue]example\\files\\colours\\[Reset]red.txt
[LtBlue]example\\files\\numbers\\[Reset]
[LtBlue]example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset]
[LtBlue]example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset]
[LtBlue]example\\files\\numbers\\one two\\[Reset]
[LtBlue]example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_escape_path()
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_with_escaping_on_git_bash() {
let expected = "\
[LtBlue]example/[Reset]
[LtBlue]example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]example/files/[Reset]
[LtBlue]example/files/colours/[Reset]
[LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]example/files/colours/[Reset]blue.txt
[LtBlue]example/files/colours/[Reset]green.txt
[LtBlue]example/files/colours/[Reset]red.txt
[LtBlue]example/files/numbers/[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]example/files/numbers/one\\ two/[Reset]
[LtBlue]example/files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_escape_path()
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_relative_paths_with_escaping_on_linux() {
let expected = "\
[LtBlue]example/[Reset]
[LtBlue]example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]example/files/[Reset]
[LtBlue]example/files/colours/[Reset]
[LtBlue]example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]example/files/colours/[Reset]blue.txt
[LtBlue]example/files/colours/[Reset]green.txt
[LtBlue]example/files/colours/[Reset]red.txt
[LtBlue]example/files/numbers/[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]example/files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]example/files/numbers/one\\ two/[Reset]
[LtBlue]example/files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_escape_path()
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_with_escaping_on_windows() {
let expected = "\
[LtBlue]D:\\root\\example\\[Reset]
[LtBlue]D:\\root\\example\\[Reset][DkGreen]find.sh[Reset]
[LtBlue]D:\\root\\example\\files\\[Reset]
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]
[LtBlue]D:\\root\\example\\files\\colours\\[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]blue.txt
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]green.txt
[LtBlue]D:\\root\\example\\files\\colours\\[Reset]red.txt
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]count.sh[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\[Reset][LtCyan]ordinals[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\one two\\[Reset]
[LtBlue]D:\\root\\example\\files\\numbers\\one two\\[Reset]\"three\" 'four'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_escape_path()
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_with_escaping_on_git_bash() {
let expected = "\
[LtBlue]/d/root/example/[Reset]
[LtBlue]/d/root/example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]/d/root/example/files/[Reset]
[LtBlue]/d/root/example/files/colours/[Reset]
[LtBlue]/d/root/example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/d/root/example/files/colours/[Reset]blue.txt
[LtBlue]/d/root/example/files/colours/[Reset]green.txt
[LtBlue]/d/root/example/files/colours/[Reset]red.txt
[LtBlue]/d/root/example/files/numbers/[Reset]
[LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]/d/root/example/files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]/d/root/example/files/numbers/one\\ two/[Reset]
[LtBlue]/d/root/example/files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("D:", "/root", "");
let config = Config::default()
.with_escape_path()
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_absolute_paths_with_escaping_on_linux() {
let expected = "\
[LtBlue]/root/example/[Reset]
[LtBlue]/root/example/[Reset][DkGreen]find.sh[Reset]
[LtBlue]/root/example/files/[Reset]
[LtBlue]/root/example/files/colours/[Reset]
[LtBlue]/root/example/files/colours/[Reset][LtGreen]alpha.sh[Reset]
[LtBlue]/root/example/files/colours/[Reset]blue.txt
[LtBlue]/root/example/files/colours/[Reset]green.txt
[LtBlue]/root/example/files/colours/[Reset]red.txt
[LtBlue]/root/example/files/numbers/[Reset]
[LtBlue]/root/example/files/numbers/[Reset][LtCyan]count.sh[Reset]
[LtBlue]/root/example/files/numbers/[Reset][LtCyan]googolplex.gz[Reset]
[LtBlue]/root/example/files/numbers/[Reset][LtCyan]ordinals[Reset]
[LtBlue]/root/example/files/numbers/one\\ two/[Reset]
[LtBlue]/root/example/files/numbers/one\\ two/[Reset]\\\"three\\\"\\ \\'four\\'.txt
";
let files = create_files("", "/root", "");
let config = Config::default()
.with_escape_path()
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_sorted_by_name_on_windows() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]example\\files\\colours[Reset])
blue.txt ([LtBlue]example\\files\\colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]example\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]example\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]example\\files\\colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]example\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
red.txt ([LtBlue]example\\files\\colours[Reset])
\"three\" 'four'.txt ([LtBlue]example\\files\\numbers\\one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let config = Config::default()
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_sorted_by_name_on_git_bash() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]example/files/colours[Reset])
blue.txt ([LtBlue]example/files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]example/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]example/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]example/files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]example/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]example/files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]example/files/numbers/one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let config = Config::default()
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_relative_paths_sorted_by_name_on_linux() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]example/files/colours[Reset])
blue.txt ([LtBlue]example/files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]example/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]example/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]example/files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]example/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]example/files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]example/files/numbers/one two[Reset])
";
let files = create_files("", "/root", "");
let files = modify_files_by_name(files);
let config = Config::default()
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_sorted_by_name_on_windows() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]D:\\root\\example\\files\\colours[Reset])
blue.txt ([LtBlue]D:\\root\\example\\files\\colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]D:\\root\\example\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]D:\\root\\example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]D:\\root\\example\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]D:\\root\\example\\files\\colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]D:\\root\\example\\files\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
red.txt ([LtBlue]D:\\root\\example\\files\\colours[Reset])
\"three\" 'four'.txt ([LtBlue]D:\\root\\example\\files\\numbers\\one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let config = Config::default()
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_sorted_by_name_on_git_bash() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]/d/root/example/files/colours[Reset])
blue.txt ([LtBlue]/d/root/example/files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]/d/root/example/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]/d/root/example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]/d/root/example/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]/d/root/example/files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]/d/root/example/files/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]/d/root/example/files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]/d/root/example/files/numbers/one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let config = Config::default()
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_absolute_paths_sorted_by_name_on_linux() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]/root/example/files/colours[Reset])
blue.txt ([LtBlue]/root/example/files/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]/root/example/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]/root/example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]/root/example/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]/root/example/files/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]/root/example/files/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]/root/example/files/colours[Reset])
\"three\" 'four'.txt ([LtBlue]/root/example/files/numbers/one two[Reset])
";
let files = create_files("", "/root", "");
let files = modify_files_by_name(files);
let config = Config::default()
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_with_zip_sorted_by_name_on_windows() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
blue.txt ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
red.txt ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
\"three\" 'four'.txt ([LtBlue]example\\[LtRed]files.zip[LtBlue]\\numbers\\one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_relative_paths_with_zip_sorted_by_name_on_git_bash() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
blue.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
\"three\" 'four'.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_relative_paths_with_zip_sorted_by_name_on_linux() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
blue.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/colours[Reset])
\"three\" 'four'.txt ([LtBlue]example/[LtRed]files.zip[LtBlue]/numbers/one two[Reset])
";
let files = create_files("", "/root", "");
let files = modify_files_by_name(files);
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(false);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_with_zip_sorted_by_name_on_windows() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
blue.txt ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]D:\\root\\example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers[Reset]) -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
red.txt ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\colours[Reset])
\"three\" 'four'.txt ([LtBlue]D:\\root\\example\\[LtRed]files.zip[LtBlue]\\numbers\\one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_absolute_paths_with_zip_sorted_by_name_on_git_bash() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
blue.txt ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]/d/root/example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
\"three\" 'four'.txt ([LtBlue]/d/root/example/[LtRed]files.zip[LtBlue]/numbers/one two[Reset])
";
let files = create_files("D:", "/root", "");
let files = modify_files_by_name(files);
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_absolute_paths_with_zip_sorted_by_name_on_linux() {
let expected = "\
[LtGreen]alpha.sh[Reset] ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
blue.txt ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]count.sh[Reset] ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
[DkGreen]find.sh[Reset] ([LtBlue]/root/example[Reset])
[LtCyan]googolplex.gz[Reset] ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
green.txt ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
[LtCyan]ordinals[Reset] ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers[Reset]) -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
red.txt ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/colours[Reset])
\"three\" 'four'.txt ([LtBlue]/root/example/[LtRed]files.zip[LtBlue]/numbers/one two[Reset])
";
let files = create_files("", "/root", "");
let files = modify_files_by_name(files);
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_sort_name(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_with_attributes_on_windows() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]files[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
lrwxr--r-- 60 Thu 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 Mon 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 Sat 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let config = Config::default()
.with_show_precise(true)
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_with_attributes_on_git_bash() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]files[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
lrwxr--r-- 60 Thu 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 Mon 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 Sat 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let config = Config::default()
.with_show_precise(true)
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_indented_paths_with_attributes_on_linux() {
let expected = "\
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example[Reset]
-rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]files[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
lrwxr--r-- 60 Thu 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 Mon 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 Sat 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("", "/root", "../..");
let config = Config::default()
.with_show_precise(true)
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_no_attributes_on_windows() {
let expected = "\
[LtBlue]example[Reset]
[LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
[LtBlue]\\-[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 config = Config::default()
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_no_attributes_on_git_bash() {
let expected = "\
[LtBlue]example[Reset]
[LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
[LtBlue]\\-[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 config = Config::default()
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_indented_paths_no_attributes_on_linux() {
let expected = "\
[LtBlue]example[Reset]
[LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
[LtBlue]\\-[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 config = Config::default()
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_with_zip_with_attributes_on_windows() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtRed]files.zip[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]D:\\etc\\numbers\\[Reset][LtBlue]ordinals\\[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_with_zip_with_attributes_on_git_bash() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtRed]files.zip[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/d/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("D:", "/root", "../..");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_indented_paths_with_zip_with_attributes_on_linux() {
let expected = "\
-drwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]example[Reset]
--rwxr-xr-x 10 Wed 01-Nov-2023 00:00:00 .sh [LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtRed]files.zip[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]+-[Reset] [LtBlue]colours[Reset]
z-rwxr--r-- 20 Sun 01-Oct-2023 00:00:00 .sh [LtBlue]|[Reset] [LtBlue]+-[Reset] [LtGreen]alpha.sh[Reset]
z-rw-r--r-- 30 Fri 01-Sep-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] blue.txt
z-rw-r--r-- 40 Tue 01-Aug-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]+-[Reset] green.txt
z-rw-r--r-- 50 Sat 01-Jul-2023 00:00:00 .txt [LtBlue]|[Reset] [LtBlue]\\-[Reset] red.txt
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]numbers[Reset]
zlrwxr--r-- 60 Thu 01-Jun-2023 00:00:00 .sh [LtBlue]+-[Reset] [LtCyan]count.sh[Reset] -> [LtBlue]/etc/numbers/[Reset][LtGreen]count.sh[Reset]
zlrw-r--r-- 999 Mon 01-May-2023 00:00:00 .gz [LtBlue]+-[Reset] [LtCyan]googolplex.gz[Reset] -> [LtBlue]/etc/numbers/[Reset][LtRed]googolplex.gz[Reset]
zlrw-r--r-- 0 Sat 01-Apr-2023 00:00:00 [LtBlue]+-[Reset] [LtCyan]ordinals[Reset] -> [LtBlue]/etc/numbers/[Reset][LtBlue]ordinals/[Reset]
zdrwxr-xr-x 0 Sun 31-Dec-2023 00:00:00 [LtBlue]\\-[Reset] [LtBlue]one two[Reset]
z-rw-r--r-- 70 Wed 01-Mar-2023 00:00:00 .txt [LtBlue]\\-[Reset] \"three\" 'four'.txt
";
let files = create_files("", "/root", "../..");
let files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_precise(true)
.with_show_indent(true)
.with_only_path(false)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_with_zip_no_attributes_on_windows() {
let expected = "\
[LtBlue]example[Reset]
[LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
[LtBlue]\\-[Reset] [LtRed]files.zip[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 files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
#[gtest]
#[cfg(windows)]
fn test_prints_indented_paths_with_zip_no_attributes_on_git_bash() {
let expected = "\
[LtBlue]example[Reset]
[LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
[LtBlue]\\-[Reset] [LtRed]files.zip[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 files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, true, &files), expected);
}
#[gtest]
#[cfg(not(windows))]
fn test_prints_indented_paths_with_zip_no_attributes_on_linux() {
let expected = "\
[LtBlue]example[Reset]
[LtBlue]+-[Reset] [DkGreen]find.sh[Reset]
[LtBlue]\\-[Reset] [LtRed]files.zip[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 files = modify_files_for_zip(files);
let config = Config::default()
.with_zip_expand(true)
.with_show_indent(true)
.with_only_path(true)
.with_abs_path(true);
pretty_assertions::assert_eq!(wrap_files(&config, false, &files), expected);
}
fn wrap_mode(
zip_expand: bool,
inner_depth: Option<usize>,
file_mode: u32,
file_type: FileKind,
) -> String {
let config = Config::default().with_zip_expand(zip_expand);
wrap_function(&config, false, |p| p.print_mode(file_type, file_mode, inner_depth))
}
fn wrap_size(config: &Config, file_size: u64, size_width: usize) -> String {
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 = create_time(year, month, day, hour, minute, second).unwrap();
wrap_function(config, false, |p| p.print_time(&time, &Utc, true))
}
#[cfg(windows)]
fn wrap_version(file_ver: Option<&str>, ver_width: usize) -> String {
let config = Config::default();
let file_ver = file_ver.map(str::to_string);
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();
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(RecentKind::None);
total.num_files = num_files;
total.num_dirs = num_dirs;
wrap_function(&config, false, |p| p.print_summary(&total))
}
fn wrap_files(config: &Config, git_bash: bool, files: &Vec<File>) -> String {
let total = create_total(config, files);
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<()>,
{
let mut buffer = String::new();
let writer = unsafe { BufferWrapper::new(buffer.as_mut_vec()) };
let colors = Some(String::from("*.gz=01;31:*.zip=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();
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 = PathBuf::from(drive.to_string() + "/etc/numbers/count.sh").clean();
let link_file = PathBuf::from(drive.to_string() + "/etc/numbers/googolplex.gz").clean();
let link_dir = PathBuf::from(drive.to_string() + "/etc/numbers/ordinals").clean();
vec![
create_file(&abs_prefix, rel_prefix, "example", "", "")
.with_type(FileKind::Dir)
.with_mode(0o755)
.with_owner_ref("alice", "public")
.with_size(0)
.with_date(2023, 12, 31),
create_file(&abs_prefix, rel_prefix, "example", "find", ".sh")
.with_type(FileKind::File(ExecKind::Other))
.with_mode(0o755)
.with_owner_ref("root", "root")
.with_size(10)
.with_date(2023, 11, 01)
.with_git(Some(GitFlags::default()
.with_added(true)
.with_modified(true)
.with_renamed(true)
.with_untracked(true)
.with_ignored(true)))
.with_sig_str("#!/u"),
create_file(&abs_prefix, rel_prefix, "example/files", "", "")
.with_type(FileKind::Dir)
.with_mode(0o755)
.with_owner_ref("alice", "public")
.with_size(0)
.with_date(2023, 12, 31),
create_file(&abs_prefix, rel_prefix, "example/files/colours", "", "")
.with_type(FileKind::Dir)
.with_mode(0o755)
.with_owner_ref("alice", "public")
.with_size(0)
.with_date(2023, 12, 31),
create_file(&abs_prefix, rel_prefix, "example/files/colours", "alpha", ".sh")
.with_type(FileKind::File(ExecKind::User))
.with_mode(0o744)
.with_owner_ref("alice", "public")
.with_size(20)
.with_date(2023, 10, 01)
.with_git(Some(GitFlags::default().with_added(true)))
.with_sig_str("#!/u"),
create_file(&abs_prefix, rel_prefix, "example/files/colours", "blue", ".txt")
.with_type(FileKind::File(ExecKind::None))
.with_mode(0o644)
.with_owner_ref("alice", "public")
.with_size(30)
.with_date(2023, 09, 01)
.with_git(Some(GitFlags::default().with_modified(true)))
.with_sig_str("BLUE"),
create_file(&abs_prefix, rel_prefix, "example/files/colours", "green", ".txt")
.with_type(FileKind::File(ExecKind::None))
.with_mode(0o644)
.with_owner_ref("alice", "public")
.with_size(40)
.with_date(2023, 08, 01)
.with_git(Some(GitFlags::default().with_renamed(true)))
.with_sig_str("GREE"),
create_file(&abs_prefix, rel_prefix, "example/files/colours", "red", ".txt")
.with_type(FileKind::File(ExecKind::None))
.with_mode(0o644)
.with_owner_ref("alice", "public")
.with_size(50)
.with_date(2023, 07, 01)
.with_git(Some(GitFlags::default().with_untracked(true)))
.with_sig_str("RED"),
create_file(&abs_prefix, rel_prefix, "example/files/numbers", "", "")
.with_type(FileKind::Dir)
.with_mode(0o755)
.with_owner_ref("bob", "public")
.with_size(0)
.with_date(2023, 12, 31),
create_file(&abs_prefix, rel_prefix, "example/files/numbers", "count", ".sh")
.with_type(FileKind::Link(true))
.with_mode(0o744)
.with_owner_ref("bob", "public")
.with_size(60)
.with_date(2023, 06, 01)
.with_sig_str("#!/u")
.with_link(link_exec, FileKind::File(ExecKind::User)),
create_file(&abs_prefix, rel_prefix, "example/files/numbers", "googolplex", ".gz")
.with_type(FileKind::Link(true))
.with_mode(0o644)
.with_owner_ref("bob", "public")
.with_size(999)
.with_date(2023, 05, 01)
.with_link(link_file, FileKind::File(ExecKind::None)),
create_file(&abs_prefix, rel_prefix, "example/files/numbers", "ordinals", "")
.with_type(FileKind::Link(true))
.with_mode(0o644)
.with_owner_ref("bob", "public")
.with_size(0)
.with_date(2023, 04, 01)
.with_link(link_dir, FileKind::Dir),
create_file(&abs_prefix, rel_prefix, "example/files/numbers/one two", "", "")
.with_type(FileKind::Dir)
.with_mode(0o755)
.with_size(0)
.with_date(2023, 12, 31),
create_file(&abs_prefix, rel_prefix, "example/files/numbers/one two", "\"three\" 'four'", ".txt")
.with_type(FileKind::File(ExecKind::None))
.with_mode(0o644)
.with_size(70)
.with_date(2023, 03, 01)
.with_git(Some(GitFlags::default().with_ignored(true)))
.with_sig_vec([0xff, 0xfe, 0x33, 0x34]),
]
}
fn modify_files_by_name(files: Vec<File>) -> Vec<File> {
let mut files = files.into_iter()
.filter(|file| file.file_type != FileKind::Dir)
.collect::<Vec<File>>();
files.sort_by(&compare_files_by_name);
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("\"");
left.cmp(&right)
}
fn modify_files_for_zip(files: Vec<File>) -> Vec<File> {
files.into_iter().map(modify_file_for_zip).collect()
}
fn modify_file_for_zip(file: File) -> File {
let (abs_dir, mut inner_depth) = modify_dir_for_zip(&file.abs_dir);
let (rel_dir, _) = modify_dir_for_zip(&file.rel_dir);
if file.file_type != FileKind::Dir {
inner_depth = inner_depth.map(|depth| depth + 1);
}
file.with_dirs(abs_dir, rel_dir).with_inner_depth(inner_depth)
}
fn modify_dir_for_zip(old_dir: &Path) -> (PathBuf, Option<usize>) {
let mut new_dir = PathBuf::new();
let mut inner_depth = None;
for component in old_dir.components() {
if let Component::Normal(dir) = component {
if dir == "files" {
new_dir.push("files.zip");
inner_depth = Some(0);
continue;
}
}
new_dir.push(component);
inner_depth = inner_depth.map(|depth| depth + 1);
}
(new_dir, inner_depth)
}
#[cfg(windows)]
fn create_files_with_version() -> Vec<File> {
vec![
create_file("", "", "", "binary", ".exe")
.with_type(FileKind::File(ExecKind::User))
.with_mode(0o744)
.with_size(999)
.with_date(2024, 01, 01)
.with_version(String::from("12.3.4.0")),
create_file("", "", "", "library", ".dll")
.with_type(FileKind::File(ExecKind::None))
.with_mode(0o744)
.with_size(999)
.with_date(2024, 01, 01)
.with_version(String::from("5.67.89.0")),
create_file("", "", "", "readme", ".txt")
.with_type(FileKind::File(ExecKind::None))
.with_mode(0o644)
.with_size(999)
.with_date(2024, 01, 01),
]
}
fn create_file(
abs_prefix: &str,
rel_prefix: &str,
file_dir: &str,
file_name: &str,
file_ext: &str,
) -> 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);
File::new(abs_dir, rel_dir, file_depth, None, file_name, file_ext, FileKind::Other)
}
fn create_total(config: &Config, files: &Vec<File>) -> Total {
let start_time = create_date(2023, 1, 1).unwrap();
let start_time = match config.filter_recent() {
RecentKind::None => RecentKind::None,
RecentKind::Before(_) => RecentKind::Before(start_time),
RecentKind::After(_) => RecentKind::After(start_time),
};
Total::from_files(start_time, config, files)
}
struct BufferWrapper<'a> {
buffer: &'a mut Vec<u8>,
}
impl<'a> BufferWrapper<'a> {
fn new(buffer: &'a mut Vec<u8>) -> Self {
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, color: &ColorSpec) -> io::Result<()> {
let bold = if color.bold() { "Lt" } else { "Dk" };
let fg = match color.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}]")?;
Ok(())
}
fn reset(&mut self) -> io::Result<()> {
write!(&mut self.buffer, "[Reset]")?;
Ok(())
}
}
}