Refine side_effects test.

This commit is contained in:
Stephen Chung 2020-06-22 09:46:36 +08:00
parent d728ac6758
commit b08f85a8b1

View File

@ -1,9 +1,10 @@
///! This test simulates an external command object that is driven by a script. ///! This test simulates an external command object that is driven by a script.
use rhai::{Engine, EvalAltResult, RegisterFn, Scope, INT}; use rhai::{Engine, EvalAltResult, RegisterFn, Scope, INT};
use std::sync::{Arc, Mutex}; use std::sync::{Arc, Mutex, RwLock};
/// External command. /// Simulate a command object.
struct Command { struct Command {
/// Simulate an external state.
state: i64, state: i64,
} }
@ -18,25 +19,7 @@ impl Command {
} }
} }
/// Wrapper object to wrap a command object. type API = Arc<Mutex<Command>>;
#[derive(Clone)]
struct CommandWrapper {
command: Arc<Mutex<Command>>,
}
impl CommandWrapper {
/// Delegate command action.
pub fn do_action(&mut self, x: i64) {
let mut command = self.command.lock().unwrap();
let val = command.get();
command.action(val + x);
}
/// Delegate get value action.
pub fn get_value(&mut self) -> i64 {
let command = self.command.lock().unwrap();
command.get()
}
}
#[cfg(not(feature = "no_object"))] #[cfg(not(feature = "no_object"))]
#[test] #[test]
@ -48,18 +31,20 @@ fn test_side_effects_command() -> Result<(), Box<EvalAltResult>> {
let command = Arc::new(Mutex::new(Command { state: 12 })); let command = Arc::new(Mutex::new(Command { state: 12 }));
assert_eq!(command.lock().unwrap().get(), 12); assert_eq!(command.lock().unwrap().get(), 12);
// Create the wrapper. // Create the API object.
let wrapper = CommandWrapper { let api = command.clone(); // Notice this clones the `Arc` only
command: command.clone(), // Notice this clones the `Arc` only
};
// Make the wrapper a singleton in the script environment. // Make the API object a singleton in the script environment.
scope.push_constant("Command", wrapper); scope.push_constant("Command", api);
// Register type. // Register type.
engine.register_type_with_name::<CommandWrapper>("CommandType"); engine.register_type_with_name::<API>("CommandType");
engine.register_fn("action", CommandWrapper::do_action); engine.register_fn("action", |api: &mut API, x: i64| {
engine.register_get("value", CommandWrapper::get_value); let mut command = api.lock().unwrap();
let val = command.get();
command.action(val + x);
});
engine.register_get("value", |command: &mut API| command.lock().unwrap().get());
assert_eq!( assert_eq!(
engine.eval_with_scope::<INT>( engine.eval_with_scope::<INT>(
@ -81,9 +66,6 @@ fn test_side_effects_command() -> Result<(), Box<EvalAltResult>> {
#[test] #[test]
fn test_side_effects_print() -> Result<(), Box<EvalAltResult>> { fn test_side_effects_print() -> Result<(), Box<EvalAltResult>> {
use std::sync::Arc;
use std::sync::RwLock;
let result = Arc::new(RwLock::new(String::from(""))); let result = Arc::new(RwLock::new(String::from("")));
let mut engine = Engine::new(); let mut engine = Engine::new();