Compile referenced NWScript during module builds

This commit is contained in:
2026-04-02 22:04:58 +02:00
parent 2f3bdc73d2
commit 38ee1e21e0
2 changed files with 322 additions and 0 deletions
+140
View File
@@ -279,6 +279,146 @@ func TestBuildSplitsConfiguredHAKs(t *testing.T) {
}
}
func TestBuildModuleCompilesReferencedScripts(t *testing.T) {
root := t.TempDir()
mustMkdir(t, filepath.Join(root, "src", "module"))
mustMkdir(t, filepath.Join(root, "src", "placeables"))
mustMkdir(t, filepath.Join(root, "src", "scripts"))
mustMkdir(t, filepath.Join(root, "assets"))
mustMkdir(t, filepath.Join(root, "build"))
mustWriteFile(t, filepath.Join(root, "nwn-tool.json"), `{
"module": {
"name": "Test Module",
"resref": "testmod"
},
"paths": {
"source": "src",
"assets": "assets",
"build": "build"
}
}
`)
mustWriteFile(t, filepath.Join(root, "src", "module", "module.ifo.json"), `{
"file_type": "IFO ",
"file_version": "V3.2",
"root": {
"struct_type": 0,
"fields": [
{
"label": "Mod_Name",
"type": "CExoString",
"value": "Test Module"
}
]
}
}
`)
mustWriteFile(t, filepath.Join(root, "src", "placeables", "thing.utp.json"), `{
"file_type": "UTP ",
"file_version": "V3.2",
"root": {
"struct_type": 0,
"fields": [
{
"label": "OnUsed",
"type": "ResRef",
"value": "use_thing"
}
]
}
}
`)
mustWriteFile(t, filepath.Join(root, "src", "scripts", "use_thing.nss"), `void main() {}`)
compiler := filepath.Join(root, "fake-compiler.sh")
mustWriteFile(t, compiler, `#!/bin/sh
set -eu
out=""
src=""
while [ "$#" -gt 0 ]; do
case "$1" in
-o)
out="$2"
shift 2
;;
--dirs)
shift 2
;;
*)
src="$1"
shift
;;
esac
done
[ -n "$out" ]
[ -n "$src" ]
printf 'compiled:%s\n' "$(basename "$src")" > "$out"
`)
if err := os.Chmod(compiler, 0o755); err != nil {
t.Fatalf("chmod fake compiler: %v", err)
}
t.Setenv("SOW_NWN_SCRIPT_COMPILER", compiler)
p, err := project.Load(root)
if err != nil {
t.Fatalf("load project: %v", err)
}
if err := p.ValidateLayout(); err != nil {
t.Fatalf("validate layout: %v", err)
}
if err := p.Scan(); err != nil {
t.Fatalf("scan: %v", err)
}
result, err := BuildModule(p)
if err != nil {
t.Fatalf("build module: %v", err)
}
if result.Resources != 4 {
t.Fatalf("expected 4 resources, got %d", result.Resources)
}
fh, err := os.Open(result.ModulePath)
if err != nil {
t.Fatalf("open built module: %v", err)
}
defer fh.Close()
archive, err := erf.Read(fh)
if err != nil {
t.Fatalf("read built module: %v", err)
}
foundSource := false
foundCompiled := false
for _, resource := range archive.Resources {
if resource.Name != "use_thing" {
continue
}
if extension, ok := erf.ExtensionForResourceType(resource.Type); ok {
switch extension {
case "nss":
foundSource = true
case "ncs":
foundCompiled = true
if !strings.Contains(string(resource.Data), "compiled:use_thing.nss") {
t.Fatalf("unexpected compiled payload: %q", string(resource.Data))
}
}
}
}
if !foundSource {
t.Fatalf("expected source script resource in archive")
}
if !foundCompiled {
t.Fatalf("expected compiled script resource in archive")
}
}
func TestBuildOrdersMultipleHAKGroups(t *testing.T) {
root := t.TempDir()
mustMkdir(t, filepath.Join(root, "src"))