mod common;
use common::must_ok;
use factorio_codegen::LuaGenerator;
use factorio_ir::{
block::Block,
function::Function,
module::{ImportedItem, Module, ModuleImport, Symbol},
scope::Scope,
stage::Stage,
statement::Statement,
};
#[test]
fn generates_require_statements() {
let module = Module {
name: "on_init".to_string(),
stage: Stage::Control,
body: Block { statements: vec![] },
imports: vec![ModuleImport {
module: "player".to_string(),
local: "player".to_string(),
items: vec![ImportedItem {
name: "MyPlayer".to_string(),
local: "MyPlayer".to_string(),
}],
factorio_mod: None,
module_root: None,
}],
submodules: vec![],
locales: vec![],
pending_locales: vec![],
symbols: vec![Symbol {
scope: Scope::Public,
statement: Statement::FunctionDecl(Function {
name: "on_init".to_string(),
params: vec![],
body: Block { statements: vec![] },
doc: None,
debug: None,
event: None,
event_filter: None,
export: None,
}),
}],
};
let output = must_ok(LuaGenerator::new().generate_module(&module));
assert_eq!(
output,
concat!(
"-- Generated by factorio-rs@",
env!("CARGO_PKG_VERSION"),
"\n-- Module: `on_init`\n",
"local player = require(\"__mod__/lua/player\")\n",
"local MyPlayer = player.MyPlayer\n",
"\n",
"local onInit = {}\n",
"function onInit.on_init()\n",
"end\n",
"return onInit\n",
)
);
}
#[test]
fn generates_foreign_require_statements() {
let module = Module {
name: "on_init".to_string(),
stage: Stage::Control,
body: Block { statements: vec![] },
imports: vec![ModuleImport {
module: "shared.api".to_string(),
local: "shared_api".to_string(),
items: vec![ImportedItem {
name: "greet".to_string(),
local: "greet".to_string(),
}],
factorio_mod: Some("provider".to_string()),
module_root: Some("lua".to_string()),
}],
submodules: vec![],
locales: vec![],
pending_locales: vec![],
symbols: vec![],
};
let output = must_ok(LuaGenerator::with_mod_name("consumer").generate_module(&module));
assert!(output.contains("local shared_api = require(\"__provider__/lua/shared/api\")"));
assert!(output.contains("local greet = shared_api.greet"));
}
#[test]
fn generates_foreign_require_with_empty_module_root() {
let module = Module {
name: "on_init".to_string(),
stage: Stage::Control,
body: Block { statements: vec![] },
imports: vec![ModuleImport {
module: "gui".to_string(),
local: "gui".to_string(),
items: vec![],
factorio_mod: Some("flib".to_string()),
module_root: Some(String::new()),
}],
submodules: vec![],
locales: vec![],
pending_locales: vec![],
symbols: vec![],
};
let output = must_ok(LuaGenerator::with_mod_name("consumer").generate_module(&module));
assert!(output.contains("local gui = require(\"__flib__/gui\")"));
}