fix rhai tests

This commit is contained in:
Jaroslaw Konik 2025-05-21 21:51:45 +02:00
parent 3028b6fe4e
commit 853879ef6d
5 changed files with 63 additions and 27 deletions

View file

@ -1,5 +1,5 @@
fn test_func(vec3) {
if type_of(vec3) != "tests::rhai_tests::BevyVec3" { throw() }
if type_of(vec3) != "Vec3" { throw() }
// TODO: assert x,y,z
mark_success();
}

View file

@ -42,6 +42,12 @@ pub struct LuaRuntime {
#[derive(Debug, Clone, Copy)]
pub struct BevyEntity(pub Entity);
impl BevyEntity {
pub fn index(&self) -> u32 {
self.0.index()
}
}
impl UserData for BevyEntity {}
impl FromLua<'_> for BevyEntity {
@ -63,6 +69,18 @@ impl BevyVec3 {
pub fn new(x: f32, y: f32, z: f32) -> Self {
BevyVec3(Vec3 { x, y, z })
}
pub fn x(&self) -> f32 {
self.0.x
}
pub fn y(&self) -> f32 {
self.0.y
}
pub fn z(&self) -> f32 {
self.0.z
}
}
impl UserData for BevyVec3 {}

View file

@ -51,6 +51,36 @@ pub struct RhaiScriptData {
#[derive(Debug, Clone)]
pub struct RhaiValue(pub rhai::Dynamic);
#[derive(Clone)]
pub struct BevyEntity(pub Entity);
impl BevyEntity {
pub fn index(&self) -> u32 {
self.0.index()
}
}
#[derive(Clone)]
pub struct BevyVec3(pub Vec3);
impl BevyVec3 {
pub fn new(x: f32, y: f32, z: f32) -> Self {
Self(Vec3::new(x, y, z))
}
pub fn x(&self) -> f32 {
self.0.x
}
pub fn y(&self) -> f32 {
self.0.y
}
pub fn z(&self) -> f32 {
self.0.z
}
}
impl Runtime for RhaiRuntime {
type Schedule = RhaiSchedule;
type ScriptAsset = RhaiScript;
@ -66,7 +96,7 @@ impl Runtime for RhaiRuntime {
entity: Entity,
) -> Result<Self::ScriptData, ScriptingError> {
let mut scope = Scope::new();
scope.push(ENTITY_VAR_NAME, entity);
scope.push(ENTITY_VAR_NAME, BevyEntity(entity));
let engine = &self.engine;
@ -78,7 +108,7 @@ impl Runtime for RhaiRuntime {
.run_ast_with_scope(&mut scope, &ast)
.map_err(|e| ScriptingError::RuntimeError(Box::new(e)))?;
scope.remove::<Entity>(ENTITY_VAR_NAME).unwrap();
scope.remove::<BevyEntity>(ENTITY_VAR_NAME).unwrap();
Ok(Self::ScriptData { ast, scope })
}
@ -114,7 +144,7 @@ impl Runtime for RhaiRuntime {
) -> Result<RhaiValue, ScriptingError> {
let ast = script_data.ast.clone();
let scope = &mut script_data.scope;
scope.push(ENTITY_VAR_NAME, entity);
scope.push(ENTITY_VAR_NAME, BevyEntity(entity));
let options = CallFnOptions::new().eval_ast(false);
let args = args
.parse(&self.engine)
@ -124,7 +154,7 @@ impl Runtime for RhaiRuntime {
let result = self
.engine
.call_fn_with_options::<Dynamic>(options, scope, &ast, name, args);
scope.remove::<Entity>(ENTITY_VAR_NAME).unwrap();
scope.remove::<BevyEntity>(ENTITY_VAR_NAME).unwrap();
match result {
Ok(val) => Ok(RhaiValue(val)),
Err(e) => Err(ScriptingError::RuntimeError(Box::new(e))),
@ -188,8 +218,8 @@ impl Default for RhaiRuntime {
let mut engine = Engine::new();
engine
.register_type_with_name::<Entity>("Entity")
.register_get("index", |entity: &mut Entity| entity.index());
.register_type_with_name::<BevyEntity>("Entity")
.register_get("index", |entity: &mut BevyEntity| entity.index());
#[allow(deprecated)]
engine
.register_type_with_name::<Promise<rhai::NativeCallContextStore, RhaiValue>>("Promise")
@ -202,9 +232,9 @@ impl Default for RhaiRuntime {
);
engine
.register_type_with_name::<Vec3>("Vec3")
.register_type_with_name::<BevyVec3>("Vec3")
.register_fn("new_vec3", |x: f64, y: f64, z: f64| {
Vec3::new(x as f32, y as f32, z as f32)
BevyVec3(Vec3::new(x as f32, y as f32, z as f32))
})
.register_get("x", |vec: &mut Vec3| vec.x as f64)
.register_get("y", |vec: &mut Vec3| vec.y as f64)
@ -242,7 +272,7 @@ impl<T: Clone + 'static> FromRuntimeValueWithEngine<'_, RhaiRuntime> for T {
}
pub mod prelude {
pub use super::{RhaiRuntime, RhaiScript, RhaiScriptData};
pub use super::{BevyEntity, BevyVec3, RhaiRuntime, RhaiScript, RhaiScriptData};
}
macro_rules! impl_tuple {

View file

@ -176,7 +176,7 @@ fn then(r_self: magnus::Value) -> magnus::Value {
pub struct BevyEntity(pub Entity);
impl BevyEntity {
fn index(&self) -> u32 {
pub fn index(&self) -> u32 {
self.0.index()
}
}

View file

@ -458,7 +458,7 @@ macro_rules! scripting_tests {
runtime.add_function(
String::from("rust_func"),
|In((entity,)): In<($entity_type,)>, mut res: ResMut<State>| {
res.index = Some(entity.0.index());
res.index = Some(entity.index());
},
);
});
@ -490,9 +490,9 @@ macro_rules! scripting_tests {
runtime.add_function(
String::from("rust_func"),
|In((v,)): In<($vec_type,)>, mut res: ResMut<State>| {
assert_eq!(v.0.x, 1.5);
assert_eq!(v.0.y, 2.5);
assert_eq!(v.0.z, -3.5);
assert_eq!(v.x(), 1.5);
assert_eq!(v.y(), 2.5);
assert_eq!(v.z(), -3.5);
res.success = true
},
);
@ -551,18 +551,6 @@ mod rhai_tests {
use bevy::prelude::*;
use bevy_scriptum::runtimes::rhai::prelude::*;
#[derive(Clone)]
struct BevyEntity(Entity);
#[derive(Clone)]
struct BevyVec3(Vec3);
impl BevyVec3 {
fn new(x: f32, y: f32, z: f32) -> Self {
Self(Vec3 { x, y, z })
}
}
impl AssertStateKeyValue for RhaiRuntime {
type ScriptData = RhaiScriptData;