* wip * start trying to write a runtime test * cut out all the more complex test cases until i get this one working * add macro parsing for the trappable error type config * runtime result tests works for an empty and a string error type * debugging: macro is broken because interfaces dont have names??? * thats how you name interfaces * record error and variant error work * show a concrete trap type, remove debug * delete clap annotations from wit-bindgen crate these are not used - clap isnt even an optional dep here - but were a holdover from the old home
120 lines
3.0 KiB
Rust
120 lines
3.0 KiB
Rust
use super::engine;
|
|
use anyhow::Result;
|
|
use wasmtime::{
|
|
component::{Component, Linker},
|
|
Store,
|
|
};
|
|
|
|
mod results;
|
|
|
|
mod no_imports {
|
|
use super::*;
|
|
|
|
wasmtime::component::bindgen!({
|
|
inline: "
|
|
world no-imports {
|
|
export foo: interface {
|
|
foo: func()
|
|
}
|
|
|
|
default export interface {
|
|
bar: func()
|
|
}
|
|
}
|
|
",
|
|
});
|
|
|
|
#[test]
|
|
fn run() -> Result<()> {
|
|
let engine = engine();
|
|
|
|
let component = Component::new(
|
|
&engine,
|
|
r#"
|
|
(component
|
|
(core module $m
|
|
(func (export ""))
|
|
)
|
|
(core instance $i (instantiate $m))
|
|
|
|
(func $f (export "bar") (canon lift (core func $i "")))
|
|
|
|
(instance $i (export "foo" (func $f)))
|
|
(export "foo" (instance $i))
|
|
)
|
|
"#,
|
|
)?;
|
|
|
|
let linker = Linker::new(&engine);
|
|
let mut store = Store::new(&engine, ());
|
|
let (no_imports, _) = NoImports::instantiate(&mut store, &component, &linker)?;
|
|
no_imports.bar(&mut store)?;
|
|
no_imports.foo().foo(&mut store)?;
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
mod one_import {
|
|
use super::*;
|
|
|
|
wasmtime::component::bindgen!({
|
|
inline: "
|
|
world one-import {
|
|
import foo: interface {
|
|
foo: func()
|
|
}
|
|
|
|
default export interface {
|
|
bar: func()
|
|
}
|
|
}
|
|
",
|
|
});
|
|
|
|
#[test]
|
|
fn run() -> Result<()> {
|
|
let engine = engine();
|
|
|
|
let component = Component::new(
|
|
&engine,
|
|
r#"
|
|
(component
|
|
(import "foo" (instance $i
|
|
(export "foo" (func))
|
|
))
|
|
(core module $m
|
|
(import "" "" (func))
|
|
(export "" (func 0))
|
|
)
|
|
(core func $f (canon lower (func $i "foo")))
|
|
(core instance $i (instantiate $m
|
|
(with "" (instance (export "" (func $f))))
|
|
))
|
|
|
|
(func $f (export "bar") (canon lift (core func $i "")))
|
|
)
|
|
"#,
|
|
)?;
|
|
|
|
#[derive(Default)]
|
|
struct MyImports {
|
|
hit: bool,
|
|
}
|
|
|
|
impl foo::Foo for MyImports {
|
|
fn foo(&mut self) -> Result<()> {
|
|
self.hit = true;
|
|
Ok(())
|
|
}
|
|
}
|
|
|
|
let mut linker = Linker::new(&engine);
|
|
foo::add_to_linker(&mut linker, |f: &mut MyImports| f)?;
|
|
let mut store = Store::new(&engine, MyImports::default());
|
|
let (one_import, _) = OneImport::instantiate(&mut store, &component, &linker)?;
|
|
one_import.bar(&mut store)?;
|
|
assert!(store.data().hit);
|
|
Ok(())
|
|
}
|
|
}
|