use std::{fs::File, io::BufReader, path::Path};
use gaia_types::GaiaError;
use lua_assembler::{formats::luac::LuacReadConfig, program::LuaVersion};
#[test]
fn test_luac_reader_basic() {
let luac_path = Path::new("tests/luac_read/hello.luac");
if !luac_path.exists() {
println!("跳过测试:{} 文件不存在", luac_path.display());
return;
}
let file = File::open(luac_path).expect("无法打开 .luac 文件");
let config = LuacReadConfig::default();
let reader = config.as_reader(BufReader::new(file));
let info_result = reader.get_info();
assert!(info_result.is_ok(), "获取 LuacInfo 失败: {:?}", info_result.err());
let info = info_result.unwrap();
println!("Lua 版本: {:?}", info.version);
println!("格式版本: {}", info.header.format_version);
println!("字节序: {}", info.header.endianness);
let result = reader.finish();
assert!(result.result.is_ok(), "解析 LuaProgram 失败: {:?}", result.result.err());
let program = result.result.unwrap();
println!("程序版本: {:?}", program.header.version);
assert_ne!(program.header.version, LuaVersion::Unknown, "程序版本不应为 Unknown");
}
#[test]
fn test_luac_reader_lazy_loading() {
let luac_path = Path::new("tests/luac_read/hello.luac");
if !luac_path.exists() {
println!("跳过测试:{} 文件不存在", luac_path.display());
return;
}
let file = File::open(luac_path).expect("无法打开 .luac 文件");
let config = LuacReadConfig::default();
let reader = config.as_reader(BufReader::new(file));
let info1 = reader.get_info().expect("第一次获取 info 失败");
let info2 = reader.get_info().expect("第二次获取 info 失败");
assert_eq!(info1.version, info2.version);
assert_eq!(info1.header.format_version, info2.header.format_version);
assert_eq!(info1.header.endianness, info2.header.endianness);
}
#[test]
fn test_luac_reader_invalid_file() {
let invalid_data = b"invalid luac data";
let reader = std::io::Cursor::new(invalid_data);
let mut config = LuacReadConfig::default();
config.check_magic_head = true;
let luac_reader = config.as_reader(reader);
let info_result = luac_reader.get_info();
println!("Info result: {:?}", info_result);
assert!(info_result.is_err(), "读取无效文件应该失败,但实际成功了: {:?}", info_result);
let result = luac_reader.finish();
println!("Finish result: {:?}", result.result);
assert!(result.result.is_err(), "解析无效文件应该失败,但实际成功了: {:?}", result.result);
}
#[test]
fn test_luac_reader_empty_file() {
let empty_data = b"";
let reader = std::io::Cursor::new(empty_data);
let config = LuacReadConfig::default();
let luac_reader = config.as_reader(reader);
let info_result = luac_reader.get_info();
println!("Info result: {:?}", info_result);
match info_result {
Ok(info) => {
panic!("读取空文件应该失败,但实际成功了: {:?}", info);
}
Err(err) => {
println!("Error message: {}", err);
assert!(err.to_string().contains("File is empty"), "错误消息应该包含 'File is empty'");
}
}
let result = luac_reader.finish();
println!("Finish result: {:?}", result.result);
assert!(result.result.is_err(), "解析空文件应该失败,但实际成功了: {:?}", result.result);
}
#[test]
fn test_luac_read_path_integration() {
use lua_assembler::formats::luac::luac_read_path;
let luac_path = Path::new("tests/luac_read/hello.luac");
if !luac_path.exists() {
println!("跳过测试:{} 文件不存在", luac_path.display());
return;
}
let result = luac_read_path(luac_path);
assert!(result.is_ok(), "luac_read_path 失败: {:?}", result.err());
let program = result.unwrap();
println!("通过 luac_read_path 读取的程序版本: {:?}", program.header.version);
assert_ne!(program.header.version, LuaVersion::Unknown, "程序版本不应为 Unknown");
}
#[allow(dead_code)]
fn create_test_luac_file() {
use std::process::Command;
let lua_file = "tests/luac_read/hello.lua";
let luac_file = "tests/luac_read/hello.luac";
let output = Command::new("luac").args(&["-o", luac_file, lua_file]).output();
match output {
Ok(output) => {
if output.status.success() {
println!("成功创建测试文件: {}", luac_file);
}
else {
println!("创建测试文件失败: {}", String::from_utf8_lossy(&output.stderr));
}
}
Err(e) => {
println!("无法执行 luac 命令: {}", e);
println!("请确保系统已安装 Lua 编译器");
}
}
}