use nu_test_support::prelude::*;
#[test]
fn all() -> Result {
let sample = r#"{
meals: [
{description: "1 large egg", calories: 90},
{description: "1 cup white rice", calories: 250},
{description: "1 tablespoon fish oil", calories: 108}
]
}"#;
let code = format!(
"
{sample}
| get meals
| get calories
| math sum
"
);
test().run(&code).expect_value_eq(448)
}
#[test]
#[allow(clippy::unreadable_literal)]
#[allow(clippy::float_cmp)]
fn compute_sum_of_individual_row() -> Result {
let answers_for_columns = [
("cpu", 88.257434),
("mem", 3032375296.),
("virtual", 102579965952.),
];
let mut tester = test().cwd("tests/fixtures/formats");
for (column_name, expected_value) in answers_for_columns {
let code = format!(
"open sample-ps-output.json | select {column_name} | math sum | get {column_name}"
);
tester.run(&code).expect_value_eq(expected_value)?;
}
Ok(())
}
#[test]
#[allow(clippy::unreadable_literal)]
#[allow(clippy::float_cmp)]
fn compute_sum_of_table() -> Result {
let answers_for_columns = [
("cpu", 88.257434),
("mem", 3032375296.),
("virtual", 102579965952.),
];
let mut tester = test().cwd("tests/fixtures/formats");
for (column_name, expected_value) in answers_for_columns {
let code = format!(
"open sample-ps-output.json | select cpu mem virtual | math sum | get {column_name}"
);
tester.run(&code).expect_value_eq(expected_value)?;
}
Ok(())
}
#[test]
fn sum_of_a_row_containing_a_table_is_an_error() -> Result {
let outcome = test()
.cwd("tests/fixtures/formats")
.run("open sample-sys-output.json | math sum")
.expect_shell_error()?;
match outcome {
ShellError::CantConvert { from_type, .. } => {
assert_contains("record", from_type);
}
err => return Err(err.into()),
}
Ok(())
}
#[test]
fn const_sum() -> Result {
test()
.run("const SUM = [1 3] | math sum; $SUM")
.expect_value_eq(4)
}
#[test]
fn cannot_sum_infinite_range() -> Result {
let outcome = test().run("0.. | math sum").expect_shell_error()?;
assert!(matches!(outcome, ShellError::IncorrectValue { .. }));
Ok(())
}