Chessistics/chessistics-tests/Loading/LevelLoaderTests.cs
Samuel Bouchet e6eaae43ab Initial commit: Chessistics prototype v0.3
Black box sim engine (commands in, events out) with 3 piece types
(Rook, Bishop, Knight), cargo transfer system with social status
priority, collision detection, and victory/defeat conditions.

57 tests covering rules, simulation, loading, and solvability.
Godot 4 presentation layer scaffolding.
2026-04-10 14:58:03 +02:00

115 lines
3.6 KiB
C#

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.Equal(2, prod.Interval);
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<JsonException>(() => 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<JsonException>(() => 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<JsonException>(() => 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);
}
}