fix: keep generated defaults portable with conditional resources

This commit is contained in:
boburning
2026-10-23 21:32:43 -04:00
committed by Matthew Stanley
parent e5d92035a9
commit b3abd6df01
3 changed files with 147 additions and 0 deletions
+39
View File
@@ -2569,6 +2569,45 @@ int main() {
check(!ModPackageManager::read_manifest(a,malformed,&error),"duplicate default roster rejected");
}
{
const auto old_root = root / "conditional-default-old";
const auto new_root = root / "conditional-default-new";
write_text(old_root / "bundled/conditional-default/1.0.0/manifest.toml",
"format_version = 10\nid = \"conditional-default\"\nversion = \"1.0.0\"\nname = \"Conditional default\"\n"
"[[target]]\ngame_id = \"SLUS-TEST\"\n"
"[[feature]]\nid = \"media\"\nname = \"Media\"\ndefault_enabled = true\n"
"[[option]]\nfeature = \"media\"\nid = \"language\"\nlabel = \"Language\"\n"
"type = \"choice\"\ndefault = \"en\"\n"
"[[option.choice]]\nvalue = \"en\"\nlabel = \"English\"\n"
"[[option.choice]]\nvalue = \"es\"\nlabel = \"Spanish\"\n"
"[[resource]]\nfeature = \"media\"\nid = \"english\"\nlabel = \"English\"\nrequired = true\nwhen = { language = \"en\" }\n"
"[[resource]]\nfeature = \"media\"\nid = \"spanish\"\nlabel = \"Spanish\"\nrequired = true\nwhen = { language = \"es\" }\n");
write_text(old_root / "english.dat", "English");
const auto register_defaults = [&](ModPackageManager& manager) {
check(manager.set_generated_feature_resource_default("conditional-default", "media", "english", "english.dat", &error), error.c_str());
check(manager.set_generated_feature_resource_default("conditional-default", "media", "spanish", "spanish.dat", &error), error.c_str());
};
ModPackageManager original(old_root);
check(original.scan(&error), error.c_str());
register_defaults(original);
check(original.resolve("SLUS-TEST").ok, "inactive missing generated default is not required");
fs::rename(old_root, new_root, ec);
check(!ec && !fs::exists(old_root), "old conditional default installation is unavailable");
ModPackageManager relocated(new_root);
check(relocated.scan(&error), error.c_str());
register_defaults(relocated);
const auto english = relocated.resolve("SLUS-TEST");
check(english.ok && english.resources.size() == 1 && english.resources[0].id == "english" &&
english.resources[0].path == fs::absolute(new_root / "english.dat"),
"only the selected generated default resolves at the moved root");
write_text(new_root / "spanish.dat", "Spanish");
check(relocated.set_feature_option("conditional-default", "media", "language", "es", &error), error.c_str());
const auto spanish = relocated.resolve("SLUS-TEST");
check(spanish.ok && spanish.resources.size() == 1 && spanish.resources[0].id == "spanish" &&
spanish.resources[0].path == fs::absolute(new_root / "spanish.dat"),
"changing the option selects the other relocated generated default");
}
fs::remove_all(root, ec);
if (failures) {
std::cerr << failures << " mod package test(s) failed\n";