rhai/codegen/tests/test_functions.rs

174 lines
4.6 KiB
Rust
Raw Normal View History

2020-08-14 05:00:01 +02:00
use rhai::plugin::*;
use rhai::{Engine, EvalAltResult, Module, FLOAT};
2020-08-01 18:52:26 +02:00
pub mod raw_fn {
2020-08-03 02:27:19 +02:00
use rhai::plugin::*;
2020-08-02 09:39:08 +02:00
use rhai::FLOAT;
2020-08-01 18:52:26 +02:00
#[export_fn]
pub fn distance_function(x1: FLOAT, y1: FLOAT, x2: FLOAT, y2: FLOAT) -> FLOAT {
2020-08-02 09:39:08 +02:00
((y2 - y1).abs().powf(2.0) + (x2 - x1).abs().powf(2.0)).sqrt()
2020-08-01 18:52:26 +02:00
}
}
#[test]
fn raw_fn_test() -> Result<(), Box<EvalAltResult>> {
let mut engine = Engine::new();
2020-08-02 09:39:08 +02:00
engine.register_fn("get_mystic_number", || 42 as FLOAT);
2020-08-01 18:52:26 +02:00
let mut m = Module::new();
2020-10-22 06:26:44 +02:00
rhai::set_exported_fn!(m, "euclidean_distance", raw_fn::distance_function);
2020-12-26 06:05:57 +01:00
engine.register_static_module("Math::Advanced", m.into());
2020-08-01 18:52:26 +02:00
2020-08-02 09:39:08 +02:00
assert_eq!(
engine.eval::<FLOAT>(
2020-12-26 06:05:57 +01:00
r#"let x = Math::Advanced::euclidean_distance(0.0, 1.0, 0.0, get_mystic_number()); x"#
2020-08-02 09:39:08 +02:00
)?,
41.0
);
2020-08-01 18:52:26 +02:00
Ok(())
}
mod raw_fn_mut {
2020-08-03 02:27:19 +02:00
use rhai::plugin::*;
2020-08-02 09:39:08 +02:00
use rhai::FLOAT;
2020-08-01 18:52:26 +02:00
#[export_fn]
pub fn add_in_place(f1: &mut FLOAT, f2: FLOAT) {
*f1 += f2;
}
}
#[test]
fn raw_fn_mut_test() -> Result<(), Box<EvalAltResult>> {
let mut engine = Engine::new();
2020-08-02 09:39:08 +02:00
engine.register_fn("get_mystic_number", || 42 as FLOAT);
2020-08-01 18:52:26 +02:00
let mut m = Module::new();
rhai::set_exported_fn!(m, "add_in_place", raw_fn_mut::add_in_place);
2020-12-26 06:05:57 +01:00
engine.register_static_module("Math::Advanced", m.into());
2020-08-01 18:52:26 +02:00
2020-08-02 09:39:08 +02:00
assert_eq!(
engine.eval::<FLOAT>(
2020-12-26 06:05:57 +01:00
r#"let x = get_mystic_number();
Math::Advanced::add_in_place(x, 1.0);
x"#
2020-08-02 09:39:08 +02:00
)?,
43.0
);
2020-08-01 18:52:26 +02:00
Ok(())
}
mod raw_fn_str {
2020-08-03 02:27:19 +02:00
use rhai::plugin::*;
2020-08-01 18:52:26 +02:00
#[export_fn]
pub fn write_out_str(message: &str) -> bool {
2023-02-05 17:59:02 +01:00
eprintln!("{message}");
2020-08-01 18:52:26 +02:00
true
}
}
#[test]
fn raw_fn_str_test() -> Result<(), Box<EvalAltResult>> {
let mut engine = Engine::new();
2020-08-02 09:39:08 +02:00
engine.register_fn("get_mystic_number", || 42 as FLOAT);
2020-08-01 18:52:26 +02:00
let mut m = Module::new();
rhai::set_exported_fn!(m, "write_out_str", raw_fn_str::write_out_str);
2020-12-26 06:05:57 +01:00
engine.register_static_module("Host::IO", m.into());
2020-08-01 18:52:26 +02:00
2022-12-30 18:07:39 +01:00
assert!(engine
.eval::<bool>(r#"let x = Host::IO::write_out_str("hello world!"); x"#)
.unwrap());
2020-08-01 18:52:26 +02:00
Ok(())
}
mod mut_opaque_ref {
2020-08-03 02:27:19 +02:00
use rhai::plugin::*;
2020-08-02 09:39:08 +02:00
use rhai::INT;
2020-08-01 18:52:26 +02:00
2022-12-30 18:07:39 +01:00
#[allow(dead_code)] // used inside `export_module!`
2020-08-01 18:52:26 +02:00
#[derive(Clone)]
pub struct StatusMessage {
os_code: Option<INT>,
message: String,
2020-08-02 09:39:08 +02:00
is_ok: bool,
2020-08-01 18:52:26 +02:00
}
#[export_fn]
pub fn new_message(is_ok: bool, message: &str) -> StatusMessage {
StatusMessage {
is_ok,
os_code: None,
message: message.to_string(),
}
}
#[export_fn]
pub fn new_os_message(is_ok: bool, os_code: INT) -> StatusMessage {
StatusMessage {
is_ok,
os_code: Some(os_code),
2022-08-11 13:01:23 +02:00
message: format!("OS Code {os_code}"),
2020-08-01 18:52:26 +02:00
}
}
#[export_fn]
pub fn write_out_message(message: &mut StatusMessage) -> bool {
eprintln!("{}", message.message);
true
}
}
#[test]
fn mut_opaque_ref_test() -> Result<(), Box<EvalAltResult>> {
let mut engine = Engine::new();
let mut m = Module::new();
rhai::set_exported_fn!(m, "new_message", mut_opaque_ref::new_message);
rhai::set_exported_fn!(m, "new_os_message", mut_opaque_ref::new_os_message);
rhai::set_exported_fn!(m, "write_out_message", mut_opaque_ref::write_out_message);
2020-12-26 06:05:57 +01:00
engine.register_static_module("Host::Msg", m.into());
2020-08-01 18:52:26 +02:00
2022-12-30 18:07:39 +01:00
assert!(engine
.eval::<bool>(
2020-12-26 06:05:57 +01:00
r#"
let message1 = Host::Msg::new_message(true, "it worked");
let ok1 = Host::Msg::write_out_message(message1);
let message2 = Host::Msg::new_os_message(true, 0);
let ok2 = Host::Msg::write_out_message(message2);
ok1 && ok2"#
2022-12-30 18:07:39 +01:00
)
.unwrap());
2020-08-01 18:52:26 +02:00
Ok(())
}
2020-08-08 04:19:17 +02:00
2020-08-09 21:19:39 +02:00
pub mod raw_returning_fn {
use rhai::plugin::*;
use rhai::FLOAT;
#[export_fn(return_raw)]
pub fn distance_function(
x1: FLOAT,
y1: FLOAT,
x2: FLOAT,
y2: FLOAT,
2021-03-22 12:21:42 +01:00
) -> Result<rhai::FLOAT, Box<rhai::EvalAltResult>> {
Ok(((y2 - y1).abs().powf(2.0) + (x2 - x1).abs().powf(2.0)).sqrt())
2020-08-09 21:19:39 +02:00
}
}
#[test]
fn raw_returning_fn_test() -> Result<(), Box<EvalAltResult>> {
let mut engine = Engine::new();
engine.register_fn("get_mystic_number", || 42 as FLOAT);
let mut m = Module::new();
2020-10-22 06:26:44 +02:00
rhai::set_exported_fn!(m, "euclidean_distance", raw_returning_fn::distance_function);
2020-12-26 06:05:57 +01:00
engine.register_static_module("Math::Advanced", m.into());
2020-08-09 21:19:39 +02:00
assert_eq!(
engine.eval::<FLOAT>(
2020-12-26 06:05:57 +01:00
r#"let x = Math::Advanced::euclidean_distance(0.0, 1.0, 0.0, get_mystic_number()); x"#
2020-08-09 21:19:39 +02:00
)?,
41.0
);
Ok(())
}