From ce15eccb0f5b7fd7557c9a95e52520831edd3573 Mon Sep 17 00:00:00 2001 From: iisaev Date: Sat, 24 Oct 2026 10:01:15 +0200 Subject: [PATCH] Schema model: catalog, field types, references, checker and line writer shared by tools and validator Co-Authored-By: Claude Opus 5.5 --- .gitattributes | 30 ++++++ .gitignore | 37 ++++++++ locale/en.properties | 2 + locale/es.properties | 2 + locale/ja.properties | 2 + locale/ko.properties | 2 + locale/ru.properties | 2 + locale/vi.properties | 2 + locale/zh.properties | 2 + manifest.json | 15 +++ mod.jpg | Bin 0 -> 132720 bytes src/ActionSchema.cs | 31 +++++++ src/CommandSchema.cs | 35 +++++++ src/FieldSchema.cs | 61 +++++++++++++ src/GameEntityIndex.cs | 111 +++++++++++++++++++++++ src/KindSchema.cs | 35 +++++++ src/SchemaCatalog.cs | 161 +++++++++++++++++++++++++++++++++ src/SchemaChecker.cs | 103 +++++++++++++++++++++ src/SchemaFile.cs | 20 ++++ src/SchemaIssue.cs | 23 +++++ src/SchemaJson.cs | 75 +++++++++++++++ src/SchemaLine.cs | 66 ++++++++++++++ src/SchemaReferences.cs | 43 +++++++++ tests/SchemaCatalogTests.cs | 65 +++++++++++++ tests/SchemaCheckerTests.cs | 53 +++++++++++ tests/SchemaJsonTests.cs | 34 +++++++ tests/SchemaReferencesTests.cs | 26 ++++++ 27 files changed, 1038 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 locale/en.properties create mode 100644 locale/es.properties create mode 100644 locale/ja.properties create mode 100644 locale/ko.properties create mode 100644 locale/ru.properties create mode 100644 locale/vi.properties create mode 100644 locale/zh.properties create mode 100644 manifest.json create mode 100644 mod.jpg create mode 100644 src/ActionSchema.cs create mode 100644 src/CommandSchema.cs create mode 100644 src/FieldSchema.cs create mode 100644 src/GameEntityIndex.cs create mode 100644 src/KindSchema.cs create mode 100644 src/SchemaCatalog.cs create mode 100644 src/SchemaChecker.cs create mode 100644 src/SchemaFile.cs create mode 100644 src/SchemaIssue.cs create mode 100644 src/SchemaJson.cs create mode 100644 src/SchemaLine.cs create mode 100644 src/SchemaReferences.cs create mode 100644 tests/SchemaCatalogTests.cs create mode 100644 tests/SchemaCheckerTests.cs create mode 100644 tests/SchemaJsonTests.cs create mode 100644 tests/SchemaReferencesTests.cs diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..3030c1a --- /dev/null +++ b/.gitattributes @@ -0,0 +1,30 @@ +# Line endings: LF everywhere, on every OS, whatever core.autocrlf says. +* text=auto eol=lf + +# cmd.exe misreads labels and goto in LF batch files, so they stay CRLF. +*.bat text eol=crlf +*.cmd text eol=crlf + +# Binaries: never converted, never diffed as text. +*.png binary +*.jpg binary +*.jpeg binary +*.webp binary +*.svg text +*.ogg binary +*.wav binary +*.mp3 binary +*.ttf binary +*.otf binary +*.woff binary +*.woff2 binary +*.dll binary +*.so binary +*.dylib binary +*.pdb binary +*.exe binary +*.zip binary +*.pck binary +*.moc3 binary +*.res binary +*.scn binary diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c301ca8 --- /dev/null +++ b/.gitignore @@ -0,0 +1,37 @@ +# Godot 4.x +.godot/ +.idea/ +sdk/ +bin/ +obj/ + +#ai +.omo/ +.opencode/ + +gen/ +obj/ +bin/ + +*.tres~ +*.tscn~ + +# GDScript LSP +.godot/ + +# Export +*.exe +*.dmg +*.apk +*.aab +*.pck +*.zip +*.log + +# OS +.DS_Store +Thumbs.db + +# Editor +*.import +*.godot.uid diff --git a/locale/en.properties b/locale/en.properties new file mode 100644 index 0000000..7db69a8 --- /dev/null +++ b/locale/en.properties @@ -0,0 +1,2 @@ +mod_schema_base_name = Schemas +mod_schema_base_desc = Annotations as data: schemas/*.json files of any mod describe scenario actions and commands (parameters, types, entity references) and the fields of entity kinds — their own and other mods'. The catalog merges them in load order, the checker validates values, the line writer builds scenario lines, the index knows the ids of any kind. The validator, the data editors and the Data Editor window build on it. diff --git a/locale/es.properties b/locale/es.properties new file mode 100644 index 0000000..9c01cb4 --- /dev/null +++ b/locale/es.properties @@ -0,0 +1,2 @@ +mod_schema_base_name = Esquemas +mod_schema_base_desc = Anotaciones como datos: los archivos schemas/*.json de cualquier mod describen acciones y comandos de escenarios (parámetros, tipos, referencias a entidades) y los campos de los tipos de entidades, propios y ajenos. El catálogo los fusiona por orden de carga, el comprobador valida valores, el escritor arma líneas de escenario y el índice conoce los id de cualquier tipo. Sobre esto se apoyan el validador, los editores de datos y la ventana Editor de datos. diff --git a/locale/ja.properties b/locale/ja.properties new file mode 100644 index 0000000..ca10e84 --- /dev/null +++ b/locale/ja.properties @@ -0,0 +1,2 @@ +mod_schema_base_name = スキーマ +mod_schema_base_desc = データとしての注釈:どの MOD の schemas/*.json もシナリオの行動とコマンド(パラメーター、型、エンティティ参照)とエンティティの種類のフィールドを記述する——自分のものも他の MOD のものも。カタログが読み込み順に統合し、チェッカーが値を検査し、行ライターがシナリオの行を書き、インデックスがあらゆる種類の id を知る。バリデーター、データエディター、「データエディター」ウィンドウがこれに乗っている。 diff --git a/locale/ko.properties b/locale/ko.properties new file mode 100644 index 0000000..2deae59 --- /dev/null +++ b/locale/ko.properties @@ -0,0 +1,2 @@ +mod_schema_base_name = 스키마 +mod_schema_base_desc = 데이터로 된 주석: 어떤 모드의 schemas/*.json이든 시나리오의 행동과 명령(매개변수, 유형, 엔티티 참조), 엔티티 종류의 필드를 설명합니다 — 자기 것이든 다른 모드의 것이든. 카탈로그가 로드 순서대로 합치고, 검사기가 값을 검증하고, 줄 작성기가 시나리오 줄을 쓰고, 색인이 모든 종류의 id를 압니다. 검증기, 데이터 에디터, ‘데이터 에디터’ 창이 이 위에 있습니다. diff --git a/locale/ru.properties b/locale/ru.properties new file mode 100644 index 0000000..2f1c415 --- /dev/null +++ b/locale/ru.properties @@ -0,0 +1,2 @@ +mod_schema_base_name = Схемы +mod_schema_base_desc = Аннотации как данные: файлы schemas/*.json любого мода описывают действия и команды сценариев (параметры, типы, ссылки на сущности) и поля видов сущностей — свои и чужие. Каталог сливает их по порядку загрузки, проверка сверяет значения, построитель пишет строки сценария, индекс знает id любого вида. На этом стоят валидатор, редакторы данных и окно «Редактор данных». diff --git a/locale/vi.properties b/locale/vi.properties new file mode 100644 index 0000000..312e1f6 --- /dev/null +++ b/locale/vi.properties @@ -0,0 +1,2 @@ +mod_schema_base_name = Lược đồ +mod_schema_base_desc = Chú thích dưới dạng dữ liệu: tệp schemas/*.json của mọi mod mô tả hành động và lệnh kịch bản (tham số, kiểu, tham chiếu thực thể) cùng các trường của loại thực thể — của mình hay của mod khác. Danh mục gộp chúng theo thứ tự tải, bộ kiểm tra soát giá trị, bộ viết tạo dòng kịch bản, chỉ mục biết id của mọi loại. Trình kiểm tra, các trình sửa dữ liệu và cửa sổ Trình sửa dữ liệu đều dựa trên nó. diff --git a/locale/zh.properties b/locale/zh.properties new file mode 100644 index 0000000..99bd09c --- /dev/null +++ b/locale/zh.properties @@ -0,0 +1,2 @@ +mod_schema_base_name = 模式 +mod_schema_base_desc = 数据化的注解:任何模组的 schemas/*.json 文件描述剧本的动作和命令(参数、类型、实体引用)以及实体类型的字段——自己的和其他模组的。目录按加载顺序合并它们,检查器验证数值,行生成器写出剧本行,索引知道任何类型的 id。验证器、数据编辑器和“数据编辑器”窗口都建立在其上。 diff --git a/manifest.json b/manifest.json new file mode 100644 index 0000000..87dd1b2 --- /dev/null +++ b/manifest.json @@ -0,0 +1,15 @@ +{ + "id": "schema_base", + "name": "Schemas", + "version": "1.0.0", + "author": "ct", + "description": "Annotations as data: schemas/*.json files any mod ships describe scenario actions, DSL commands (parameters, types, entity references) and the fields of entity kinds — its own or another mod's. The catalog merges them in load order (an action or command is replaced whole, a kind is merged field by field), the checker validates values, the line writer builds DSL lines, the entity index knows the ids of any kind. The validator, the data editors and the Data Editor window build on it.", + "category": "engine, library", + "sources": [ + "src/**/*.cs" + ], + "test_sources": [ + "tests/*.cs" + ], + "depends": [] +} diff --git a/mod.jpg b/mod.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6aec61820c51738114cb88d008df97b84c8d4c91 GIT binary patch literal 132720 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 r&j%=K(yV7+EXwSuMa7zj{rur^p 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

