Refine side_effects test.
This commit is contained in:
parent
d728ac6758
commit
b08f85a8b1
@ -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();
|
||||||
|
Loading…
Reference in New Issue
Block a user