mirror of
https://github.com/roc-lang/roc.git
synced 2025-10-03 16:44:33 +00:00
move files over
This commit is contained in:
parent
f91443100f
commit
b6373c4efb
12 changed files with 2018 additions and 1983 deletions
23
Cargo.lock
generated
23
Cargo.lock
generated
|
@ -4748,6 +4748,29 @@ dependencies = [
|
||||||
"syn 1.0.76",
|
"syn 1.0.76",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "test_wasm"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"bumpalo",
|
||||||
|
"indoc 0.3.6",
|
||||||
|
"libc",
|
||||||
|
"parity-wasm",
|
||||||
|
"pretty_assertions 0.5.1",
|
||||||
|
"roc_builtins",
|
||||||
|
"roc_can",
|
||||||
|
"roc_collections",
|
||||||
|
"roc_gen_wasm",
|
||||||
|
"roc_load",
|
||||||
|
"roc_module",
|
||||||
|
"roc_std",
|
||||||
|
"roc_types",
|
||||||
|
"target-lexicon",
|
||||||
|
"tempfile",
|
||||||
|
"wasmer",
|
||||||
|
"wasmer-wasi",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "textwrap"
|
name = "textwrap"
|
||||||
version = "0.11.0"
|
version = "0.11.0"
|
||||||
|
|
|
@ -24,6 +24,7 @@ members = [
|
||||||
"compiler/build",
|
"compiler/build",
|
||||||
"compiler/arena_pool",
|
"compiler/arena_pool",
|
||||||
"compiler/test_gen",
|
"compiler/test_gen",
|
||||||
|
"compiler/test_wasm",
|
||||||
"vendor/ena",
|
"vendor/ena",
|
||||||
"vendor/inkwell",
|
"vendor/inkwell",
|
||||||
"vendor/pathfinding",
|
"vendor/pathfinding",
|
||||||
|
|
|
@ -7,8 +7,6 @@ pub mod opcodes;
|
||||||
pub mod serialize;
|
pub mod serialize;
|
||||||
mod storage;
|
mod storage;
|
||||||
|
|
||||||
mod tests;
|
|
||||||
|
|
||||||
use bumpalo::{self, collections::Vec, Bump};
|
use bumpalo::{self, collections::Vec, Bump};
|
||||||
use parity_wasm::builder;
|
use parity_wasm::builder;
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -1,916 +0,0 @@
|
||||||
#[macro_use]
|
|
||||||
extern crate indoc;
|
|
||||||
|
|
||||||
#[macro_use]
|
|
||||||
mod helpers;
|
|
||||||
|
|
||||||
#[cfg(all(test, target_os = "linux", any(target_arch = "x86_64"/*, target_arch = "aarch64"*/)))]
|
|
||||||
mod wasm_records {
|
|
||||||
// #[test]
|
|
||||||
// fn basic_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { y: 17, x: 15, z: 19 }.x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 15,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x: 15, y: 17, z: 19 }.y
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 17,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x: 15, y: 17, z: 19 }.z
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 19,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[test]
|
|
||||||
// fn nested_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 15,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.y.a
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 12,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.y.b
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 15,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.y.c
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 2,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.z
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 19,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[test]
|
|
||||||
// fn f64_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { y: 17.2, x: 15.1, z: 19.3 }
|
|
||||||
//
|
|
||||||
// rec.x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 15.1,
|
|
||||||
// f64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { y: 17.2, x: 15.1, z: 19.3 }
|
|
||||||
//
|
|
||||||
// rec.y
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 17.2,
|
|
||||||
// f64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { y: 17.2, x: 15.1, z: 19.3 }
|
|
||||||
//
|
|
||||||
// rec.z
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 19.3,
|
|
||||||
// f64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn fn_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// getRec = \x -> { y: 17, x, z: 19 }
|
|
||||||
|
|
||||||
// (getRec 15).x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 15,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { x: 15, y: 17, z: 19 }
|
|
||||||
|
|
||||||
// rec.y
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 17,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { x: 15, y: 17, z: 19 }
|
|
||||||
|
|
||||||
// rec.z
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 19,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { x: 15, y: 17, z: 19 }
|
|
||||||
|
|
||||||
// rec.z + rec.x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 34,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn def_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { y: 17, x: 15, z: 19 }
|
|
||||||
//
|
|
||||||
// rec.x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 15,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { x: 15, y: 17, z: 19 }
|
|
||||||
//
|
|
||||||
// rec.y
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 17,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
//
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { x: 15, y: 17, z: 19 }
|
|
||||||
//
|
|
||||||
// rec.z
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 19,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[test]
|
|
||||||
// fn when_on_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// when { x: 0x2 } is
|
|
||||||
// { x } -> x + 3
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 5,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[test]
|
|
||||||
// fn when_record_with_guard_pattern() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// when { x: 0x2, y: 3.14 } is
|
|
||||||
// { x: var } -> var + 3
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 5,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[test]
|
|
||||||
// fn let_with_record_pattern() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { x } = { x: 0x2, y: 3.14 }
|
|
||||||
//
|
|
||||||
// x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 2,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[test]
|
|
||||||
// fn record_guard_pattern() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// when { x: 0x2, y: 3.14 } is
|
|
||||||
// { x: 0x4 } -> 5
|
|
||||||
// { x } -> x + 3
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 5,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// #[test]
|
|
||||||
// fn twice_record_access() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// x = {a: 0x2, b: 0x3 }
|
|
||||||
//
|
|
||||||
// x.a + x.b
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 5,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
// #[test]
|
|
||||||
// fn empty_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// v = {}
|
|
||||||
//
|
|
||||||
// v
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// (),
|
|
||||||
// ()
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn i64_record1_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ x: 3 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
3,
|
|
||||||
i64
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn i64_record2_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ x: 3, y: 5 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(3, 5),
|
|
||||||
(i64, i64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn i64_record3_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ x: 3, y: 5, z: 17 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(3, 5, 17),
|
|
||||||
(i64, i64, i64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn f64_record2_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ x: 3.1, y: 5.1 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(3.1, 5.1),
|
|
||||||
(f64, f64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn f64_record3_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ x: 3.1, y: 5.1, z: 17.1 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(3.1, 5.1, 17.1),
|
|
||||||
(f64, f64, f64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn bool_record4_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
record : { a : Bool, b : Bool, c : Bool, d : Bool }
|
|
||||||
record = { a: True, b: False, c : False, d : True }
|
|
||||||
|
|
||||||
record
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
[true, false, false, true],
|
|
||||||
[bool; 4]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn i64_record9_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 3, b: 5, c: 17, d: 1, e: 9, f: 12, g: 13, h: 14, i: 15 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
[3, 5, 17, 1, 9, 12, 13, 14, 15],
|
|
||||||
[i64; 9]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn bool_literal() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
x : Bool
|
|
||||||
x = True
|
|
||||||
|
|
||||||
x
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
true,
|
|
||||||
bool
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_when_use_default() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// app "test" provides [ main ] to "./platform"
|
|
||||||
|
|
||||||
// f = \r ->
|
|
||||||
// when r is
|
|
||||||
// { x: Blue, y ? 3 } -> y
|
|
||||||
// { x: Red, y ? 5 } -> y
|
|
||||||
|
|
||||||
// main =
|
|
||||||
// a = f { x: Blue, y: 7 }
|
|
||||||
// b = f { x: Blue }
|
|
||||||
// c = f { x: Red, y: 11 }
|
|
||||||
// d = f { x: Red }
|
|
||||||
|
|
||||||
// a * b * c * d
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 3 * 5 * 7 * 11,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_when_use_default_nested() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// f = \r ->
|
|
||||||
// when r is
|
|
||||||
// { x: Blue, y ? 3 } -> y
|
|
||||||
// { x: Red, y ? 5 } -> y
|
|
||||||
|
|
||||||
// a = f { x: Blue, y: 7 }
|
|
||||||
// b = f { x: Blue }
|
|
||||||
// c = f { x: Red, y: 11 }
|
|
||||||
// d = f { x: Red }
|
|
||||||
|
|
||||||
// a * b * c * d
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 3 * 5 * 7 * 11,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_when_no_use_default() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// app "test" provides [ main ] to "./platform"
|
|
||||||
|
|
||||||
// f = \r ->
|
|
||||||
// { x ? 10, y } = r
|
|
||||||
// x + y
|
|
||||||
|
|
||||||
// main =
|
|
||||||
// f { x: 4, y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 13,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_when_no_use_default_nested() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// f = \r ->
|
|
||||||
// { x ? 10, y } = r
|
|
||||||
// x + y
|
|
||||||
|
|
||||||
// f { x: 4, y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 13,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_let_use_default() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// app "test" provides [ main ] to "./platform"
|
|
||||||
|
|
||||||
// f = \r ->
|
|
||||||
// { x ? 10, y } = r
|
|
||||||
// x + y
|
|
||||||
|
|
||||||
// main =
|
|
||||||
// f { y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 19,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_let_no_use_default() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// app "test" provides [ main ] to "./platform"
|
|
||||||
|
|
||||||
// f = \r ->
|
|
||||||
// { x ? 10, y } = r
|
|
||||||
// x + y
|
|
||||||
|
|
||||||
// main =
|
|
||||||
// f { x: 4, y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 13,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_let_no_use_default_nested() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// f = \r ->
|
|
||||||
// { x ? 10, y } = r
|
|
||||||
// x + y
|
|
||||||
|
|
||||||
// f { x: 4, y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 13,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_function_use_default() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// f = \{ x ? 10, y } -> x + y
|
|
||||||
|
|
||||||
// f { y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 19,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// #[ignore]
|
|
||||||
// fn optional_field_function_no_use_default() {
|
|
||||||
// // blocked on https://github.com/rtfeldman/roc/issues/786
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// app "test" provides [ main ] to "./platform"
|
|
||||||
|
|
||||||
// f = \{ x ? 10, y } -> x + y
|
|
||||||
|
|
||||||
// main =
|
|
||||||
// f { x: 4, y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 13,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// #[ignore]
|
|
||||||
// fn optional_field_function_no_use_default_nested() {
|
|
||||||
// // blocked on https://github.com/rtfeldman/roc/issues/786
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// f = \{ x ? 10, y } -> x + y
|
|
||||||
|
|
||||||
// f { x: 4, y: 9 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 13,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_singleton_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// when { x : 4 } is
|
|
||||||
// { x ? 3 } -> x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 4,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn optional_field_empty_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// when { } is
|
|
||||||
// { x ? 3 } -> x
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 3,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_3() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ x: 3, y: 5, z: 4 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(3, 5, 4),
|
|
||||||
(i64, i64, i64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_4() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 3, b: 5, c: 4, d: 2 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
[3, 5, 4, 2],
|
|
||||||
[i64; 4]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_5() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 3, b: 5, c: 4, d: 2, e: 1 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
[3, 5, 4, 2, 1],
|
|
||||||
[i64; 5]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_6() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 3, b: 5, c: 4, d: 2, e: 1, f: 7 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
[3, 5, 4, 2, 1, 7],
|
|
||||||
[i64; 6]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_7() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 3, b: 5, c: 4, d: 2, e: 1, f: 7, g: 8 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
[3, 5, 4, 2, 1, 7, 8],
|
|
||||||
[i64; 7]
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_float_int() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 3.14, b: 0x1 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(3.14, 0x1),
|
|
||||||
(f64, i64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_int_float() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 0x1, b: 3.14 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(0x1, 3.14),
|
|
||||||
(i64, f64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_float_float() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 6.28, b: 3.14 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(6.28, 3.14),
|
|
||||||
(f64, f64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn return_record_float_float_float() {
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
{ a: 6.28, b: 3.14, c: 0.1 }
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(6.28, 3.14, 0.1),
|
|
||||||
(f64, f64, f64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn return_nested_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// { flag: 0x0, payload: { a: 6.28, b: 3.14, c: 0.1 } }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// (0x0, (6.28, 3.14, 0.1)),
|
|
||||||
// (i64, (f64, f64, f64))
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn accessor() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// .foo { foo: 4 } + .foo { bar: 6.28, foo: 3 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 7,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn accessor_single_element_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// .foo { foo: 4 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 4,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn update_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { foo: 42, bar: 6 }
|
|
||||||
|
|
||||||
// { rec & foo: rec.foo + 1 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// (6, 43),
|
|
||||||
// (i64, i64)
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn update_single_element_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// rec = { foo: 42}
|
|
||||||
|
|
||||||
// { rec & foo: rec.foo + 1 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 43,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn booleans_in_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!("{ x: 1 == 1, y: 1 == 1 }"),
|
|
||||||
// (true, true),
|
|
||||||
// (bool, bool)
|
|
||||||
// );
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!("{ x: 1 != 1, y: 1 == 1 }"),
|
|
||||||
// (false, true),
|
|
||||||
// (bool, bool)
|
|
||||||
// );
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!("{ x: 1 == 1, y: 1 != 1 }"),
|
|
||||||
// (true, false),
|
|
||||||
// (bool, bool)
|
|
||||||
// );
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!("{ x: 1 != 1, y: 1 != 1 }"),
|
|
||||||
// (false, false),
|
|
||||||
// (bool, bool)
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn alignment_in_record() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!("{ c: 32, b: if True then Red else if True then Green else Blue, a: 1 == 1 }"),
|
|
||||||
// (32i64, true, 2u8),
|
|
||||||
// (i64, bool, u8)
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn stack_memory_return_from_branch() {
|
|
||||||
// stack memory pointer should end up in the right place after returning from a branch
|
|
||||||
assert_evals_to!(
|
|
||||||
indoc!(
|
|
||||||
r#"
|
|
||||||
stackMemoryJunk = { x: 999, y: 111 }
|
|
||||||
if True then
|
|
||||||
{ x: 123, y: 321 }
|
|
||||||
else
|
|
||||||
stackMemoryJunk
|
|
||||||
"#
|
|
||||||
),
|
|
||||||
(123, 321),
|
|
||||||
(i64, i64)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn blue_and_present() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// f = \r ->
|
|
||||||
// when r is
|
|
||||||
// { x: Blue, y ? 3 } -> y
|
|
||||||
// { x: Red, y ? 5 } -> y
|
|
||||||
|
|
||||||
// f { x: Blue, y: 7 }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 7,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
|
|
||||||
// #[test]
|
|
||||||
// fn blue_and_absent() {
|
|
||||||
// assert_evals_to!(
|
|
||||||
// indoc!(
|
|
||||||
// r#"
|
|
||||||
// f = \r ->
|
|
||||||
// when r is
|
|
||||||
// { x: Blue, y ? 3 } -> y
|
|
||||||
// { x: Red, y ? 5 } -> y
|
|
||||||
|
|
||||||
// f { x: Blue }
|
|
||||||
// "#
|
|
||||||
// ),
|
|
||||||
// 3,
|
|
||||||
// i64
|
|
||||||
// );
|
|
||||||
// }
|
|
||||||
}
|
|
31
compiler/test_wasm/Cargo.toml
Normal file
31
compiler/test_wasm/Cargo.toml
Normal file
|
@ -0,0 +1,31 @@
|
||||||
|
[package]
|
||||||
|
name = "test_wasm"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
# roc_module = { path = "../module" }
|
||||||
|
# roc_mono = { path = "../mono" }
|
||||||
|
|
||||||
|
# # TODO: switch to parity-wasm 0.44 once it's out (allows bumpalo vectors in some places)
|
||||||
|
parity-wasm = { git = "https://github.com/brian-carroll/parity-wasm", branch = "master" }
|
||||||
|
|
||||||
|
wasmer = "2.0.0"
|
||||||
|
wasmer-wasi = "2.0.0"
|
||||||
|
|
||||||
|
roc_collections = { path = "../collections" }
|
||||||
|
roc_std = { path = "../../roc_std" }
|
||||||
|
bumpalo = { version = "3.6.1", features = ["collections"] }
|
||||||
|
roc_gen_wasm = { path = "../gen_wasm" }
|
||||||
|
roc_can = { path = "../can" }
|
||||||
|
roc_builtins = { path = "../builtins" }
|
||||||
|
roc_load = { path = "../load" }
|
||||||
|
roc_types = { path = "../types" }
|
||||||
|
roc_module = { path = "../module" }
|
||||||
|
indoc = "0.3.3"
|
||||||
|
pretty_assertions = "0.5.1"
|
||||||
|
libc = "0.2"
|
||||||
|
target-lexicon = "0.12.2"
|
||||||
|
tempfile = "3.1.0"
|
|
@ -1,5 +1,3 @@
|
||||||
extern crate bumpalo;
|
|
||||||
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
pub mod eval;
|
pub mod eval;
|
||||||
pub mod wasm32_test_result;
|
pub mod wasm32_test_result;
|
1052
compiler/test_wasm/src/wasm_num.rs
Normal file
1052
compiler/test_wasm/src/wasm_num.rs
Normal file
File diff suppressed because it is too large
Load diff
911
compiler/test_wasm/src/wasm_records.rs
Normal file
911
compiler/test_wasm/src/wasm_records.rs
Normal file
|
@ -0,0 +1,911 @@
|
||||||
|
#![cfg(all(test, target_os = "linux", any(target_arch = "x86_64"/*, target_arch = "aarch64"*/)))]
|
||||||
|
use crate::assert_evals_to;
|
||||||
|
use indoc::indoc;
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn basic_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { y: 17, x: 15, z: 19 }.x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 15,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x: 15, y: 17, z: 19 }.y
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 17,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x: 15, y: 17, z: 19 }.z
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 19,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[test]
|
||||||
|
// fn nested_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 15,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.y.a
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 12,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.y.b
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 15,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.y.c
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 2,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x: 15, y: { a: 12, b: 15, c: 2}, z: 19 }.z
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 19,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[test]
|
||||||
|
// fn f64_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { y: 17.2, x: 15.1, z: 19.3 }
|
||||||
|
//
|
||||||
|
// rec.x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 15.1,
|
||||||
|
// f64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { y: 17.2, x: 15.1, z: 19.3 }
|
||||||
|
//
|
||||||
|
// rec.y
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 17.2,
|
||||||
|
// f64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { y: 17.2, x: 15.1, z: 19.3 }
|
||||||
|
//
|
||||||
|
// rec.z
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 19.3,
|
||||||
|
// f64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn fn_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// getRec = \x -> { y: 17, x, z: 19 }
|
||||||
|
|
||||||
|
// (getRec 15).x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 15,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { x: 15, y: 17, z: 19 }
|
||||||
|
|
||||||
|
// rec.y
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 17,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { x: 15, y: 17, z: 19 }
|
||||||
|
|
||||||
|
// rec.z
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 19,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { x: 15, y: 17, z: 19 }
|
||||||
|
|
||||||
|
// rec.z + rec.x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 34,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn def_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { y: 17, x: 15, z: 19 }
|
||||||
|
//
|
||||||
|
// rec.x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 15,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { x: 15, y: 17, z: 19 }
|
||||||
|
//
|
||||||
|
// rec.y
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 17,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
//
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { x: 15, y: 17, z: 19 }
|
||||||
|
//
|
||||||
|
// rec.z
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 19,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[test]
|
||||||
|
// fn when_on_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// when { x: 0x2 } is
|
||||||
|
// { x } -> x + 3
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 5,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[test]
|
||||||
|
// fn when_record_with_guard_pattern() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// when { x: 0x2, y: 3.14 } is
|
||||||
|
// { x: var } -> var + 3
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 5,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[test]
|
||||||
|
// fn let_with_record_pattern() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { x } = { x: 0x2, y: 3.14 }
|
||||||
|
//
|
||||||
|
// x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 2,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[test]
|
||||||
|
// fn record_guard_pattern() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// when { x: 0x2, y: 3.14 } is
|
||||||
|
// { x: 0x4 } -> 5
|
||||||
|
// { x } -> x + 3
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 5,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// #[test]
|
||||||
|
// fn twice_record_access() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// x = {a: 0x2, b: 0x3 }
|
||||||
|
//
|
||||||
|
// x.a + x.b
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 5,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
// #[test]
|
||||||
|
// fn empty_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// v = {}
|
||||||
|
//
|
||||||
|
// v
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// (),
|
||||||
|
// ()
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn i64_record1_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ x: 3 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
3,
|
||||||
|
i64
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn i64_record2_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ x: 3, y: 5 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(3, 5),
|
||||||
|
(i64, i64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn i64_record3_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ x: 3, y: 5, z: 17 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(3, 5, 17),
|
||||||
|
(i64, i64, i64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn f64_record2_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ x: 3.1, y: 5.1 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(3.1, 5.1),
|
||||||
|
(f64, f64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn f64_record3_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ x: 3.1, y: 5.1, z: 17.1 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(3.1, 5.1, 17.1),
|
||||||
|
(f64, f64, f64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bool_record4_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
record : { a : Bool, b : Bool, c : Bool, d : Bool }
|
||||||
|
record = { a: True, b: False, c : False, d : True }
|
||||||
|
|
||||||
|
record
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
[true, false, false, true],
|
||||||
|
[bool; 4]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn i64_record9_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 3, b: 5, c: 17, d: 1, e: 9, f: 12, g: 13, h: 14, i: 15 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
[3, 5, 17, 1, 9, 12, 13, 14, 15],
|
||||||
|
[i64; 9]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn bool_literal() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
x : Bool
|
||||||
|
x = True
|
||||||
|
|
||||||
|
x
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
true,
|
||||||
|
bool
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_when_use_default() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// app "test" provides [ main ] to "./platform"
|
||||||
|
|
||||||
|
// f = \r ->
|
||||||
|
// when r is
|
||||||
|
// { x: Blue, y ? 3 } -> y
|
||||||
|
// { x: Red, y ? 5 } -> y
|
||||||
|
|
||||||
|
// main =
|
||||||
|
// a = f { x: Blue, y: 7 }
|
||||||
|
// b = f { x: Blue }
|
||||||
|
// c = f { x: Red, y: 11 }
|
||||||
|
// d = f { x: Red }
|
||||||
|
|
||||||
|
// a * b * c * d
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 3 * 5 * 7 * 11,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_when_use_default_nested() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// f = \r ->
|
||||||
|
// when r is
|
||||||
|
// { x: Blue, y ? 3 } -> y
|
||||||
|
// { x: Red, y ? 5 } -> y
|
||||||
|
|
||||||
|
// a = f { x: Blue, y: 7 }
|
||||||
|
// b = f { x: Blue }
|
||||||
|
// c = f { x: Red, y: 11 }
|
||||||
|
// d = f { x: Red }
|
||||||
|
|
||||||
|
// a * b * c * d
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 3 * 5 * 7 * 11,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_when_no_use_default() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// app "test" provides [ main ] to "./platform"
|
||||||
|
|
||||||
|
// f = \r ->
|
||||||
|
// { x ? 10, y } = r
|
||||||
|
// x + y
|
||||||
|
|
||||||
|
// main =
|
||||||
|
// f { x: 4, y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 13,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_when_no_use_default_nested() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// f = \r ->
|
||||||
|
// { x ? 10, y } = r
|
||||||
|
// x + y
|
||||||
|
|
||||||
|
// f { x: 4, y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 13,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_let_use_default() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// app "test" provides [ main ] to "./platform"
|
||||||
|
|
||||||
|
// f = \r ->
|
||||||
|
// { x ? 10, y } = r
|
||||||
|
// x + y
|
||||||
|
|
||||||
|
// main =
|
||||||
|
// f { y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 19,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_let_no_use_default() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// app "test" provides [ main ] to "./platform"
|
||||||
|
|
||||||
|
// f = \r ->
|
||||||
|
// { x ? 10, y } = r
|
||||||
|
// x + y
|
||||||
|
|
||||||
|
// main =
|
||||||
|
// f { x: 4, y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 13,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_let_no_use_default_nested() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// f = \r ->
|
||||||
|
// { x ? 10, y } = r
|
||||||
|
// x + y
|
||||||
|
|
||||||
|
// f { x: 4, y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 13,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_function_use_default() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// f = \{ x ? 10, y } -> x + y
|
||||||
|
|
||||||
|
// f { y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 19,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// #[ignore]
|
||||||
|
// fn optional_field_function_no_use_default() {
|
||||||
|
// // blocked on https://github.com/rtfeldman/roc/issues/786
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// app "test" provides [ main ] to "./platform"
|
||||||
|
|
||||||
|
// f = \{ x ? 10, y } -> x + y
|
||||||
|
|
||||||
|
// main =
|
||||||
|
// f { x: 4, y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 13,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// #[ignore]
|
||||||
|
// fn optional_field_function_no_use_default_nested() {
|
||||||
|
// // blocked on https://github.com/rtfeldman/roc/issues/786
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// f = \{ x ? 10, y } -> x + y
|
||||||
|
|
||||||
|
// f { x: 4, y: 9 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 13,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_singleton_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// when { x : 4 } is
|
||||||
|
// { x ? 3 } -> x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 4,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn optional_field_empty_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// when { } is
|
||||||
|
// { x ? 3 } -> x
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 3,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_3() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ x: 3, y: 5, z: 4 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(3, 5, 4),
|
||||||
|
(i64, i64, i64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_4() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 3, b: 5, c: 4, d: 2 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
[3, 5, 4, 2],
|
||||||
|
[i64; 4]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_5() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 3, b: 5, c: 4, d: 2, e: 1 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
[3, 5, 4, 2, 1],
|
||||||
|
[i64; 5]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_6() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 3, b: 5, c: 4, d: 2, e: 1, f: 7 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
[3, 5, 4, 2, 1, 7],
|
||||||
|
[i64; 6]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_7() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 3, b: 5, c: 4, d: 2, e: 1, f: 7, g: 8 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
[3, 5, 4, 2, 1, 7, 8],
|
||||||
|
[i64; 7]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_float_int() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 3.14, b: 0x1 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(3.14, 0x1),
|
||||||
|
(f64, i64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_int_float() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 0x1, b: 3.14 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(0x1, 3.14),
|
||||||
|
(i64, f64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_float_float() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 6.28, b: 3.14 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(6.28, 3.14),
|
||||||
|
(f64, f64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn return_record_float_float_float() {
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
{ a: 6.28, b: 3.14, c: 0.1 }
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(6.28, 3.14, 0.1),
|
||||||
|
(f64, f64, f64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn return_nested_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// { flag: 0x0, payload: { a: 6.28, b: 3.14, c: 0.1 } }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// (0x0, (6.28, 3.14, 0.1)),
|
||||||
|
// (i64, (f64, f64, f64))
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn accessor() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// .foo { foo: 4 } + .foo { bar: 6.28, foo: 3 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 7,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn accessor_single_element_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// .foo { foo: 4 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 4,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn update_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { foo: 42, bar: 6 }
|
||||||
|
|
||||||
|
// { rec & foo: rec.foo + 1 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// (6, 43),
|
||||||
|
// (i64, i64)
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn update_single_element_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// rec = { foo: 42}
|
||||||
|
|
||||||
|
// { rec & foo: rec.foo + 1 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 43,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn booleans_in_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!("{ x: 1 == 1, y: 1 == 1 }"),
|
||||||
|
// (true, true),
|
||||||
|
// (bool, bool)
|
||||||
|
// );
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!("{ x: 1 != 1, y: 1 == 1 }"),
|
||||||
|
// (false, true),
|
||||||
|
// (bool, bool)
|
||||||
|
// );
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!("{ x: 1 == 1, y: 1 != 1 }"),
|
||||||
|
// (true, false),
|
||||||
|
// (bool, bool)
|
||||||
|
// );
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!("{ x: 1 != 1, y: 1 != 1 }"),
|
||||||
|
// (false, false),
|
||||||
|
// (bool, bool)
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn alignment_in_record() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!("{ c: 32, b: if True then Red else if True then Green else Blue, a: 1 == 1 }"),
|
||||||
|
// (32i64, true, 2u8),
|
||||||
|
// (i64, bool, u8)
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn stack_memory_return_from_branch() {
|
||||||
|
// stack memory pointer should end up in the right place after returning from a branch
|
||||||
|
assert_evals_to!(
|
||||||
|
indoc!(
|
||||||
|
r#"
|
||||||
|
stackMemoryJunk = { x: 999, y: 111 }
|
||||||
|
if True then
|
||||||
|
{ x: 123, y: 321 }
|
||||||
|
else
|
||||||
|
stackMemoryJunk
|
||||||
|
"#
|
||||||
|
),
|
||||||
|
(123, 321),
|
||||||
|
(i64, i64)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn blue_and_present() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// f = \r ->
|
||||||
|
// when r is
|
||||||
|
// { x: Blue, y ? 3 } -> y
|
||||||
|
// { x: Red, y ? 5 } -> y
|
||||||
|
|
||||||
|
// f { x: Blue, y: 7 }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 7,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
||||||
|
|
||||||
|
// #[test]
|
||||||
|
// fn blue_and_absent() {
|
||||||
|
// assert_evals_to!(
|
||||||
|
// indoc!(
|
||||||
|
// r#"
|
||||||
|
// f = \r ->
|
||||||
|
// when r is
|
||||||
|
// { x: Blue, y ? 3 } -> y
|
||||||
|
// { x: Red, y ? 5 } -> y
|
||||||
|
|
||||||
|
// f { x: Blue }
|
||||||
|
// "#
|
||||||
|
// ),
|
||||||
|
// 3,
|
||||||
|
// i64
|
||||||
|
// );
|
||||||
|
// }
|
Loading…
Add table
Add a link
Reference in a new issue