ZfAuxS7~In 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 L&Cf4}{9F1z=~-Wt literal 0 HcmV?d00001 diff --git a/src/ActionSchema.cs b/src/ActionSchema.cs new file mode 100644 index 0000000..86537e8 --- /dev/null +++ b/src/ActionSchema.cs @@ -0,0 +1,31 @@ +namespace Cthangover.Mods.Schemas +{ + using System.Collections.Generic; + + ///

+ /// A scenario action (action <id> key=value …) as data: what it does and what + /// it takes. The mod that implements the action ships its schema next to the code, but + /// anyone may describe an action — the schema tools describe the engine's own and other + /// mods' actions this way, like type definitions for a library that has none. + /// + public class ActionSchema + { + /// The action name after action (stat.add). + public string Id { get; set; } + + /// Locale key of the palette title. + public string Name { get; set; } + + /// Locale key of the help text. + public string Description { get; set; } + + /// Free group name the palette sorts by (stats, battle, items). + public string Category { get; set; } + + /// Named parameters, in form order. + public List Params { get; set; } = new(); + + /// The mod whose schema file won for this id (filled by the catalog). + public string SourceMod { get; set; } + } +} diff --git a/src/CommandSchema.cs b/src/CommandSchema.cs new file mode 100644 index 0000000..0c37390 --- /dev/null +++ b/src/CommandSchema.cs @@ -0,0 +1,35 @@ +namespace Cthangover.Mods.Schemas +{ + using System.Collections.Generic; + + /// + /// A DSL command other than action (check, when, text…): its + /// positional arguments, its named ones and whether it jumps with -> :label. + /// + public class CommandSchema + { + /// The command word. + public string Id { get; set; } + + /// Locale key of the palette title. + public string Name { get; set; } + + /// Locale key of the help text. + public string Description { get; set; } + + /// Palette group. + public string Category { get; set; } + + /// Positional arguments in order (a quoted text, a stat id, a difficulty…). + public List Positional { get; set; } = new(); + + /// Named arguments. + public List Params { get; set; } = new(); + + /// Locale key naming the arrow target (-> :label); null when the command takes none. + public string Arrow { get; set; } + + /// The mod whose schema file won for this id (filled by the catalog). + public string SourceMod { get; set; } + } +} diff --git a/src/FieldSchema.cs b/src/FieldSchema.cs new file mode 100644 index 0000000..a8ac25f --- /dev/null +++ b/src/FieldSchema.cs @@ -0,0 +1,61 @@ +namespace Cthangover.Mods.Schemas +{ + using System.Collections.Generic; + + /// + /// One described value: a parameter of a scenario action or command, or a field of an + /// entity kind. The description is what turns a key into a form control and a checked + /// reference: picks the control (a number box, an entity picker, a + /// formula field…), the rest fills it. Unknown types fall back to a text box, so a + /// schema written for a newer tool still opens in an older one. + /// + public class FieldSchema + { + /// The parameter name (enemies) or the JSON property (Traits). + public string Key { get; set; } + + /// + /// text, locale (a locale key with a text per language), int, + /// number, bool, choice (), ref and + /// ref_list (entities of ), picture (a file of + /// ), formula, condition, who (player, party + /// or a character), scene, flag, label, list (objects of + /// ), map (keys from to numbers or formulas), + /// json. + /// + public string Type { get; set; } = "text"; + + /// Locale key of the label; the key itself is shown when empty. + public string Name { get; set; } + + /// Locale key of the tooltip and the palette's help line. + public string Description { get; set; } + + /// Whether the value must be given (the validator reports a missing one). + public bool Required { get; set; } + + /// The value a form starts with (and what the game assumes when it is left out). + public string Default { get; set; } + + /// Allowed values of a choice. + public List Options { get; set; } + + /// The entity kind of a ref, ref_list or the keys of a map. + public string Kind { get; set; } + + /// The file group of a picture (items, characters). + public string Group { get; set; } + + /// + /// How a new locale key is made: {id} is the entity id, {mod} the + /// mod id, {key} this field's key ("{mod}/stat/{id}"). + /// + public string KeyPattern { get; set; } + + /// The fields of each object of a list. + public List Of { get; set; } + + /// The mod whose schema file declared this field (filled by the catalog). + public string SourceMod { get; set; } + } +} diff --git a/src/GameEntityIndex.cs b/src/GameEntityIndex.cs new file mode 100644 index 0000000..b1b7fe2 --- /dev/null +++ b/src/GameEntityIndex.cs @@ -0,0 +1,111 @@ +namespace Cthangover.Mods.Schemas +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text.Json; + using Cthangover.Core.Mods; + using Godot; + + /// + /// Entity ids and names per kind of the loaded mods, read from their data files the way + /// the entity resolver reads them (top-level "Kind", "Items" with + /// "Id"). The tools need it for any kind a schema names — including kinds whose + /// C# type the tools have never heard of — to fill reference pickers and to check that + /// a referenced id exists. Built on demand; after a save. + /// + public static class GameEntityIndex + { + private static Dictionary> byKind; + + /// Ids of with their name keys, sorted by id. + public static IReadOnlyDictionary Of(string kind) + { + Ensure(); + return kind != null && byKind.TryGetValue(kind, out var ids) ? ids : new SortedDictionary(); + } + + /// Whether an entity exists (the checker's callback). + public static bool Exists(string kind, string id) => id != null && Of(kind).Keys.Any(k => string.Equals(k, id, StringComparison.OrdinalIgnoreCase)); + + /// Every kind found in data files, with its entity count. + public static IReadOnlyDictionary Kinds() + { + Ensure(); + return byKind.ToDictionary(p => p.Key, p => p.Value.Count, StringComparer.OrdinalIgnoreCase); + } + + /// The text shown for an entity: its translated name and id, or the id. + public static string Label(string kind, string id) + { + var key = Of(kind).TryGetValue(id ?? string.Empty, out var name) ? name : null; + var text = string.IsNullOrEmpty(key) ? null : TranslationServer.Translate(key).ToString(); + return string.IsNullOrEmpty(text) || text == key ? id : $"{text} · {id}"; + } + + /// Forgets the index (data changed on disk). + public static void Refresh() => byKind = null; + + private static void Ensure() + { + if (byKind != null) + return; + byKind = new Dictionary>(StringComparer.OrdinalIgnoreCase); + var manager = ModManager.Instance; + if (manager?.Mods == null) + return; + foreach (var mod in manager.Mods.Keys) + { + foreach (var path in JsonFiles(manager, mod, string.Empty).Where(IsData)) + Read(manager.ReadFileText(mod, path)); + } + } + + private static IEnumerable JsonFiles(ModManager manager, string mod, string directory) + { + // Entries are mod-relative paths; directories end with a slash. + foreach (var entry in manager.ListFiles(mod, directory)) + { + if (entry.EndsWith("/")) + { + foreach (var nested in JsonFiles(manager, mod, entry.TrimEnd('/'))) + yield return nested; + } + else if (entry.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) + { + yield return entry.Replace('\\', '/'); + } + } + } + + private static bool IsData(string path) + => !path.StartsWith("schemas/", StringComparison.OrdinalIgnoreCase) + && !path.StartsWith("patches/", StringComparison.OrdinalIgnoreCase) + && !path.EndsWith("manifest.json", StringComparison.OrdinalIgnoreCase); + + private static void Read(string text) + { + if (string.IsNullOrWhiteSpace(text)) + return; + try + { + using var doc = JsonDocument.Parse(text); + var root = doc.RootElement; + if (root.ValueKind != JsonValueKind.Object || !root.TryGetProperty("Kind", out var kind) || kind.ValueKind != JsonValueKind.String + || !root.TryGetProperty("Items", out var items) || items.ValueKind != JsonValueKind.Array) + return; + if (!byKind.TryGetValue(kind.GetString(), out var ids)) + byKind[kind.GetString()] = ids = new SortedDictionary(StringComparer.Ordinal); + foreach (var item in items.EnumerateArray().Where(i => i.ValueKind == JsonValueKind.Object)) + { + if (item.TryGetProperty("Id", out var id) && id.ValueKind == JsonValueKind.String) + ids[id.GetString()] = item.TryGetProperty("Name", out var name) && name.ValueKind == JsonValueKind.String ? name.GetString() : null; + } + } + catch (JsonException) + { + // A broken data file is the validator's business; the index just skips it. + } + } + } +} diff --git a/src/KindSchema.cs b/src/KindSchema.cs new file mode 100644 index 0000000..c0c81ba --- /dev/null +++ b/src/KindSchema.cs @@ -0,0 +1,35 @@ +namespace Cthangover.Mods.Schemas +{ + using System.Collections.Generic; + + /// + /// The editable fields of an entity kind ("Kind": "stat", "item"…). Several + /// mods may describe the same kind: their fields are merged, so the items mod describes + /// price and picture, the equipment mod adds Equip and Traits, and the + /// data editor window shows one form with all of them — the editor grows with the mods + /// instead of being rewritten for each. + /// + public class KindSchema + { + /// The entity kind. + public string Kind { get; set; } + + /// Locale key of the kind's name in the data editor window. + public string Name { get; set; } + + /// Locale key of the help text. + public string Description { get; set; } + + /// Folder new entities are written to (<Folder>/<mod>.json). + public string Folder { get; set; } + + /// Id a new entity starts from; {mod} is the mod id ("{mod}/new_stat"). + public string NewId { get; set; } + + /// Order in the data editor window's kind list. + public int Order { get; set; } + + /// The fields, in form order (merged across mods). + public List Fields { get; set; } = new(); + } +} diff --git a/src/SchemaCatalog.cs b/src/SchemaCatalog.cs new file mode 100644 index 0000000..e95930f --- /dev/null +++ b/src/SchemaCatalog.cs @@ -0,0 +1,161 @@ +namespace Cthangover.Mods.Schemas +{ + using System; + using System.Collections.Generic; + using System.Linq; + using System.Text.Json; + using Cthangover.Core.Mods; + using Cthangover.Core.Mods.Resolvers; + using Cthangover.Core.Utils; + + /// + /// Every schema of the loaded mods, merged: the source of the data editor window's forms, + /// the command palette and the schema validator. Files are the schemas file group + /// of all mods, read in mod load order, and merged by the same rule the engine uses for + /// content — the later mod wins: + /// + /// an action or a command is replaced whole by a later schema with the same id; + /// a kind is merged field by field: a later mod adds its fields and replaces a field + /// with the same key; its non-empty name, folder and new-id pattern win. + /// + /// So a mod describes what it adds to someone else's kind without copying their schema, + /// and a mod that disagrees with a description replaces only that one entry. + /// + public class SchemaCatalog + { + private const string Group = "schemas"; + + private static readonly JsonSerializerOptions Options = new() { PropertyNameCaseInsensitive = true, ReadCommentHandling = JsonCommentHandling.Skip, AllowTrailingCommas = true }; + + private static SchemaCatalog current; + private static object snapshot; + + /// Actions by id (case-insensitive). + public Dictionary Actions { get; } = new(StringComparer.OrdinalIgnoreCase); + + /// Commands by word (case-insensitive). + public Dictionary Commands { get; } = new(StringComparer.OrdinalIgnoreCase); + + /// Kinds by kind name (case-insensitive). + public Dictionary Kinds { get; } = new(StringComparer.OrdinalIgnoreCase); + + /// Files that did not parse, as "mod:path: message". + public List Errors { get; } = new(); + + /// + /// The catalog of the running game, rebuilt when the file group changes (a reload, a + /// tool that cleared the file cache after writing a schema). + /// + public static SchemaCatalog Current + { + get + { + var files = Files.Collect(Group); + if (current != null && ReferenceEquals(files, snapshot)) + return current; + snapshot = files; + current = Build(Read(files)); + foreach (var error in current.Errors) + GameLogger.Log("TOOLS", "schemas: " + error, LogLevel.Error); + return current; + } + } + + /// Merges schema files given as (mod, path, JSON text) in load order. + public static SchemaCatalog Build(IEnumerable<(string ModId, string Path, string Json)> files) + { + var catalog = new SchemaCatalog(); + foreach (var (modId, path, json) in files) + { + SchemaFile file; + try + { + file = JsonSerializer.Deserialize(json ?? string.Empty, Options); + } + catch (JsonException ex) + { + catalog.Errors.Add($"{modId}:{path}: {ex.Message}"); + continue; + } + if (file != null) + catalog.Merge(modId, file); + } + return catalog; + } + + /// The fields of , or an empty list. + public IReadOnlyList FieldsOf(string kind) + => kind != null && Kinds.TryGetValue(kind, out var schema) ? schema.Fields : new List(); + + /// Applies one mod's file on top of what is merged so far. + public void Merge(string modId, SchemaFile file) + { + foreach (var action in file.Actions?.Where(a => !string.IsNullOrWhiteSpace(a?.Id)) ?? Enumerable.Empty()) + { + action.SourceMod = modId; + Stamp(action.Params, modId); + Actions[action.Id] = action; + } + foreach (var command in file.Commands?.Where(c => !string.IsNullOrWhiteSpace(c?.Id)) ?? Enumerable.Empty()) + { + command.SourceMod = modId; + Stamp(command.Positional, modId); + Stamp(command.Params, modId); + Commands[command.Id] = command; + } + foreach (var kind in file.Kinds?.Where(k => !string.IsNullOrWhiteSpace(k?.Kind)) ?? Enumerable.Empty()) + MergeKind(modId, kind); + } + + private void MergeKind(string modId, KindSchema incoming) + { + Stamp(incoming.Fields, modId); + if (!Kinds.TryGetValue(incoming.Kind, out var merged)) + { + Kinds[incoming.Kind] = incoming; + incoming.Fields ??= new List(); + return; + } + if (!string.IsNullOrWhiteSpace(incoming.Name)) + merged.Name = incoming.Name; + if (!string.IsNullOrWhiteSpace(incoming.Description)) + merged.Description = incoming.Description; + if (!string.IsNullOrWhiteSpace(incoming.Folder)) + merged.Folder = incoming.Folder; + if (!string.IsNullOrWhiteSpace(incoming.NewId)) + merged.NewId = incoming.NewId; + if (incoming.Order != 0) + merged.Order = incoming.Order; + foreach (var field in incoming.Fields ?? new List()) + { + var at = merged.Fields.FindIndex(f => string.Equals(f.Key, field.Key, StringComparison.OrdinalIgnoreCase)); + if (at >= 0) + merged.Fields[at] = field; + else + merged.Fields.Add(field); + } + } + + private static void Stamp(List fields, string modId) + { + foreach (var field in fields?.Where(f => f != null) ?? Enumerable.Empty()) + { + field.SourceMod = modId; + Stamp(field.Of, modId); + } + } + + private static IEnumerable<(string, string, string)> Read(Dictionary files) + { + if (files == null) + yield break; + var order = ModRegistry.Instance.GetOrderedModIds().Select((id, i) => (id, i)).ToDictionary(p => p.id, p => p.i, StringComparer.OrdinalIgnoreCase); + foreach (var pair in files.Where(p => p.Key.EndsWith(".json", StringComparison.OrdinalIgnoreCase)) + .OrderBy(p => order.TryGetValue(p.Value.ModId ?? string.Empty, out var i) ? i : int.MaxValue) + .ThenBy(p => p.Key, StringComparer.Ordinal)) + { + yield return (pair.Value.ModId, pair.Value.FullPath, ModManager.Instance.ReadFileText(pair.Value.ModId, pair.Value.FullPath)); + } + } + } +} diff --git a/src/SchemaChecker.cs b/src/SchemaChecker.cs new file mode 100644 index 0000000..0cc635c --- /dev/null +++ b/src/SchemaChecker.cs @@ -0,0 +1,103 @@ +namespace Cthangover.Mods.Schemas +{ + using System; + using System.Collections.Generic; + using System.Globalization; + using System.Linq; + + /// + /// Checks values against field schemas: unknown parameters, missing required ones, + /// numbers that are not numbers, choices outside their options and references to + /// entities that do not exist. The same checks feed the validator report (files on + /// disk) and the command palette (a line being built), so an author sees in the + /// editor what the report would say. + /// + /// Existence is asked through a callback, because the validator knows entities from + /// the mods' files and the palette from the running game; a null callback skips it. + /// + public static class SchemaChecker + { + private static readonly string[] BoolWords = { "0", "1", "true", "false", "yes", "no" }; + + /// Checks named values of (an action or command name, for messages). + public static List CheckNamed(string owner, IReadOnlyList fields, IReadOnlyDictionary named, Func exists) + { + var issues = new List(); + fields ??= new List(); + named ??= new Dictionary(); + foreach (var key in named.Keys) + { + if (!fields.Any(f => string.Equals(f.Key, key, StringComparison.OrdinalIgnoreCase))) + issues.Add(new SchemaIssue(false, "SCHEMA_UNKNOWN_PARAM", $"'{owner}' has no parameter '{key}' (known: {string.Join(", ", fields.Select(f => f.Key))})")); + } + foreach (var field in fields) + { + var value = named.FirstOrDefault(p => string.Equals(p.Key, field.Key, StringComparison.OrdinalIgnoreCase)).Value; + issues.AddRange(CheckValue(owner, field, value, exists)); + } + return issues; + } + + /// Checks positional values in order against . + public static List CheckPositional(string owner, IReadOnlyList fields, IReadOnlyList positional, Func exists) + { + var issues = new List(); + fields ??= new List(); + for (var i = 0; i < fields.Count; i++) + issues.AddRange(CheckValue(owner, fields[i], positional != null && i < positional.Count ? positional[i] : null, exists)); + return issues; + } + + /// Checks one value (null or empty = not given). + public static List CheckValue(string owner, FieldSchema field, string value, Func exists) + { + var issues = new List(); + if (string.IsNullOrWhiteSpace(value)) + { + if (field.Required) + issues.Add(new SchemaIssue(true, "SCHEMA_MISSING_PARAM", $"'{owner}' needs '{field.Key}'")); + return issues; + } + value = value.Trim(); + switch (field.Type?.ToLowerInvariant()) + { + case "int": + if (!int.TryParse(value, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out _)) + issues.Add(new SchemaIssue(true, "SCHEMA_BAD_VALUE", $"'{owner}': '{field.Key}' must be a whole number, got '{value}'")); + break; + case "number": + if (!double.TryParse(value, NumberStyles.Float, CultureInfo.InvariantCulture, out _)) + issues.Add(new SchemaIssue(true, "SCHEMA_BAD_VALUE", $"'{owner}': '{field.Key}' must be a number, got '{value}'")); + break; + case "bool": + if (!BoolWords.Contains(value.ToLowerInvariant())) + issues.Add(new SchemaIssue(false, "SCHEMA_BAD_VALUE", $"'{owner}': '{field.Key}' should be 1 or 0, got '{value}'")); + break; + case "choice": + if (field.Options is { Count: > 0 } && !field.Options.Contains(value, StringComparer.OrdinalIgnoreCase)) + issues.Add(new SchemaIssue(false, "SCHEMA_BAD_VALUE", $"'{owner}': '{field.Key}' is one of {string.Join(", ", field.Options)}, got '{value}'")); + break; + case "ref": + CheckRef(owner, field, field.Kind, value, exists, issues); + break; + case "ref_list": + foreach (var part in value.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) + CheckRef(owner, field, field.Kind, part, exists, issues); + break; + case "who": + if (!string.Equals(value, "player", StringComparison.OrdinalIgnoreCase) && !string.Equals(value, "party", StringComparison.OrdinalIgnoreCase)) + CheckRef(owner, field, "character", value, exists, issues); + break; + } + return issues; + } + + private static void CheckRef(string owner, FieldSchema field, string kind, string id, Func exists, List issues) + { + if (exists == null || string.IsNullOrWhiteSpace(kind)) + return; + if (!exists(kind, id)) + issues.Add(new SchemaIssue(true, "SCHEMA_UNKNOWN_REF", $"'{owner}': '{field.Key}' names {kind} '{id}', which no loaded mod defines")); + } + } +} diff --git a/src/SchemaFile.cs b/src/SchemaFile.cs new file mode 100644 index 0000000..a7487c7 --- /dev/null +++ b/src/SchemaFile.cs @@ -0,0 +1,20 @@ +namespace Cthangover.Mods.Schemas +{ + using System.Collections.Generic; + + /// + /// One schemas/*.json file of a mod. Any mod may ship one, with no dependency on + /// the schema tools: without them the file is simply never read. + /// + public class SchemaFile + { + /// Described scenario actions. + public List Actions { get; set; } = new(); + + /// Described DSL commands. + public List Commands { get; set; } = new(); + + /// Described entity kinds (fields merge across files). + public List Kinds { get; set; } = new(); + } +} diff --git a/src/SchemaIssue.cs b/src/SchemaIssue.cs new file mode 100644 index 0000000..3d01ba8 --- /dev/null +++ b/src/SchemaIssue.cs @@ -0,0 +1,23 @@ +namespace Cthangover.Mods.Schemas +{ + /// One problem a schema finds in a line or an entity: an error breaks the game, a warning is likely a typo. + public class SchemaIssue + { + /// Creates an issue. + public SchemaIssue(bool isError, string code, string message) + { + IsError = isError; + Code = code; + Message = message; + } + + /// True for an error, false for a warning. + public bool IsError { get; } + + /// Stable code (SCHEMA_MISSING_PARAM…), what reports and tests match on. + public string Code { get; } + + /// English text for the report. + public string Message { get; } + } +} diff --git a/src/SchemaJson.cs b/src/SchemaJson.cs new file mode 100644 index 0000000..48102a9 --- /dev/null +++ b/src/SchemaJson.cs @@ -0,0 +1,75 @@ +namespace Cthangover.Mods.Schemas +{ + using System; + using System.Globalization; + using System.Linq; + using System.Text.Json.Nodes; + + /// + /// Between a form's text value and the JSON node of a field: numbers stay numbers, bools + /// stay bools, a ref_list is an array of ids, a map value is a number when + /// it is one and a formula text otherwise — the shapes the engine's JSON readers expect. + /// + public static class SchemaJson + { + /// The node for of a field (null for an empty value). + public static JsonNode ToNode(FieldSchema field, string text) + { + if (string.IsNullOrWhiteSpace(text)) + return null; + text = text.Trim(); + switch (field.Type?.ToLowerInvariant()) + { + case "int": + return int.TryParse(text, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var i) ? JsonValue.Create(i) : JsonValue.Create(text); + case "number": + return NumberOrText(text); + case "bool": + return JsonValue.Create(text is "1" or "true" or "True" or "yes"); + case "ref_list": + return new JsonArray(text.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries).Select(s => (JsonNode)JsonValue.Create(s)).ToArray()); + case "json": + try + { + return JsonNode.Parse(text); + } + catch (System.Text.Json.JsonException) + { + return JsonValue.Create(text); + } + default: + return JsonValue.Create(text); + } + } + + /// A number node when is a number, else the text (a formula). + public static JsonNode NumberOrText(string text) + { + if (int.TryParse(text, NumberStyles.AllowLeadingSign, CultureInfo.InvariantCulture, out var i)) + return JsonValue.Create(i); + if (double.TryParse(text, NumberStyles.Float, CultureInfo.InvariantCulture, out var d)) + return JsonValue.Create(d); + return JsonValue.Create(text); + } + + /// The text of a node for a form (an array of strings joins with commas). + public static string ToText(JsonNode node) + { + switch (node) + { + case null: + return string.Empty; + case JsonArray array when array.All(n => n is JsonValue): + return string.Join(",", array.Select(n => n?.ToString())); + case JsonValue value when value.TryGetValue(out bool b): + return b ? "1" : string.Empty; + case JsonValue value when value.TryGetValue(out double d): + return d.ToString(CultureInfo.InvariantCulture); + case JsonValue value: + return value.ToString(); + default: + return node.ToJsonString(); + } + } + } +} diff --git a/src/SchemaLine.cs b/src/SchemaLine.cs new file mode 100644 index 0000000..04b5592 --- /dev/null +++ b/src/SchemaLine.cs @@ -0,0 +1,66 @@ +namespace Cthangover.Mods.Schemas +{ + using System.Collections.Generic; + using System.Linq; + using System.Text; + + /// + /// Writes scenario lines from schema values, in the DSL's own syntax: values with spaces + /// or quotes are quoted (inner quotes escaped; a named pair is quoted whole, + /// "text=two words"), empty values are left out, named + /// parameters follow the schema's order, the arrow target comes last. What the palette + /// inserts is exactly what an author would have typed, so the text stays the source of + /// truth and every other tool (validator, studio, atlases) reads it unchanged. + /// + public static class SchemaLine + { + /// action <id> k=v … for an action schema. + public static string Action(ActionSchema schema, IReadOnlyDictionary values) + { + var line = new StringBuilder("action ").Append(schema.Id); + AppendNamed(line, schema.Params, values); + return line.ToString(); + } + + /// A command line: positional values in order, then named ones, then -> :label. + public static string Command(CommandSchema schema, IReadOnlyDictionary values, string arrow) + { + var line = new StringBuilder(schema.Id); + foreach (var field in schema.Positional ?? new List()) + { + var value = Get(values, field.Key); + if (string.IsNullOrEmpty(value)) + continue; + line.Append(' ').Append(Quote(value)); + } + AppendNamed(line, schema.Params, values); + if (!string.IsNullOrWhiteSpace(arrow)) + line.Append(" -> :").Append(arrow.Trim().TrimStart(':')); + return line.ToString(); + } + + /// A value as one DSL token: as it is when it has no spaces or quotes, else quoted. + public static string Quote(string value) + { + if (value.Length > 0 && !value.Any(c => char.IsWhiteSpace(c) || c == '"')) + return value; + return "\"" + value.Replace("\"", "\\\"") + "\""; + } + + private static void AppendNamed(StringBuilder line, List fields, IReadOnlyDictionary values) + { + foreach (var field in fields ?? new List()) + { + var value = Get(values, field.Key); + if (string.IsNullOrEmpty(value)) + continue; + // The DSL splits a token at its first '=' after reading it whole, and quotes + // only work at the start of a token: a value with spaces quotes the pair. + line.Append(' ').Append(Quote(field.Key + "=" + value)); + } + } + + private static string Get(IReadOnlyDictionary values, string key) + => key != null && values != null && values.TryGetValue(key, out var value) ? value?.Trim() : null; + } +} diff --git a/src/SchemaReferences.cs b/src/SchemaReferences.cs new file mode 100644 index 0000000..f092815 --- /dev/null +++ b/src/SchemaReferences.cs @@ -0,0 +1,43 @@ +namespace Cthangover.Mods.Schemas +{ + using System; + using System.Collections.Generic; + + /// + /// The entity references a value makes, by its field type: a ref names one entity + /// of the field's kind, a ref_list a comma list, a who a character unless it + /// is player or party, a scene a logical scene. Values built at run + /// time (${var}) are no references. The validator turns these into graph + /// references, the same graph its own strategies fill, so missing targets are reported + /// once, by one rule. + /// + public static class SchemaReferences + { + /// The kind of a scene reference. + public const string SceneKind = "scene"; + + /// (kind, id) pairs of refers to. + public static IEnumerable<(string Kind, string Id)> Of(FieldSchema field, string value) + { + if (field == null || string.IsNullOrWhiteSpace(value) || value.Contains("${", StringComparison.Ordinal)) + yield break; + value = value.Trim(); + switch (field.Type?.ToLowerInvariant()) + { + case "ref" when !string.IsNullOrWhiteSpace(field.Kind): + yield return (field.Kind, value); + break; + case "ref_list" when !string.IsNullOrWhiteSpace(field.Kind): + foreach (var part in value.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries)) + yield return (field.Kind, part); + break; + case "who" when !string.Equals(value, "player", StringComparison.OrdinalIgnoreCase) && !string.Equals(value, "party", StringComparison.OrdinalIgnoreCase): + yield return ("character", value); + break; + case "scene": + yield return (SceneKind, value); + break; + } + } + } +} diff --git a/tests/SchemaCatalogTests.cs b/tests/SchemaCatalogTests.cs new file mode 100644 index 0000000..66fd3a7 --- /dev/null +++ b/tests/SchemaCatalogTests.cs @@ -0,0 +1,65 @@ +namespace Cthangover.Mods.Schemas.Tests +{ + using System.Collections.Generic; + using System.Linq; + using Cthangover.Core.Mods.Testing; + + /// + /// Merging schema files of several mods: the later mod replaces an action or command + /// whole and a kind's field by key, and adds fields of its own; broken files are reported. + /// + public class SchemaCatalogTests + { + private const string First = "{\"Actions\":[{\"Id\":\"x.do\",\"Params\":[{\"Key\":\"a\"}]}],\"Kinds\":[{\"Kind\":\"item\",\"Name\":\"k/item\",\"Folder\":\"items\",\"Fields\":[{\"Key\":\"Name\",\"Type\":\"locale\"},{\"Key\":\"Cost\",\"Type\":\"text\"}]}]}"; + private const string Second = "{\"actions\":[{\"id\":\"x.do\",\"params\":[{\"key\":\"b\",\"type\":\"int\"}]}],\"kinds\":[{\"kind\":\"ITEM\",\"fields\":[{\"key\":\"cost\",\"type\":\"int\"},{\"key\":\"Equip\"}]}],\"commands\":[{\"id\":\"check\",\"arrow\":\"k/arrow\"}]}"; + + [ModTest("catalog/later_mod_wins_and_fields_merge")] + static void LaterModWinsAndFieldsMerge(ModTestContext ctx) + { + var catalog = SchemaCatalog.Build(new List<(string, string, string)> { ("mod_a", "schemas/a.json", First), ("mod_b", "schemas/b.json", Second) }); + + ModAssert.Equal(0, catalog.Errors.Count, "both files parse (keys in any case)"); + var action = catalog.Actions["X.DO"]; + ModAssert.Equal("mod_b", action.SourceMod, "the later action replaced the earlier"); + ModAssert.Equal(1, action.Params.Count, "replaced whole, not merged"); + ModAssert.Equal("b", action.Params[0].Key, "the later parameter"); + + var item = catalog.Kinds["item"]; + ModAssert.Equal("k/item", item.Name, "a kind keeps the name nobody replaced"); + ModAssert.Equal("items", item.Folder, "and the folder"); + ModAssert.Equal(3, item.Fields.Count, "Name, Cost, Equip"); + ModAssert.Equal("Name", item.Fields[0].Key, "order kept"); + ModAssert.Equal("int", item.Fields[1].Type, "a field with the same key is replaced in place"); + ModAssert.Equal("mod_b", item.Fields[1].SourceMod, "and remembers who described it"); + ModAssert.Equal("Equip", item.Fields[2].Key, "a new field is appended"); + ModAssert.Equal("mod_a", item.Fields[0].SourceMod, "the untouched field keeps its source"); + ModAssert.NotNull(catalog.Commands["check"], "commands are read too"); + } + + [ModTest("catalog/broken_files_are_reported")] + static void BrokenFilesAreReported(ModTestContext ctx) + { + var catalog = SchemaCatalog.Build(new List<(string, string, string)> { ("mod_a", "schemas/a.json", "{ not json"), ("mod_b", "schemas/b.json", First) }); + + ModAssert.Equal(1, catalog.Errors.Count, "one broken file"); + ModAssert.True(catalog.Errors[0].StartsWith("mod_a:schemas/a.json"), "named by mod and path"); + ModAssert.NotNull(catalog.Actions["x.do"], "the good file still counts"); + } + + [ModTest("catalog/loaded_mods_describe_their_actions_and_kinds")] + static void LoadedModsDescribe(ModTestContext ctx) + { + var catalog = SchemaCatalog.Current; + ModAssert.Equal(0, catalog.Errors.Count, "every shipped schema parses: " + string.Join("; ", catalog.Errors)); + foreach (var id in new[] { "stat.add", "stat.exp", "equip.put", "item.add", "rpg.battle", "trade.open" }) + ModAssert.True(catalog.Actions.ContainsKey(id), $"action {id} is described"); + foreach (var id in new[] { "check", "when", "text", "switch_scene" }) + ModAssert.True(catalog.Commands.ContainsKey(id), $"command {id} is described"); + var item = catalog.FieldsOf("item").Select(f => f.Key).ToList(); + ModAssert.True(item.Contains("Cost") && item.Contains("Equip") && item.Contains("Traits"), "items: the tools' own fields and the equipment mod's merged"); + var character = catalog.FieldsOf("character").Select(f => f.Key).ToList(); + ModAssert.True(character.Contains("Health") && character.Contains("Archetype") && character.Contains("Stats"), "characters: builtin and stats fields merged"); + ModAssert.True(catalog.FieldsOf("action").Any(f => f.Key == "Values" && f.Of.Any(o => o.Key == "Formula")), "battle formulas describe action values"); + } + } +} diff --git a/tests/SchemaCheckerTests.cs b/tests/SchemaCheckerTests.cs new file mode 100644 index 0000000..555fd39 --- /dev/null +++ b/tests/SchemaCheckerTests.cs @@ -0,0 +1,53 @@ +namespace Cthangover.Mods.Schemas.Tests +{ + using System.Collections.Generic; + using System.Linq; + using Cthangover.Core.Mods.Testing; + + /// What the validator and the palette report about values. + public class SchemaCheckerTests + { + private static readonly List Fields = new() + { + new() { Key = "id", Type = "ref", Kind = "item", Required = true }, + new() { Key = "count", Type = "int" }, + new() { Key = "rate", Type = "number" }, + new() { Key = "mode", Type = "choice", Options = new List { "fast", "slow" } }, + new() { Key = "on", Type = "bool" }, + new() { Key = "who", Type = "who" }, + new() { Key = "enemies", Type = "ref_list", Kind = "character" }, + }; + + private static bool Exists(string kind, string id) => kind == "item" && id == "sword" || kind == "character" && id is "hero" or "wolf"; + + private static List Codes(Dictionary named) => SchemaChecker.CheckNamed("t", Fields, named, Exists).Select(i => (i.IsError ? "E:" : "W:") + i.Code).ToList(); + + [ModTest("checker/clean_values_pass")] + static void CleanValuesPass(ModTestContext ctx) + { + var codes = Codes(new Dictionary { ["id"] = "sword", ["count"] = "-2", ["rate"] = "0.5", ["mode"] = "FAST", ["on"] = "1", ["who"] = "party", ["enemies"] = "hero, wolf" }); + ModAssert.Equal(0, codes.Count, "no issue: " + string.Join(",", codes)); + } + + [ModTest("checker/each_problem_is_named")] + static void EachProblemIsNamed(ModTestContext ctx) + { + ModAssert.True(Codes(new Dictionary()).SequenceEqual(new[] { "E:SCHEMA_MISSING_PARAM" }), "missing required"); + ModAssert.True(Codes(new Dictionary { ["id"] = "sword", ["nope"] = "1" }).SequenceEqual(new[] { "W:SCHEMA_UNKNOWN_PARAM" }), "unknown parameter"); + ModAssert.True(Codes(new Dictionary { ["id"] = "axe" }).SequenceEqual(new[] { "E:SCHEMA_UNKNOWN_REF" }), "unknown entity"); + ModAssert.True(Codes(new Dictionary { ["id"] = "sword", ["count"] = "1.5" }).SequenceEqual(new[] { "E:SCHEMA_BAD_VALUE" }), "not a whole number"); + ModAssert.True(Codes(new Dictionary { ["id"] = "sword", ["mode"] = "medium" }).SequenceEqual(new[] { "W:SCHEMA_BAD_VALUE" }), "outside the options"); + ModAssert.True(Codes(new Dictionary { ["id"] = "sword", ["who"] = "ghost" }).SequenceEqual(new[] { "E:SCHEMA_UNKNOWN_REF" }), "an unknown character as who"); + ModAssert.True(Codes(new Dictionary { ["id"] = "sword", ["enemies"] = "wolf,bear" }).SequenceEqual(new[] { "E:SCHEMA_UNKNOWN_REF" }), "one unknown in a list"); + } + + [ModTest("checker/no_callback_skips_references")] + static void NoCallbackSkipsReferences(ModTestContext ctx) + { + var issues = SchemaChecker.CheckNamed("t", Fields, new Dictionary { ["id"] = "anything" }, null); + ModAssert.Equal(0, issues.Count, "references are not checked without a callback"); + var positional = SchemaChecker.CheckPositional("t", Fields.Take(2).ToList(), new List { "sword", "x" }, Exists); + ModAssert.Equal(1, positional.Count, "positional values are checked by index"); + } + } +} diff --git a/tests/SchemaJsonTests.cs b/tests/SchemaJsonTests.cs new file mode 100644 index 0000000..1f034b5 --- /dev/null +++ b/tests/SchemaJsonTests.cs @@ -0,0 +1,34 @@ +namespace Cthangover.Mods.Schemas.Tests +{ + using System.Text.Json.Nodes; + using Cthangover.Core.Mods.Testing; + + /// Form text and JSON nodes convert into the shapes the engine's readers expect. + public class SchemaJsonTests + { + [ModTest("json/typed_nodes")] + static void TypedNodes(ModTestContext ctx) + { + ModAssert.Equal("5", SchemaJson.ToNode(new FieldSchema { Type = "int" }, "5").ToJsonString(), "int"); + ModAssert.Equal("2.5", SchemaJson.ToNode(new FieldSchema { Type = "number" }, "2.5").ToJsonString(), "number"); + ModAssert.Equal("true", SchemaJson.ToNode(new FieldSchema { Type = "bool" }, "1").ToJsonString(), "bool"); + ModAssert.Equal("[\"a\",\"b\"]", SchemaJson.ToNode(new FieldSchema { Type = "ref_list" }, "a, b").ToJsonString(), "list of ids"); + ModAssert.Equal("str + 1", SchemaJson.ToNode(new FieldSchema { Type = "formula" }, " str + 1 ").GetValue(), "formula text, trimmed"); + ModAssert.Null(SchemaJson.ToNode(new FieldSchema { Type = "int" }, " "), "empty removes the key"); + ModAssert.Equal("7", SchemaJson.NumberOrText("7").ToJsonString(), "a map value that is a number"); + ModAssert.Equal("6 + level", SchemaJson.NumberOrText("6 + level").GetValue(), "a map value that is a formula"); + } + + [ModTest("json/texts_for_the_form")] + static void TextsForTheForm(ModTestContext ctx) + { + var node = JsonNode.Parse("{\"a\": 3, \"b\": true, \"c\": [\"x\", \"y\"], \"d\": \"t\", \"e\": {\"k\": 1}}"); + ModAssert.Equal("3", SchemaJson.ToText(node["a"]), "number"); + ModAssert.Equal("1", SchemaJson.ToText(node["b"]), "true"); + ModAssert.Equal("x,y", SchemaJson.ToText(node["c"]), "array of strings"); + ModAssert.Equal("t", SchemaJson.ToText(node["d"]), "string"); + ModAssert.Equal("{\"k\":1}", SchemaJson.ToText(node["e"]), "object as JSON"); + ModAssert.Equal("", SchemaJson.ToText(null), "absent"); + } + } +} diff --git a/tests/SchemaReferencesTests.cs b/tests/SchemaReferencesTests.cs new file mode 100644 index 0000000..51f0e37 --- /dev/null +++ b/tests/SchemaReferencesTests.cs @@ -0,0 +1,26 @@ +namespace Cthangover.Mods.Schemas.Tests +{ + using System.Linq; + using Cthangover.Core.Mods.Testing; + + /// Which entity references a value makes, by its field type. + public class SchemaReferencesTests + { + private static string Refs(FieldSchema field, string value) + => string.Join(";", SchemaReferences.Of(field, value).Select(r => r.Kind + ":" + r.Id)); + + [ModTest("references/by_type")] + static void ByType(ModTestContext ctx) + { + ModAssert.Equal("item:sword", Refs(new FieldSchema { Type = "ref", Kind = "item" }, " sword "), "ref"); + ModAssert.Equal("character:a;character:b", Refs(new FieldSchema { Type = "ref_list", Kind = "character" }, "a, b,"), "ref_list"); + ModAssert.Equal("character:hero", Refs(new FieldSchema { Type = "who" }, "hero"), "who names a character"); + ModAssert.Equal("", Refs(new FieldSchema { Type = "who" }, "party"), "party is no reference"); + ModAssert.Equal("", Refs(new FieldSchema { Type = "who" }, "Player"), "player is no reference"); + ModAssert.Equal("scene:town", Refs(new FieldSchema { Type = "scene" }, "town"), "scene"); + ModAssert.Equal("", Refs(new FieldSchema { Type = "text" }, "anything"), "text makes none"); + ModAssert.Equal("", Refs(new FieldSchema { Type = "ref" }, "x"), "a ref without a kind makes none"); + ModAssert.Equal("", Refs(new FieldSchema { Type = "ref", Kind = "item" }, "${picked}"), "a run-time value makes none"); + } + } +}