- New turn order: produce -> transfer -> move -> collision resolution - Collisions now destroy weaker pieces (status > level > mutual destruction) instead of halting the simulation. SimPhase.Collision removed. - Add piece Level property (all level 1 in proto, prepared for future) - Production fires every turn (interval concept removed), buffer = Amount (default 1, future 2-4), leftovers overwritten each turn - Transfer tiebreaker: status > level > clockwise direction (alternating even/odd turns in y-up coords), replaces distance-to-production - Demands always accept matching cargo even when already satisfied - TurnNumber added to all turn events for animation grouping - Simultaneous animations: produce flash, cargo slide, parallel piece moves - Camera centering fix + middle-click pan - GDD updated with new rules + lore section added Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
113 lines
3.5 KiB
C#
113 lines
3.5 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.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);
|
|
}
|
|
}
|