use crate::run::RuntimeContext;
use crate::Result;
use mlua::{Lua, Table, Value};
pub fn init_module(lua: &Lua, _runtime_context: &RuntimeContext) -> Result<Table> {
let table = lua.create_table()?;
let before_all_response_fn = lua.create_function(devai_before_all_response)?;
table.set("before_all_response", before_all_response_fn)?;
let skip_fn = lua.create_function(devai_skip)?;
table.set("skip", skip_fn)?;
let globals = lua.globals();
globals.set("devai", &table)?;
Ok(table)
}
fn devai_before_all_response(lua: &Lua, data: Value) -> mlua::Result<Value> {
let inner = lua.create_table()?;
inner.set("kind", "BeforeAllResponse")?;
inner.set("data", data)?;
let outer = lua.create_table()?;
outer.set("_devai_", inner)?;
Ok(Value::Table(outer))
}
fn devai_skip(lua: &Lua, reason: Option<String>) -> mlua::Result<Value> {
let data = lua.create_table()?;
data.set("reason", reason)?;
let inner = lua.create_table()?;
inner.set("kind", "Skip")?;
inner.set("data", data)?;
let outer = lua.create_table()?;
outer.set("_devai_", inner)?;
Ok(Value::Table(outer))
}
#[cfg(test)]
mod tests {
type Result<T> = core::result::Result<T, Box<dyn std::error::Error>>;
use crate::_test_support::{eval_lua, setup_lua};
use serde_json::Value;
use value_ext::JsonValueExt as _;
#[tokio::test]
async fn test_lua_devai_before_all_response_simple() -> Result<()> {
let lua = setup_lua(super::init_module, "devai")?;
let script = r#"
return devai.before_all_response(123)
"#;
let res = eval_lua(&lua, script)?;
let kind = res.x_get_str("/_devai_/kind")?;
assert_eq!(kind, "BeforeAllResponse");
let data = res.x_get_i64("/_devai_/data")?;
assert_eq!(data, 123);
Ok(())
}
#[tokio::test]
async fn test_lua_devai_skip_with_reason() -> Result<()> {
let lua = setup_lua(super::init_module, "devai")?;
let script = r#"
return devai.skip("Not applicable")
"#;
let res = eval_lua(&lua, script)?;
let kind = res.x_get_str("/_devai_/kind")?;
assert_eq!(kind, "Skip");
let reason = res.x_get_str("/_devai_/data/reason")?;
assert_eq!(reason, "Not applicable");
Ok(())
}
#[tokio::test]
async fn test_lua_devai_skip_without_reason() -> Result<()> {
let lua = setup_lua(super::init_module, "devai")?;
let script = r#"
return devai.skip()
"#;
let mut res = eval_lua(&lua, script)?;
let kind = res.x_get_str("/_devai_/kind")?;
assert_eq!(kind, "Skip");
let data = res.x_remove::<Value>("/_devai_/data")?;
let reason = data.x_get::<String>("reason").ok();
assert!(reason.is_none(), "reason should be none");
Ok(())
}
}