|
| 1 | +use mlua::{Error, ExternalError, IntoLuaMulti, Lua, Result, String, Value}; |
| 2 | + |
| 3 | +#[test] |
| 4 | +fn test_result_conversions() -> Result<()> { |
| 5 | + let lua = Lua::new(); |
| 6 | + let globals = lua.globals(); |
| 7 | + |
| 8 | + let ok = lua.create_function(|_, ()| Ok(Ok::<(), Error>(())))?; |
| 9 | + let err = lua.create_function(|_, ()| Ok(Err::<(), _>("failure1".into_lua_err())))?; |
| 10 | + let ok2 = lua.create_function(|_, ()| Ok(Ok::<_, Error>("!".to_owned())))?; |
| 11 | + let err2 = lua.create_function(|_, ()| Ok(Err::<String, _>("failure2".into_lua_err())))?; |
| 12 | + |
| 13 | + globals.set("ok", ok)?; |
| 14 | + globals.set("ok2", ok2)?; |
| 15 | + globals.set("err", err)?; |
| 16 | + globals.set("err2", err2)?; |
| 17 | + |
| 18 | + lua.load( |
| 19 | + r#" |
| 20 | + local r, e = ok() |
| 21 | + assert(r == nil and e == nil) |
| 22 | +
|
| 23 | + local r, e = err() |
| 24 | + assert(r == nil) |
| 25 | + assert(tostring(e):find("failure1") ~= nil) |
| 26 | +
|
| 27 | + local r, e = ok2() |
| 28 | + assert(r == "!") |
| 29 | + assert(e == nil) |
| 30 | +
|
| 31 | + local r, e = err2() |
| 32 | + assert(r == nil) |
| 33 | + assert(tostring(e):find("failure2") ~= nil) |
| 34 | + "#, |
| 35 | + ) |
| 36 | + .exec()?; |
| 37 | + |
| 38 | + // Try to convert Result into MultiValue |
| 39 | + let ok1 = Ok::<(), Error>(()); |
| 40 | + let multi_ok1 = ok1.into_lua_multi(&lua)?; |
| 41 | + assert_eq!(multi_ok1.len(), 0); |
| 42 | + let err1 = Err::<(), _>("failure1"); |
| 43 | + let multi_err1 = err1.into_lua_multi(&lua)?; |
| 44 | + assert_eq!(multi_err1.len(), 2); |
| 45 | + assert_eq!(multi_err1[0], Value::Nil); |
| 46 | + assert_eq!(multi_err1[1].as_str().unwrap(), "failure1"); |
| 47 | + |
| 48 | + let ok2 = Ok::<_, Error>("!"); |
| 49 | + let multi_ok2 = ok2.into_lua_multi(&lua)?; |
| 50 | + assert_eq!(multi_ok2.len(), 1); |
| 51 | + assert_eq!(multi_ok2[0].as_str().unwrap(), "!"); |
| 52 | + let err2 = Err::<String, _>("failure2".into_lua_err()); |
| 53 | + let multi_err2 = err2.into_lua_multi(&lua)?; |
| 54 | + assert_eq!(multi_err2.len(), 2); |
| 55 | + assert_eq!(multi_err2[0], Value::Nil); |
| 56 | + assert!(matches!(multi_err2[1], Value::Error(_))); |
| 57 | + assert_eq!(multi_err2[1].to_string()?, "failure2"); |
| 58 | + |
| 59 | + Ok(()) |
| 60 | +} |
0 commit comments