mirror of
https://github.com/roc-lang/roc.git
synced 2025-11-02 13:58:50 +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() {
|
fn try_desugar_plain_prefix() {
|
||||||
let src = indoc!(
|
let src = indoc!(
|
||||||
r#"
|
r#"
|
||||||
try parseData str
|
try Str.toU64 "123"
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
let arena = Bump::new();
|
let arena = Bump::new();
|
||||||
let out = can_expr_with(&arena, test_home(), src);
|
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:
|
// Assert that we desugar to:
|
||||||
//
|
//
|
||||||
// when parseData str is
|
// when Str.toU64 "123" is
|
||||||
// Ok 0 -> 0
|
// Ok `0` -> `0`
|
||||||
// Err 1 -> return Err 1
|
// Err `1` -> return Err `1`
|
||||||
|
|
||||||
let (cond_expr, branches) = assert_when(&out.loc_expr.value);
|
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_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);
|
assert_eq!(branches.len(), 2);
|
||||||
|
|
||||||
|
|
@ -880,25 +880,25 @@ mod test_can {
|
||||||
fn try_desugar_pipe_prefix() {
|
fn try_desugar_pipe_prefix() {
|
||||||
let src = indoc!(
|
let src = indoc!(
|
||||||
r#"
|
r#"
|
||||||
str |> try parseData
|
"123" |> try Str.toU64
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
let arena = Bump::new();
|
let arena = Bump::new();
|
||||||
let out = can_expr_with(&arena, test_home(), src);
|
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:
|
// Assert that we desugar to:
|
||||||
//
|
//
|
||||||
// when parseData str is
|
// when Str.toU64 "123" is
|
||||||
// Ok 0 -> 0
|
// Ok `0` -> `0`
|
||||||
// Err 1 -> return Err 1
|
// Err `1` -> return Err `1`
|
||||||
|
|
||||||
let (cond_expr, branches) = assert_when(&out.loc_expr.value);
|
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_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);
|
assert_eq!(branches.len(), 2);
|
||||||
|
|
||||||
|
|
@ -954,25 +954,25 @@ mod test_can {
|
||||||
fn try_desugar_pipe_suffix() {
|
fn try_desugar_pipe_suffix() {
|
||||||
let src = indoc!(
|
let src = indoc!(
|
||||||
r#"
|
r#"
|
||||||
parseData str |> try
|
Str.toU64 "123" |> try
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
let arena = Bump::new();
|
let arena = Bump::new();
|
||||||
let out = can_expr_with(&arena, test_home(), src);
|
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:
|
// Assert that we desugar to:
|
||||||
//
|
//
|
||||||
// when parseData str is
|
// when Str.toU64 "123" is
|
||||||
// Ok 0 -> 0
|
// Ok `0` -> `0`
|
||||||
// Err 1 -> return Err 1
|
// Err `1` -> return Err `1`
|
||||||
|
|
||||||
let (cond_expr, branches) = assert_when(&out.loc_expr.value);
|
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_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);
|
assert_eq!(branches.len(), 2);
|
||||||
|
|
||||||
|
|
@ -1028,28 +1028,52 @@ mod test_can {
|
||||||
fn try_desugar_works_elsewhere() {
|
fn try_desugar_works_elsewhere() {
|
||||||
let src = indoc!(
|
let src = indoc!(
|
||||||
r#"
|
r#"
|
||||||
try = \result, fallible ->
|
when Foo 123 is
|
||||||
when result is
|
Foo try -> try
|
||||||
Ok ok -> fallible ok
|
|
||||||
Err err -> Err err
|
|
||||||
|
|
||||||
try input
|
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
let arena = Bump::new();
|
let arena = Bump::new();
|
||||||
let out = can_expr_with(&arena, test_home(), src);
|
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
|
// Assert that we don't treat `try` as a keyword here
|
||||||
// by desugaring to:
|
// by desugaring to:
|
||||||
//
|
//
|
||||||
// try = \result, fallible ->
|
// when Foo 123 is
|
||||||
// when result is
|
// Foo try -> try
|
||||||
// Ok ok -> fallible ok
|
|
||||||
// Err err -> Err err
|
|
||||||
|
|
||||||
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) {
|
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) {
|
fn assert_var_usage(expr: &Expr, name: &str, interns: &roc_module::symbol::Interns) {
|
||||||
match expr {
|
match expr {
|
||||||
Expr::Var(sym, _) => assert_eq!(sym.as_str(interns), name),
|
Expr::Var(sym, _) => assert_eq!(sym.as_str(interns), name),
|
||||||
|
|
@ -1086,7 +1119,10 @@ mod test_can {
|
||||||
|
|
||||||
args.clone()
|
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-74 Apply(
|
||||||
@50-53 Var {
|
@50-53 Try,
|
||||||
module_name: "",
|
|
||||||
ident: "try",
|
|
||||||
},
|
|
||||||
[
|
[
|
||||||
@54-57 Var {
|
@54-57 Var {
|
||||||
module_name: "",
|
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]
|
#[test]
|
||||||
fn issue_6197() {
|
fn issue_6197() {
|
||||||
expr_formats_to(
|
expr_formats_to(
|
||||||
|
|
|
||||||
|
|
@ -495,6 +495,9 @@ mod test_snapshots {
|
||||||
pass/tag_pattern.expr,
|
pass/tag_pattern.expr,
|
||||||
pass/ten_times_eleven.expr,
|
pass/ten_times_eleven.expr,
|
||||||
pass/three_arg_closure.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_ident.expr,
|
||||||
pass/tuple_access_after_record.expr,
|
pass/tuple_access_after_record.expr,
|
||||||
pass/tuple_accessor_function.expr,
|
pass/tuple_accessor_function.expr,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue