Finish adding tests

This commit is contained in:
Sam Mohr 2024-11-02 21:58:25 -07:00
parent 71b1fdebc4
commit de124ecc3e
No known key found for this signature in database
GPG key ID: EA41D161A3C1BC99
13 changed files with 196 additions and 38 deletions

View file

@ -806,25 +806,25 @@ mod test_can {
fn try_desugar_plain_prefix() {
let src = indoc!(
r#"
try parseData str
try Str.toU64 "123"
"#
);
let arena = Bump::new();
let out = can_expr_with(&arena, test_home(), src);
assert_eq!(out.problems.len(), 0);
assert_eq!(out.problems, Vec::new());
// Assert that we desugar to:
//
// when parseData str is
// Ok 0 -> 0
// Err 1 -> return Err 1
// when Str.toU64 "123" is
// Ok `0` -> `0`
// Err `1` -> return Err `1`
let (cond_expr, branches) = assert_when(&out.loc_expr.value);
let cond_args = assert_func_call(cond_expr, "parseData", CalledVia::Try, &out.interns);
let cond_args = assert_func_call(cond_expr, "toU64", CalledVia::Try, &out.interns);
assert_eq!(cond_args.len(), 1);
assert_var_usage(&cond_args[0].1.value, "str", &out.interns);
assert_str_value(&cond_args[0].1.value, "123");
assert_eq!(branches.len(), 2);
@ -880,25 +880,25 @@ mod test_can {
fn try_desugar_pipe_prefix() {
let src = indoc!(
r#"
str |> try parseData
"123" |> try Str.toU64
"#
);
let arena = Bump::new();
let out = can_expr_with(&arena, test_home(), src);
assert_eq!(out.problems.len(), 0);
assert_eq!(out.problems, Vec::new());
// Assert that we desugar to:
//
// when parseData str is
// Ok 0 -> 0
// Err 1 -> return Err 1
// when Str.toU64 "123" is
// Ok `0` -> `0`
// Err `1` -> return Err `1`
let (cond_expr, branches) = assert_when(&out.loc_expr.value);
let cond_args = assert_func_call(cond_expr, "parseData", CalledVia::Try, &out.interns);
let cond_args = assert_func_call(cond_expr, "toU64", CalledVia::Try, &out.interns);
assert_eq!(cond_args.len(), 1);
assert_var_usage(&cond_args[0].1.value, "str", &out.interns);
assert_str_value(&cond_args[0].1.value, "123");
assert_eq!(branches.len(), 2);
@ -954,25 +954,25 @@ mod test_can {
fn try_desugar_pipe_suffix() {
let src = indoc!(
r#"
parseData str |> try
Str.toU64 "123" |> try
"#
);
let arena = Bump::new();
let out = can_expr_with(&arena, test_home(), src);
assert_eq!(out.problems.len(), 0);
assert_eq!(out.problems, Vec::new());
// Assert that we desugar to:
//
// when parseData str is
// Ok 0 -> 0
// Err 1 -> return Err 1
// when Str.toU64 "123" is
// Ok `0` -> `0`
// Err `1` -> return Err `1`
let (cond_expr, branches) = assert_when(&out.loc_expr.value);
let cond_args = assert_func_call(cond_expr, "parseData", CalledVia::Try, &out.interns);
let cond_args = assert_func_call(cond_expr, "toU64", CalledVia::Space, &out.interns);
assert_eq!(cond_args.len(), 1);
assert_var_usage(&cond_args[0].1.value, "str", &out.interns);
assert_str_value(&cond_args[0].1.value, "123");
assert_eq!(branches.len(), 2);
@ -1028,28 +1028,52 @@ mod test_can {
fn try_desugar_works_elsewhere() {
let src = indoc!(
r#"
try = \result, fallible ->
when result is
Ok ok -> fallible ok
Err err -> Err err
try input
when Foo 123 is
Foo try -> try
"#
);
let arena = Bump::new();
let out = can_expr_with(&arena, test_home(), src);
assert_eq!(out.problems.len(), 0);
assert_eq!(out.problems, Vec::new());
// Assert that we don't treat `try` as a keyword here
// by desugaring to:
//
// try = \result, fallible ->
// when result is
// Ok ok -> fallible ok
// Err err -> Err err
// when Foo 123 is
// Foo try -> try
assert!(false, "TODO");
let (cond_expr, branches) = assert_when(&out.loc_expr.value);
match cond_expr {
Expr::Tag {
name, arguments, ..
} => {
assert_eq!(name.0.to_string(), "Foo");
assert_eq!(arguments.len(), 1);
assert_num_value(&arguments[0].1.value, 123);
}
_ => panic!("cond_expr was not a Tag: {:?}", cond_expr),
}
assert_eq!(branches.len(), 1);
assert_eq!(branches[0].patterns.len(), 1);
assert!(!branches[0].patterns[0].degenerate);
match &branches[0].patterns[0].pattern.value {
Pattern::AppliedTag {
tag_name,
arguments,
..
} => {
assert_eq!(tag_name.0.to_string(), "Foo");
assert_eq!(arguments.len(), 1);
assert_pattern_name(&arguments[0].1.value, "try", &out.interns);
}
other => panic!("First argument was not an applied tag: {:?}", other),
}
assert_var_usage(&branches[0].value.value, "try", &out.interns);
assert!(&branches[0].guard.is_none());
}
fn assert_num_value(expr: &Expr, num: usize) {
@ -1061,6 +1085,15 @@ mod test_can {
}
}
fn assert_str_value(expr: &Expr, str_val: &str) {
match expr {
Expr::Str(str_expr) => {
assert_eq!(&**str_expr, str_val)
}
_ => panic!("Expr wasn't a Str with value {str_val}: {:?}", expr),
}
}
fn assert_var_usage(expr: &Expr, name: &str, interns: &roc_module::symbol::Interns) {
match expr {
Expr::Var(sym, _) => assert_eq!(sym.as_str(interns), name),
@ -1086,7 +1119,10 @@ mod test_can {
args.clone()
}
_ => panic!("Expr was not a RecordBuilder Call: {:?}", expr),
_ => panic!(
"Expr was not a Call with CalledVia={:?}: {:?}",
called_via, expr
),
}
}

View file

@ -96,10 +96,7 @@ SpaceAfter(
"",
),
@50-74 Apply(
@50-53 Var {
module_name: "",
ident: "try",
},
@50-53 Try,
[
@54-57 Var {
module_name: "",

View file

@ -0,0 +1,2 @@
"123"
|> try Str.toU64

View file

@ -0,0 +1,32 @@
SpaceAfter(
BinOps(
[
(
@0-5 SpaceAfter(
Str(
PlainLine(
"123",
),
),
[
Newline,
],
),
@17-19 Pizza,
),
],
@20-33 Apply(
@20-23 Try,
[
@24-33 Var {
module_name: "Str",
ident: "toU64",
},
],
Space,
),
),
[
Newline,
],
)

View file

@ -0,0 +1,2 @@
"123"
|> try Str.toU64

View file

@ -0,0 +1 @@
Str.toU64 "123" |> try

View file

@ -0,0 +1,27 @@
SpaceAfter(
BinOps(
[
(
@0-15 Apply(
@0-9 Var {
module_name: "Str",
ident: "toU64",
},
[
@10-15 Str(
PlainLine(
"123",
),
),
],
Space,
),
@15-17 Pizza,
),
],
@18-21 Try,
),
[
Newline,
],
)

View file

@ -0,0 +1 @@
Str.toU64 "123"|> try

View file

@ -0,0 +1 @@
try Str.toU64 "123"

View file

@ -0,0 +1,20 @@
SpaceAfter(
Apply(
@0-3 Try,
[
@5-14 Var {
module_name: "Str",
ident: "toU64",
},
@16-21 Str(
PlainLine(
"123",
),
),
],
Space,
),
[
Newline,
],
)

View file

@ -0,0 +1 @@
try Str.toU64 "123"

View file

@ -6071,6 +6071,41 @@ mod test_fmt {
);
}
#[test]
fn format_try() {
expr_formats_same(indoc!(
r#"
_ = crash
_ = crash ""
crash "" ""
"#
));
expr_formats_to(
indoc!(
r#"
_ = crash
_ = crash ""
_ = crash "" ""
try
foo
(\_ -> crash "")
"#
),
indoc!(
r#"
_ = crash
_ = crash ""
_ = crash "" ""
try
foo
(\_ -> crash "")
"#
),
);
}
#[test]
fn issue_6197() {
expr_formats_to(

View file

@ -495,6 +495,9 @@ mod test_snapshots {
pass/tag_pattern.expr,
pass/ten_times_eleven.expr,
pass/three_arg_closure.expr,
pass/try_function_after_pipe.expr,
pass/try_pipe_suffix.expr,
pass/try_plain_prefix.expr,
pass/tuple_access_after_ident.expr,
pass/tuple_access_after_record.expr,
pass/tuple_accessor_function.expr,