mirror of
https://github.com/nushell/nushell
synced 2024-12-30 23:08:56 +00:00
e281c03403
# Description Close: #12083 Close: #12084 # User-Facing Changes It's a breaking change because we have switched the position of `<initial>` and `<closure>`, after the change, initial value will be optional. So it's possible to do something like this: ```nushell > let f = {|fib = [0, 1]| {out: $fib.0, next: [$fib.1, ($fib.0 + $fib.1)]} } > generate $f | first 5 ╭───┬───╮ │ 0 │ 0 │ │ 1 │ 1 │ │ 2 │ 1 │ │ 3 │ 2 │ │ 4 │ 3 │ ╰───┴───╯ ``` It will also raise error if user don't give initial value, and the closure don't have default parameter. ```nushell ❯ let f = {|fib| {out: $fib.0, next: [$fib.1, ($fib.0 + $fib.1)]} } ❯ generate $f Error: × The initial value is missing ╭─[entry #5:1:1] 1 │ generate $f · ────┬─── · ╰── Missing intial value ╰──── help: Provide <initial> value in generate, or assigning default value to closure parameter ``` # Tests + Formatting Added some test cases. --------- Co-authored-by: Stefan Holderbach <sholderbach@users.noreply.github.com>
150 lines
3.1 KiB
Rust
150 lines
3.1 KiB
Rust
use nu_test_support::{nu, pipeline};
|
|
|
|
#[test]
|
|
fn generate_no_next_break() {
|
|
let actual = nu!(
|
|
"generate {|x| if $x == 3 { {out: $x}} else { {out: $x, next: ($x + 1)} }} 1 | to nuon"
|
|
);
|
|
|
|
assert_eq!(actual.out, "[1, 2, 3]");
|
|
}
|
|
|
|
#[test]
|
|
fn generate_null_break() {
|
|
let actual = nu!("generate {|x| if $x <= 3 { {out: $x, next: ($x + 1)} }} 1 | to nuon");
|
|
|
|
assert_eq!(actual.out, "[1, 2, 3]");
|
|
}
|
|
|
|
#[test]
|
|
fn generate_allows_empty_output() {
|
|
let actual = nu!(pipeline(
|
|
r#"
|
|
generate {|x|
|
|
if $x == 1 {
|
|
{next: ($x + 1)}
|
|
} else if $x < 3 {
|
|
{out: $x, next: ($x + 1)}
|
|
}
|
|
} 0 | to nuon
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual.out, "[0, 2]");
|
|
}
|
|
|
|
#[test]
|
|
fn generate_allows_no_output() {
|
|
let actual = nu!(pipeline(
|
|
r#"
|
|
generate {|x|
|
|
if $x < 3 {
|
|
{next: ($x + 1)}
|
|
}
|
|
} 0 | to nuon
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual.out, "[]");
|
|
}
|
|
|
|
#[test]
|
|
fn generate_allows_null_state() {
|
|
let actual = nu!(pipeline(
|
|
r#"
|
|
generate {|x|
|
|
if $x == null {
|
|
{out: "done"}
|
|
} else if $x < 1 {
|
|
{out: "going", next: ($x + 1)}
|
|
} else {
|
|
{out: "stopping", next: null}
|
|
}
|
|
} 0 | to nuon
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual.out, "[going, stopping, done]");
|
|
}
|
|
|
|
#[test]
|
|
fn generate_allows_null_output() {
|
|
let actual = nu!(pipeline(
|
|
r#"
|
|
generate {|x|
|
|
if $x == 3 {
|
|
{out: "done"}
|
|
} else {
|
|
{out: null, next: ($x + 1)}
|
|
}
|
|
} 0 | to nuon
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual.out, "[null, null, null, done]");
|
|
}
|
|
|
|
#[test]
|
|
fn generate_disallows_extra_keys() {
|
|
let actual = nu!("generate {|x| {foo: bar, out: $x}} 0 ");
|
|
assert!(actual.err.contains("Invalid block return"));
|
|
}
|
|
|
|
#[test]
|
|
fn generate_disallows_list() {
|
|
let actual = nu!("generate {|x| [$x, ($x + 1)]} 0 ");
|
|
assert!(actual.err.contains("Invalid block return"));
|
|
}
|
|
|
|
#[test]
|
|
fn generate_disallows_primitive() {
|
|
let actual = nu!("generate {|x| 1} 0");
|
|
assert!(actual.err.contains("Invalid block return"));
|
|
}
|
|
|
|
#[test]
|
|
fn generate_allow_default_parameter() {
|
|
let actual = nu!(pipeline(
|
|
r#"
|
|
generate {|x = 0|
|
|
if $x == 3 {
|
|
{out: "done"}
|
|
} else {
|
|
{out: null, next: ($x + 1)}
|
|
}
|
|
} | to nuon
|
|
"#
|
|
));
|
|
|
|
assert_eq!(actual.out, "[null, null, null, done]");
|
|
|
|
// if initial is given, use initial value
|
|
let actual = nu!(pipeline(
|
|
r#"
|
|
generate {|x = 0|
|
|
if $x == 3 {
|
|
{out: "done"}
|
|
} else {
|
|
{out: null, next: ($x + 1)}
|
|
}
|
|
} 1 | to nuon
|
|
"#
|
|
));
|
|
assert_eq!(actual.out, "[null, null, done]");
|
|
}
|
|
|
|
#[test]
|
|
fn generate_raise_error_on_no_default_parameter_closure_and_init_val() {
|
|
let actual = nu!(pipeline(
|
|
r#"
|
|
generate {|x|
|
|
if $x == 3 {
|
|
{out: "done"}
|
|
} else {
|
|
{out: null, next: ($x + 1)}
|
|
}
|
|
} | to nuon
|
|
"#
|
|
));
|
|
assert!(actual.err.contains("The initial value is missing"));
|
|
}
|