Files
nushell/crates/nu-command/tests/commands/histogram.rs
Bahex 5478ec44bb to <format>: preserve round float numbers' type (#16016)
- fixes #16011

# Description
`Display` implementation for `f64` omits the decimal part for round
numbers, and by using it we did the same.
This affected:
- conversions to delimited formats: `csv`, `tsv`
- textual formats: `html`, `md`, `text`
- pretty printed `json` (`--raw` was unaffected)
- how single float values are displayed in the REPL

> [!TIP]
> This PR fixes our existing json pretty printing implementation.
> We can likely switch to using serde_json's impl using its
PrettyFormatter which allows arbitrary indent strings.

# User-Facing Changes
- Round trips through `csv`, `tsv`, and `json` preserve the type of
round floats.
- It's always clear whether a number is an integer or a float in the
REPL
  ```nushell
  4 / 2
  # => 2  # before: is this an int or a float?

  4 / 2
  # => 2.0  # after: clearly a float
  ``` 

# Tests + Formatting
Adjusted tests for the new behavior.

- 🟢 toolkit fmt
- 🟢 toolkit clippy
- 🟢 toolkit test
- 🟢 toolkit test stdlib

# After Submitting
N/A

---------

Co-authored-by: Bahex <17417311+Bahex@users.noreply.github.com>
2025-06-26 15:15:19 -05:00

104 lines
2.7 KiB
Rust

use nu_test_support::{nu, pipeline};
const SAMPLE_INPUT: &str = r#"
[[first_name, last_name, rusty_at];
[Andrés, Robalino, Ecuador],
[JT, Turner, "Estados Unidos"],
[Yehuda, Katz, "Estados Unidos"]]
"#;
#[test]
fn summarizes_by_column_given() {
let actual = nu!(pipeline(&format!(
r#"
{SAMPLE_INPUT}
| histogram rusty_at countries --percentage-type relative
| where rusty_at == "Ecuador"
| get countries
| get 0
"#
)));
assert_eq!(
actual.out,
"**************************************************"
);
// 50%
}
#[test]
fn summarizes_by_column_given_with_normalize_percentage() {
let actual = nu!(pipeline(&format!(
r#"
{SAMPLE_INPUT}
| histogram rusty_at countries
| where rusty_at == "Ecuador"
| get countries
| get 0
"#
)));
assert_eq!(actual.out, "*********************************");
// 33%
}
#[test]
fn summarizes_by_values() {
let actual = nu!(pipeline(&format!(
r#"
{SAMPLE_INPUT}
| get rusty_at
| histogram
| where value == "Estados Unidos"
| get count
| get 0
"#
)));
assert_eq!(actual.out, "2");
}
#[test]
fn help() {
let help_command = nu!("help histogram");
let help_short = nu!("histogram -h");
let help_long = nu!("histogram --help");
assert_eq!(help_short.out, help_command.out);
assert_eq!(help_long.out, help_command.out);
}
#[test]
fn count() {
let actual = nu!(pipeline(
"
echo [[bit]; [1] [0] [0] [0] [0] [0] [0] [1] [1]]
| histogram bit --percentage-type relative
| sort-by count
| reject frequency
| to json
"
));
let bit_json = r#"[ { "bit": 1, "count": 3, "quantile": 0.5, "percentage": "50.00%" }, { "bit": 0, "count": 6, "quantile": 1.0, "percentage": "100.00%" }]"#;
assert_eq!(actual.out, bit_json);
}
#[test]
fn count_with_normalize_percentage() {
let actual = nu!(pipeline(
"
echo [[bit]; [1] [0] [0] [0] [0] [0] [0] [1]]
| histogram bit --percentage-type normalize
| sort-by count
| reject frequency
| to json
"
));
let bit_json = r#"[ { "bit": 1, "count": 2, "quantile": 0.25, "percentage": "25.00%" }, { "bit": 0, "count": 6, "quantile": 0.75, "percentage": "75.00%" }]"#;
assert_eq!(actual.out, bit_json);
}