Files
EVEngine/test/editor_localization.cpp
西风逍遥游andCursor 24502babef Nest satellite packages under their host modules.
Keep CMake module names and trim switches, but stop flattening editing/editor and runtime bridges as top-level src/modules directories. Parent scans skip nested facets so runtime-3d can drop authoring by directory leaf.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-06 17:56:12 +08:00

54 lines
2.5 KiB
C++

#include "i18n/editing/LocalizationDocument.h"
#include "zeroerr/assert.h"
#include "zeroerr/unittest.h"
using namespace eve::localization_editing;
TEST_CASE("editor.localization_reports_completeness_placeholders_and_voice_metadata") {
LocalizationDocument document;
REQUIRE(document.addRow("dialogue.greeting", "Hello {name}", "Opening line").ok());
REQUIRE(document.setVariant("dialogue.greeting", "zh-CN",
{"你好 {name}", "asset://voice/zh/greeting.ogg", "approved", 1.2}).ok());
REQUIRE(document.setVariant("dialogue.greeting", "fr-FR",
{"Bonjour", "", "missing", 0.0}).ok());
const LocalizationAnalysis analysis = document.analyze({"zh-CN", "fr-FR"}, true);
CHECK_EQ(static_cast<int>(analysis.status), static_cast<int>(EditorStatus::Failed));
CHECK_EQ(analysis.locales.size(), size_t{2});
CHECK_EQ(analysis.locales[0].translated, 1);
CHECK_EQ(analysis.locales[0].voiced, 1);
CHECK_EQ(analysis.locales[0].approved, 1);
CHECK(analysis.diagnostics.size() >= size_t{2});
}
TEST_CASE("editor.localization_snapshot_round_trip_is_atomic_and_deterministic") {
LocalizationDocument source;
REQUIRE(source.addRow("ui.quit", "Quit").ok());
REQUIRE(source.setVariant("ui.quit", "zh-CN", {"退出", "", "", 0.0}).ok());
const EditorValue snapshot = source.snapshotValue();
LocalizationDocument restored;
REQUIRE(restored.loadSnapshot(snapshot).ok());
CHECK_EQ(restored.snapshotValue(), snapshot);
const Revision before = restored.revision();
EditorValue broken = snapshot;
auto* object = broken.getIf<EditorValue::Object>();
REQUIRE(object);
(*object)["schemaVersion"] = int64_t{99};
CHECK_EQ(static_cast<int>(restored.loadSnapshot(broken).code()),
static_cast<int>(EditorStatus::Unsupported));
CHECK_EQ(restored.revision(), before);
CHECK_EQ(restored.snapshotValue(), snapshot);
}
TEST_CASE("editor.localization_rejects_duplicate_keys_and_invalid_voice_status") {
LocalizationDocument document;
REQUIRE(document.addRow("line.one", "One").ok());
CHECK_EQ(static_cast<int>(document.addRow("line.one", "Duplicate").code()),
static_cast<int>(EditorStatus::Conflict));
CHECK_EQ(static_cast<int>(document.setVariant("line.one", "en-US", {"One", "", "done", 0.0}).code()),
static_cast<int>(EditorStatus::Rejected));
CHECK_EQ(static_cast<int>(document.setVariant("missing", "en-US", {"Missing", "", "", 0.0}).code()),
static_cast<int>(EditorStatus::NotFound));
}