use mlua::prelude::*;
use std::path::PathBuf;
#[test]
fn string_buffer_adopted_on_target_runtime() -> LuaResult<()> {
let std_lib = pasta_lua::RuntimeConfig::default()
.to_stdlib()
.expect("RuntimeConfig::default().to_stdlib() should succeed");
let lua = unsafe { mlua::Lua::unsafe_new_with(std_lib, mlua::LuaOptions::default()) };
let workspace_root = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.parent()
.unwrap()
.to_path_buf();
let scripts_path = workspace_root.join("crates/pasta_lua/pasta_scripts");
let package_path = format!(
"{}/?.lua;{}/?/init.lua",
scripts_path.display(),
scripts_path.display()
);
lua.load(format!(
r#"package.path = "{};;" .. package.path"#,
package_path.replace('\\', "\\\\")
))
.exec()?;
let result: LuaTable = lua
.load(
r#"
local lua_version = require("pasta.lua_version")
local version_num = lua_version.get()
local sb_ok = pcall(require, "string.buffer")
local buf = require("pasta.buf")
local backend = buf.backend
-- put/tostring の機能検証(追記順保持・非破壊連結)
local put_tostring_ok = false
local actual = nil
do
local ok, res = pcall(function()
local b = buf.new()
b:put("Hello"):put(" "):put("World")
return b:tostring()
end)
if ok then
actual = res
put_tostring_ok = (res == "Hello World")
end
end
return {
string_buffer_ok = sb_ok,
backend = backend,
put_tostring_ok = put_tostring_ok,
actual = actual,
lua_version = version_num,
}
"#,
)
.eval()?;
let string_buffer_ok: bool = result.get("string_buffer_ok")?;
let backend: String = result.get("backend")?;
let put_tostring_ok: bool = result.get("put_tostring_ok")?;
let actual: Option<String> = result.get("actual")?;
let lua_version: i64 = result.get("lua_version")?;
assert!(
string_buffer_ok,
"R5 finding: require(\"string.buffer\") が失敗しました。\
対象ランタイム(mlua luajit52/vendored)で String Buffer Library が利用不可です。\
実行ランタイム識別 pasta.lua_version.get() = {lua_version}(>=200 なら LuaJIT)。\
最小実装フォールバックを黙って合格としないため、本テストは失敗で finding 化します。"
);
assert_eq!(
backend, "luajit",
"R5 finding: pasta.buf.backend が \"luajit\" ではなく \"{backend}\" でした。\
String Buffer 実体が採用されていません(フォールバック経路)。\
実行ランタイム識別 pasta.lua_version.get() = {lua_version}(>=200 なら LuaJIT)。"
);
assert!(
put_tostring_ok,
"R5 finding: pasta.buf.new() の put/tostring が想定結果になりません \
(expected \"Hello World\", actual {actual:?})。backend={backend}。\
実行ランタイム識別 pasta.lua_version.get() = {lua_version}(>=200 なら LuaJIT)。"
);
assert!(
lua_version >= 200,
"R5 finding: backend=\"luajit\" を採用しつつ lua_version.get() = {lua_version} (<200) は不整合です。"
);
Ok(())
}