#include #include #include int main() { using namespace faset; const auto root = std::filesystem::temp_directory_path() / ("faset-session-" + new_id()); try { editor::Session session({root, FASET_TEST_ENGINE, {}}); session.scaffold("Settings", 3); auto document = session.authoring().create("Start", 3); session.authoring().save(document.at("id"), "Scenes/main.scene.json"); auto& commands = session.commands(); const auto initial = commands.call("faset_project_settings_get", Json::object()); auto changed = commands.call("faset_project_settings_set", {{"revision", initial.at("revision")}, {"settings", {{"name", "Проект 世界"}, {"dimension", 2}, {"start_scene", "Scenes/main.scene.json"}}}}); require(changed.at("settings").at("name") == "Проект 世界" && session.project().at("dimension") == 2, "test", "Project settings were not saved"); require(session.authoring().query(document.at("id")).at("scene").at("dimension") == 3, "test", "Project defaults changed the existing scene"); auto rejects = [&](const Json& request, const std::string& code) { try { commands.call("faset_project_settings_set", request); } catch (const Error& error) { require(error.json().at("code") == code, "test", "Wrong project error"); return; } throw std::runtime_error("Invalid project edit was accepted"); }; rejects({{"revision", initial.at("revision")}, {"settings", {{"name", "Stale"}}}}, "revision.conflict"); for (const auto& [field, value, code] : std::vector>{ {"name", "", "project.name"}, {"dimension", 4, "project.dimension"}, {"id", "replace-id", "project.setting"}, {"start_scene", "Scenes/missing.scene.json", "project.start_scene"}}) { rejects({{"revision", changed.at("revision")}, {"settings", {{field, value}}}}, code); require(commands.call("faset_project_settings_get", Json::object()) == changed, "test", "Rejected project edit changed state"); } auto external = session.project(); external["custom_tool"] = {{"keep", true}}; atomic_write_json(root / "project.faset.json", external); rejects({{"revision", changed.at("revision")}, {"settings", {{"name", "Race"}}}}, "revision.conflict"); const auto reloaded = commands.call("faset_project_settings_get", Json::object()); changed = commands.call("faset_project_settings_set", {{"revision", reloaded.at("revision")}, {"settings", {{"name", "Preserved"}}}}); require(changed.at("settings").at("custom_tool").at("keep") == true, "test", "Saving settings erased unknown project metadata"); external["version"] = 999; atomic_write_json(root / "project.faset.json", external); bool rejected = false; try { session.project(); } catch (const Error& error) { rejected = error.json().at("code") == "project.version"; } require(rejected, "test", "Future project version was reinterpreted"); std::filesystem::remove_all(root); std::cout << "Project settings validation, save, external revision conflicts and opaque " "metadata passed\n"; return 0; } catch (const std::exception& error) { std::cerr << error.what() << "\nFixture retained at " << root << '\n'; return 1; } }