()
| 555 | |
| 556 | #[test] |
| 557 | fn dynamic_val() -> Result<()> { |
| 558 | let engine = super::engine(); |
| 559 | let c = Component::new( |
| 560 | &engine, |
| 561 | r#" |
| 562 | (component |
| 563 | (import "t1" (type $t1 (sub resource))) |
| 564 | (type $t2' (resource (rep i32))) |
| 565 | (export $t2 "t2" (type $t2')) |
| 566 | (core func $f (canon resource.new $t2)) |
| 567 | |
| 568 | (core module $m |
| 569 | (func (export "pass") (param i32) (result i32) |
| 570 | (local.get 0))) |
| 571 | (core instance $i (instantiate $m)) |
| 572 | |
| 573 | (func (export "a") (param "x" (own $t1)) (result (own $t1)) |
| 574 | (canon lift (core func $i "pass"))) |
| 575 | (func (export "b") (param "x" u32) (result (own $t2)) |
| 576 | (canon lift (core func $f))) |
| 577 | ) |
| 578 | "#, |
| 579 | )?; |
| 580 | |
| 581 | struct MyType; |
| 582 | |
| 583 | let mut store = Store::new(&engine, ()); |
| 584 | let mut linker = Linker::new(&engine); |
| 585 | linker |
| 586 | .root() |
| 587 | .resource("t1", ResourceType::host::<MyType>(), |_, _| Ok(()))?; |
| 588 | let i_pre = linker.instantiate_pre(&c)?; |
| 589 | let i = i_pre.instantiate(&mut store)?; |
| 590 | |
| 591 | let a = i.get_func(&mut store, "a").unwrap(); |
| 592 | let a_typed = i.get_typed_func::<(Resource<MyType>,), (ResourceAny,)>(&mut store, "a")?; |
| 593 | let a_typed_result = |
| 594 | i.get_typed_func::<(Resource<MyType>,), (Resource<MyType>,)>(&mut store, "a")?; |
| 595 | let b = i.get_func(&mut store, "b").unwrap(); |
| 596 | let t2 = i.get_resource(&mut store, "t2").unwrap(); |
| 597 | |
| 598 | let t1 = Resource::new_own(100); |
| 599 | let (t1,) = a_typed.call(&mut store, (t1,))?; |
| 600 | assert_eq!(t1.ty(), ResourceType::host::<MyType>()); |
| 601 | |
| 602 | let mut results = [Val::Bool(false)]; |
| 603 | a.call(&mut store, &[Val::Resource(t1)], &mut results)?; |
| 604 | match &results[0] { |
| 605 | Val::Resource(resource) => { |
| 606 | assert_eq!(resource.ty(), ResourceType::host::<MyType>()); |
| 607 | assert!(resource.owned()); |
| 608 | |
| 609 | let resource = resource.try_into_resource::<MyType>(&mut store)?; |
| 610 | assert_eq!(resource.rep(), 100); |
| 611 | assert!(resource.owned()); |
| 612 | |
| 613 | let resource = resource.try_into_resource_any(&mut store)?; |
| 614 | assert_eq!(resource.ty(), ResourceType::host::<MyType>()); |
nothing calls this directly
no test coverage detected