mirror of
https://github.com/roc-lang/roc.git
synced 2025-08-04 12:18:19 +00:00
Finish adding tests
This commit is contained in:
parent
71b1fdebc4
commit
de124ecc3e
13 changed files with 196 additions and 38 deletions
|
@ -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
|
||||
),
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -96,10 +96,7 @@ SpaceAfter(
|
|||
"",
|
||||
),
|
||||
@50-74 Apply(
|
||||
@50-53 Var {
|
||||
module_name: "",
|
||||
ident: "try",
|
||||
},
|
||||
@50-53 Try,
|
||||
[
|
||||
@54-57 Var {
|
||||
module_name: "",
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
"123"
|
||||
|> try Str.toU64
|
|
@ -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,
|
||||
],
|
||||
)
|
|
@ -0,0 +1,2 @@
|
|||
"123"
|
||||
|> try Str.toU64
|
|
@ -0,0 +1 @@
|
|||
Str.toU64 "123" |> try
|
|
@ -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,
|
||||
],
|
||||
)
|
|
@ -0,0 +1 @@
|
|||
Str.toU64 "123"|> try
|
|
@ -0,0 +1 @@
|
|||
try Str.toU64 "123"
|
|
@ -0,0 +1,20 @@
|
|||
SpaceAfter(
|
||||
Apply(
|
||||
@0-3 Try,
|
||||
[
|
||||
@5-14 Var {
|
||||
module_name: "Str",
|
||||
ident: "toU64",
|
||||
},
|
||||
@16-21 Str(
|
||||
PlainLine(
|
||||
"123",
|
||||
),
|
||||
),
|
||||
],
|
||||
Space,
|
||||
),
|
||||
[
|
||||
Newline,
|
||||
],
|
||||
)
|
|
@ -0,0 +1 @@
|
|||
try Str.toU64 "123"
|
|
@ -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(
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue