using MrGameEng.Genetics; using MrGameEng.Mods; using Xunit; namespace MrGameEng.Genetics.Tests; /// /// Verifies loads through the real the way the game /// loads genes.json: string-named , parent inheritance and effect maps. /// public sealed class GeneDefLoadTests : IDisposable { private readonly string _root = Directory.CreateTempSubdirectory("mrge-gene-tests-").FullName; public void Dispose() => Directory.Delete(_root, recursive: true); private DefDatabase Load(string defsJson) { var modDir = Path.Combine(_root, "mod"); Directory.CreateDirectory(Path.Combine(modDir, "Defs")); File.WriteAllText(Path.Combine(modDir, "Defs", "genes.json"), defsJson); var database = new DefDatabase(); database.RegisterType("Gene"); database.Load([new Mod(new ModInfo { Id = "mod" }, modDir)]); return database; } [Fact] public void Load_NumericGeneWithParentAndEffects_Resolves() { var database = Load( """ { "type": "Gene", "defs": [ { "defName": "BaseGene", "abstract": true, "spread": 0.1, "mutationChance": 0.05 }, { "defName": "GeneVigor", "parent": "BaseGene", "default": 1.0, "min": 0.1, "max": 3.0, "tags": ["growth"], "effects": { "vigor": "value" } } ]} """ ); var gene = database.Get("GeneVigor"); Assert.Equal(GeneKind.Numeric, gene.Kind); Assert.Equal(0.1f, gene.Spread); // inherited from parent Assert.Equal(0.05f, gene.MutationChance); // inherited Assert.Equal(3.0f, gene.Max); Assert.Equal(["growth"], gene.Tags); Assert.Equal("value", gene.Effects["vigor"]); Assert.Single(gene.CompiledEffects); // formula compiles } [Fact] public void Load_DiscreteKindByName_Parses() { var database = Load( """ { "type": "Gene", "defs": [ { "defName": "GeneMorph", "kind": "Discrete", "variants": 2, "variantWeights": [0.8, 0.2], "effects": { "variant": "value" } } ]} """ ); var gene = database.Get("GeneMorph"); Assert.Equal(GeneKind.Discrete, gene.Kind); Assert.Equal(2, gene.Variants); Assert.Equal([0.8f, 0.2f], gene.VariantWeights); } }