lsmem: implement --summary and more tests
This commit is contained in:
src/uu/lsmem/src
tests
@ -29,6 +29,7 @@ mod options {
|
|||||||
pub const PAIRS: &str = "pairs";
|
pub const PAIRS: &str = "pairs";
|
||||||
pub const RAW: &str = "raw";
|
pub const RAW: &str = "raw";
|
||||||
pub const SPLIT: &str = "split";
|
pub const SPLIT: &str = "split";
|
||||||
|
pub const SUMMARY: &str = "summary";
|
||||||
pub const SYSROOT: &str = "sysroot";
|
pub const SYSROOT: &str = "sysroot";
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -236,6 +237,27 @@ impl MemoryBlock {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug, PartialEq)]
|
||||||
|
enum Summary {
|
||||||
|
Never,
|
||||||
|
Always,
|
||||||
|
Only,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ValueEnum for Summary {
|
||||||
|
fn value_variants<'a>() -> &'a [Self] {
|
||||||
|
&[Summary::Never, Summary::Always, Summary::Only]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_possible_value(&self) -> Option<PossibleValue> {
|
||||||
|
match self {
|
||||||
|
Summary::Never => Some(PossibleValue::new("never").help("never show summary")),
|
||||||
|
Summary::Always => Some(PossibleValue::new("always").help("always show summary")),
|
||||||
|
Summary::Only => Some(PossibleValue::new("only").help("show summary only")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Default, Serialize)]
|
#[derive(Default, Serialize)]
|
||||||
struct TableRow {
|
struct TableRow {
|
||||||
range: String,
|
range: String,
|
||||||
@ -750,6 +772,13 @@ pub fn uumain(args: impl uucore::Args) -> UResult<()> {
|
|||||||
if opts.json || opts.pairs || opts.raw {
|
if opts.json || opts.pairs || opts.raw {
|
||||||
opts.want_summary = false;
|
opts.want_summary = false;
|
||||||
}
|
}
|
||||||
|
if let Some(summary) = matches.get_one::<Summary>(options::SUMMARY) {
|
||||||
|
match summary {
|
||||||
|
Summary::Never => opts.want_summary = false,
|
||||||
|
Summary::Only => opts.want_table = false,
|
||||||
|
Summary::Always => {} // Default (equivalent to if --summary wasn't provided at all)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(sysroot) = matches.get_one::<String>(options::SYSROOT) {
|
if let Some(sysroot) = matches.get_one::<String>(options::SYSROOT) {
|
||||||
opts.sysmem = format!(
|
opts.sysmem = format!(
|
||||||
@ -797,7 +826,7 @@ pub fn uu_app() -> Command {
|
|||||||
.long("json")
|
.long("json")
|
||||||
.help("use JSON output format")
|
.help("use JSON output format")
|
||||||
.action(ArgAction::SetTrue)
|
.action(ArgAction::SetTrue)
|
||||||
.conflicts_with_all([options::PAIRS, options::RAW]),
|
.conflicts_with_all([options::PAIRS, options::RAW, options::SUMMARY]),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(options::PAIRS)
|
Arg::new(options::PAIRS)
|
||||||
@ -805,7 +834,7 @@ pub fn uu_app() -> Command {
|
|||||||
.long("pairs")
|
.long("pairs")
|
||||||
.help("use key=\"value\" output format")
|
.help("use key=\"value\" output format")
|
||||||
.action(ArgAction::SetTrue)
|
.action(ArgAction::SetTrue)
|
||||||
.conflicts_with_all([options::JSON, options::RAW]),
|
.conflicts_with_all([options::JSON, options::RAW, options::SUMMARY]),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(options::ALL)
|
Arg::new(options::ALL)
|
||||||
@ -852,7 +881,7 @@ pub fn uu_app() -> Command {
|
|||||||
.long("raw")
|
.long("raw")
|
||||||
.help("use raw output format")
|
.help("use raw output format")
|
||||||
.action(ArgAction::SetTrue)
|
.action(ArgAction::SetTrue)
|
||||||
.conflicts_with_all([options::JSON, options::PAIRS]),
|
.conflicts_with_all([options::JSON, options::PAIRS, options::SUMMARY]),
|
||||||
)
|
)
|
||||||
.arg(
|
.arg(
|
||||||
Arg::new(options::SPLIT)
|
Arg::new(options::SPLIT)
|
||||||
@ -879,6 +908,19 @@ pub fn uu_app() -> Command {
|
|||||||
.action(ArgAction::Set)
|
.action(ArgAction::Set)
|
||||||
.value_name("dir"),
|
.value_name("dir"),
|
||||||
)
|
)
|
||||||
|
.arg(
|
||||||
|
Arg::new(options::SUMMARY)
|
||||||
|
.long("summary")
|
||||||
|
.help("print summary information")
|
||||||
|
.ignore_case(true)
|
||||||
|
.action(ArgAction::Set)
|
||||||
|
.value_name("when")
|
||||||
|
.value_delimiter(',')
|
||||||
|
.value_parser(EnumValueParser::<Summary>::new())
|
||||||
|
.conflicts_with_all([options::RAW, options::PAIRS, options::JSON])
|
||||||
|
.num_args(0..=1)
|
||||||
|
.default_missing_value("only"),
|
||||||
|
)
|
||||||
.after_help(&format!(
|
.after_help(&format!(
|
||||||
"Available output columns:\n{}",
|
"Available output columns:\n{}",
|
||||||
Column::value_variants()
|
Column::value_variants()
|
||||||
|
@ -144,6 +144,41 @@ fn test_split_zones() {
|
|||||||
sysroot_test_with_args("test_lsmem_split_zones.expected", &["-S", "zones"]);
|
sysroot_test_with_args("test_lsmem_split_zones.expected", &["-S", "zones"]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_summary_always() {
|
||||||
|
sysroot_test_with_args("test_lsmem_summary_always.expected", &["--summary=always"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_summary_empty() {
|
||||||
|
sysroot_test_with_args("test_lsmem_summary_empty.expected", &["--summary"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_summary_never() {
|
||||||
|
sysroot_test_with_args("test_lsmem_summary_never.expected", &["--summary=never"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_summary_only() {
|
||||||
|
sysroot_test_with_args("test_lsmem_summary_only.expected", &["--summary=only"]);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_summary_conflict_json() {
|
||||||
|
new_ucmd!().arg("--summary").arg("-J").fails().code_is(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_summary_conflict_pairs() {
|
||||||
|
new_ucmd!().arg("--summary").arg("-P").fails().code_is(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_summary_conflict_raw() {
|
||||||
|
new_ucmd!().arg("--summary").arg("-r").fails().code_is(1);
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_table() {
|
fn test_table() {
|
||||||
sysroot_test_with_args("test_lsmem_table.expected", &[]);
|
sysroot_test_with_args("test_lsmem_table.expected", &[]);
|
||||||
|
7
tests/fixtures/lsmem/test_lsmem_summary_always.expected
vendored
Normal file
7
tests/fixtures/lsmem/test_lsmem_summary_always.expected
vendored
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
RANGE SIZE STATE REMOVABLE BLOCK
|
||||||
|
0x0000000000000000-0x0000000037ffffff 896M online yes 0-6
|
||||||
|
0x0000000100000000-0x00000004afffffff 14.8G online yes 32-149
|
||||||
|
|
||||||
|
Memory block size: 128M
|
||||||
|
Total online memory: 15.6G
|
||||||
|
Total offline memory: 0B
|
3
tests/fixtures/lsmem/test_lsmem_summary_empty.expected
vendored
Normal file
3
tests/fixtures/lsmem/test_lsmem_summary_empty.expected
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Memory block size: 128M
|
||||||
|
Total online memory: 15.6G
|
||||||
|
Total offline memory: 0B
|
3
tests/fixtures/lsmem/test_lsmem_summary_never.expected
vendored
Normal file
3
tests/fixtures/lsmem/test_lsmem_summary_never.expected
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
RANGE SIZE STATE REMOVABLE BLOCK
|
||||||
|
0x0000000000000000-0x0000000037ffffff 896M online yes 0-6
|
||||||
|
0x0000000100000000-0x00000004afffffff 14.8G online yes 32-149
|
3
tests/fixtures/lsmem/test_lsmem_summary_only.expected
vendored
Normal file
3
tests/fixtures/lsmem/test_lsmem_summary_only.expected
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
Memory block size: 128M
|
||||||
|
Total online memory: 15.6G
|
||||||
|
Total offline memory: 0B
|
Reference in New Issue
Block a user