using Chessistics.Engine.Loading; using Chessistics.Engine.Model; using System.Text.Json; using Xunit; namespace Chessistics.Tests.Loading; public class LevelLoaderTests { private const string ValidJson = """ { "id": 1, "name": "Premier Convoi", "description": "Acheminez du bois de la scierie au depot.", "width": 4, "height": 4, "productions": [ { "col": 0, "row": 0, "name": "Scierie", "cargo": "wood", "interval": 2 } ], "demands": [ { "col": 3, "row": 0, "name": "Depot Royal", "cargo": "wood", "amount": 3, "deadline": 30 } ], "walls": [], "stock": [ { "kind": "rook", "count": 3 } ] } """; [Fact] public void LoadsValidJson() { var level = LevelLoader.Load(ValidJson); Assert.Equal(1, level.Id); Assert.Equal("Premier Convoi", level.Name); Assert.Equal(4, level.Width); Assert.Equal(4, level.Height); Assert.Single(level.Productions); var prod = level.Productions[0]; Assert.Equal(new Coords(0, 0), prod.Position); Assert.Equal("Scierie", prod.Name); Assert.Equal(CargoType.Wood, prod.Cargo); Assert.Single(level.Demands); var demand = level.Demands[0]; Assert.Equal(new Coords(3, 0), demand.Position); Assert.Equal("Depot Royal", demand.Name); Assert.Equal(CargoType.Wood, demand.Cargo); Assert.Equal(3, demand.Amount); Assert.Equal(30, demand.Deadline); Assert.Empty(level.Walls); Assert.Single(level.Stock); Assert.Equal(PieceKind.Rook, level.Stock[0].Kind); Assert.Equal(3, level.Stock[0].Count); } [Fact] public void InvalidJson_Throws() { Assert.Throws(() => LevelLoader.Load("not json at all")); } [Fact] public void MissingName_Throws() { var json = """ { "id": 1, "name": "", "width": 4, "height": 4, "productions": [{ "col": 0, "row": 0, "name": "S", "cargo": "wood", "interval": 2 }], "demands": [{ "col": 3, "row": 0, "name": "D", "cargo": "wood", "amount": 1, "deadline": 10 }], "stock": [{ "kind": "rook", "count": 1 }] } """; Assert.Throws(() => LevelLoader.Load(json)); } [Fact] public void MissingStock_Throws() { var json = """ { "id": 1, "name": "Test", "width": 4, "height": 4, "productions": [{ "col": 0, "row": 0, "name": "S", "cargo": "wood", "interval": 2 }], "demands": [{ "col": 3, "row": 0, "name": "D", "cargo": "wood", "amount": 1, "deadline": 10 }], "stock": [] } """; Assert.Throws(() => LevelLoader.Load(json)); } [Fact] public void LoadsLevelWithWalls() { var json = """ { "id": 3, "name": "Le Col", "width": 6, "height": 6, "productions": [{ "col": 0, "row": 0, "name": "Scierie", "cargo": "wood", "interval": 2 }], "demands": [{ "col": 5, "row": 5, "name": "Depot", "cargo": "wood", "amount": 2, "deadline": 40 }], "walls": [{ "col": 2, "row": 2 }, { "col": 2, "row": 3 }], "stock": [{ "kind": "rook", "count": 4 }, { "kind": "knight", "count": 2 }] } """; var level = LevelLoader.Load(json); Assert.Equal(2, level.Walls.Count); Assert.Contains(new Coords(2, 2), level.Walls); Assert.Contains(new Coords(2, 3), level.Walls); Assert.Equal(2, level.Stock.Count); } }