#![cfg(not(feature = "no_function"))] use rhai::{Engine, EvalAltResult, FnNamespace, Module, Shared, INT}; #[cfg(not(feature = "no_object"))] #[test] fn test_functions_trait_object() -> Result<(), Box> { trait TestTrait { fn greet(&self) -> INT; } #[derive(Debug, Clone)] struct ABC(INT); impl TestTrait for ABC { fn greet(&self) -> INT { self.0 } } #[cfg(not(feature = "sync"))] type MySharedTestTrait = Shared; #[cfg(feature = "sync")] type MySharedTestTrait = Shared; let mut engine = Engine::new(); engine .register_type_with_name::("MySharedTestTrait") .register_fn("new_ts", || Shared::new(ABC(42)) as MySharedTestTrait) .register_fn("greet", |x: MySharedTestTrait| x.greet()); assert_eq!( engine.eval::("type_of(new_ts())")?, "MySharedTestTrait" ); assert_eq!(engine.eval::("let x = new_ts(); greet(x)")?, 42); Ok(()) } #[test] fn test_functions_namespaces() -> Result<(), Box> { let mut engine = Engine::new(); #[cfg(not(feature = "no_function"))] { assert_eq!( engine.eval::( " const ANSWER = 42; fn foo() { global::ANSWER } foo() " )?, 42 ); } #[cfg(not(feature = "no_module"))] { let mut m = Module::new(); let hash = m.set_native_fn("test", || Ok(999 as INT)); m.update_fn_namespace(hash, FnNamespace::Global); engine.register_static_module("hello", m.into()); let mut m = Module::new(); m.set_var("ANSWER", 123 as INT); engine.register_static_module("global", m.into()); assert_eq!(engine.eval::("test()")?, 999); #[cfg(not(feature = "no_function"))] assert_eq!(engine.eval::("fn test() { 123 } test()")?, 123); } engine.register_fn("test", || 42 as INT); assert_eq!(engine.eval::("test()")?, 42); #[cfg(not(feature = "no_function"))] { assert_eq!(engine.eval::("fn test() { 123 } test()")?, 123); assert_eq!( engine.eval::( " const ANSWER = 42; fn foo() { global::ANSWER } foo() " )?, 123 ); } Ok(()) }