using System.Text.Json; using XafPet.Desktop.PetEngine; using Xunit; namespace XafPet.Desktop.Tests; public class PetConfigTests { private const string ValidJson = """ { "version": "1.0", "type": "animal", "species": "cockatiel", "gender": "female", "image_base_url": "./DefaultPets/xibao/", "default_image": "standing.png", "actions": { "idle": "wings_idle", "happy": "wings_spread", "custom_state_1": "user_animation_1" }, "parameters": { "move_distance": 15, "animation_speed": 1.0, "interaction_timeout": 300 } } """; [Fact] public void Parse_ValidJson_LoadsAllFields() { var config = PetConfig.Parse(ValidJson); Assert.Equal("1.0", config.Version); Assert.Equal(PetType.Animal, config.Type); Assert.Equal("cockatiel", config.Species); Assert.Equal("female", config.Gender); Assert.Equal("./DefaultPets/xibao/", config.ImageBaseUrl); Assert.Equal("standing.png", config.DefaultImage); Assert.Equal("wings_idle", config.Actions["idle"]); Assert.Equal(15, config.Parameters.MoveDistance); } [Fact] public void Parse_MissingActionsKey_UsesDefaults() { var json = """{ "version": "1.0", "type": "human", "image_base_url": "./pets/", "default_image": "a.png" }"""; var config = PetConfig.Parse(json); Assert.Equal("idle", config.Actions["idle"]); } [Fact] public void Parse_InvalidJson_ThrowsJsonException() { Assert.Throws(() => PetConfig.Parse("{ not valid json")); } [Fact] public void Parse_CustomStates_CountedCorrectly() { var config = PetConfig.Parse(ValidJson); Assert.Equal(1, config.CustomStateCount); Assert.Equal("user_animation_1", config.GetActionForState("custom_state_1")); } }