diff --git a/crates/mun_runtime/src/test.rs b/crates/mun_runtime/src/test.rs index 7a31f5258..380823205 100644 --- a/crates/mun_runtime/src/test.rs +++ b/crates/mun_runtime/src/test.rs @@ -1,4 +1,4 @@ -use crate::{Runtime, RuntimeBuilder}; +use crate::{Runtime, RuntimeBuilder, Struct}; use mun_compiler::{ColorChoice, Config, Driver, FileId, PathOrInline, RelativePathBuf}; use std::path::PathBuf; use std::thread::sleep; @@ -420,3 +420,50 @@ fn field_crash() { ); assert_invoke_eq!(i64, 15, driver, "main", 10); } + +#[test] +fn marshal_struct() { + let mut driver = TestDriver::new( + r#" + struct(gc) Foo { a: int, b: bool, c: float, }; + + fn foo_new(a: int, b: bool, c: float): Foo { + Foo { a, b, c, } + } + fn foo_a(foo: Foo):int { foo.a } + fn foo_b(foo: Foo):bool { foo.b } + fn foo_c(foo: Foo):float { foo.c } + "#, + ); + + let a = 3i64; + let b = true; + let c = 1.23f64; + let mut foo: Struct = invoke_fn!(driver.runtime, "foo_new", a, b, c).unwrap(); + assert_eq!(Ok(&a), foo.get::("a")); + assert_eq!(Ok(&b), foo.get::("b")); + assert_eq!(Ok(&c), foo.get::("c")); + + let d = 6i64; + let e = false; + let f = 4.56f64; + foo.set("a", d).unwrap(); + foo.set("b", e).unwrap(); + foo.set("c", f).unwrap(); + + assert_eq!(Ok(&d), foo.get::("a")); + assert_eq!(Ok(&e), foo.get::("b")); + assert_eq!(Ok(&f), foo.get::("c")); + + assert_eq!(Ok(d), foo.replace("a", a)); + assert_eq!(Ok(e), foo.replace("b", b)); + assert_eq!(Ok(f), foo.replace("c", c)); + + assert_eq!(Ok(&a), foo.get::("a")); + assert_eq!(Ok(&b), foo.get::("b")); + assert_eq!(Ok(&c), foo.get::("c")); + + assert_invoke_eq!(i64, a, driver, "foo_a", foo.clone()); + assert_invoke_eq!(bool, b, driver, "foo_b", foo.clone()); + assert_invoke_eq!(f64, c, driver, "foo_c", foo); +}