Add unit model and unit tests
This commit is contained in:
parent
b284f1acc6
commit
031d1b60bd
|
@ -0,0 +1,17 @@
|
||||||
|
namespace MultiversalDiplomacy.Model;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// One of the rival nations vying for control of the map.
|
||||||
|
/// </summary>
|
||||||
|
public class Power
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The power's name.
|
||||||
|
/// </summary>
|
||||||
|
public string Name { get; }
|
||||||
|
|
||||||
|
public Power(string name)
|
||||||
|
{
|
||||||
|
this.Name = name;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,54 @@
|
||||||
|
namespace MultiversalDiplomacy.Model;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Represents a unit at a particular point in time.
|
||||||
|
/// </summary>
|
||||||
|
public class Unit
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// The previous iteration of a unit. This is null if the unit was just built.
|
||||||
|
/// </summary>
|
||||||
|
public Unit? Past { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The location on the map where the unit is.
|
||||||
|
/// </summary>
|
||||||
|
public Location Location { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The season in time when the unit is.
|
||||||
|
/// </summary>
|
||||||
|
public Season Season { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The allegiance of the unit.
|
||||||
|
/// </summary>
|
||||||
|
public Power Power { get; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The type of unit.
|
||||||
|
/// </summary>
|
||||||
|
public UnitType Type { get; }
|
||||||
|
|
||||||
|
private Unit(Unit? past, Location location, Season season, Power power, UnitType type)
|
||||||
|
{
|
||||||
|
this.Past = past;
|
||||||
|
this.Location = location;
|
||||||
|
this.Season = season;
|
||||||
|
this.Power = power;
|
||||||
|
this.Type = type;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Create a new unit. No validation is performed; the adjudicator should only call this
|
||||||
|
/// method after accepting a build order.
|
||||||
|
/// </summary>
|
||||||
|
public static Unit Build(Location location, Season season, Power power, UnitType type)
|
||||||
|
=> new Unit(past: null, location, season, power, type);
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Advance this unit's timeline to a new location and season.
|
||||||
|
/// </summary>
|
||||||
|
public Unit Next(Location location, Season season)
|
||||||
|
=> new Unit(past: this, location, season, this.Power, this.Type);
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
namespace MultiversalDiplomacy.Model;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// The type of a unit.
|
||||||
|
/// </summary>
|
||||||
|
public enum UnitType
|
||||||
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// A unit that moves on land.
|
||||||
|
/// </summary>
|
||||||
|
Army = 0,
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// A unit that moves in oceans and along coasts and can convoy armies.
|
||||||
|
/// </summary>
|
||||||
|
Fleet = 1,
|
||||||
|
}
|
|
@ -0,0 +1,32 @@
|
||||||
|
using MultiversalDiplomacy.Map;
|
||||||
|
using MultiversalDiplomacy.Model;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacyTests;
|
||||||
|
|
||||||
|
public class TestMap : Map
|
||||||
|
{
|
||||||
|
public override IEnumerable<Province> Provinces { get; }
|
||||||
|
|
||||||
|
public static TestMap Instance { get; } = new TestMap();
|
||||||
|
|
||||||
|
private TestMap()
|
||||||
|
{
|
||||||
|
Provinces = new List<Province>()
|
||||||
|
{
|
||||||
|
Province.Supply("Left", "LEF")
|
||||||
|
.AddLandLocation(),
|
||||||
|
Province.Supply("Right", "RIG")
|
||||||
|
.AddLandLocation(),
|
||||||
|
Province.Empty("Center", "CEN")
|
||||||
|
.AddLandLocation(),
|
||||||
|
};
|
||||||
|
Land("LEF").AddBorder(Land("RIG"));
|
||||||
|
Land("LEF").AddBorder(Land("CEN"));
|
||||||
|
|
||||||
|
Land("RIG").AddBorder(Land("LEF"));
|
||||||
|
Land("RIG").AddBorder(Land("CEN"));
|
||||||
|
|
||||||
|
Land("CEN").AddBorder(Land("LEF"));
|
||||||
|
Land("CEN").AddBorder(Land("RIG"));
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
using MultiversalDiplomacy.Map;
|
||||||
|
using MultiversalDiplomacy.Model;
|
||||||
|
|
||||||
|
using NUnit.Framework;
|
||||||
|
|
||||||
|
namespace MultiversalDiplomacyTests;
|
||||||
|
|
||||||
|
public class UnitTests
|
||||||
|
{
|
||||||
|
[Test]
|
||||||
|
public void MovementTest()
|
||||||
|
{
|
||||||
|
Map map = TestMap.Instance;
|
||||||
|
Location left = map.Land("LEF"), right = map.Land("RIG"), center = map.Land("CEN");
|
||||||
|
Power pw1 = new Power("First");
|
||||||
|
Season s1 = Season.MakeRoot();
|
||||||
|
Unit u1 = Unit.Build(left, s1, pw1, UnitType.Army);
|
||||||
|
|
||||||
|
Season s2 = s1.MakeNext();
|
||||||
|
Unit u2 = u1.Next(right, s2);
|
||||||
|
|
||||||
|
Season s3 = s2.MakeNext();
|
||||||
|
Unit u3 = u2.Next(center, s3);
|
||||||
|
|
||||||
|
Assert.That(u3.Past, Is.EqualTo(u2), "Missing unit past");
|
||||||
|
Assert.That(u2.Past, Is.EqualTo(u1), "Missing unit past");
|
||||||
|
Assert.That(u1.Past, Is.Null, "Unexpected unit past");
|
||||||
|
|
||||||
|
Assert.That(u1.Season, Is.EqualTo(s1), "Unexpected unit season");
|
||||||
|
Assert.That(u2.Season, Is.EqualTo(s2), "Unexpected unit season");
|
||||||
|
Assert.That(u3.Season, Is.EqualTo(s3), "Unexpected unit season");
|
||||||
|
|
||||||
|
Assert.That(u1.Location, Is.EqualTo(left), "Unexpected unit location");
|
||||||
|
Assert.That(u2.Location, Is.EqualTo(right), "Unexpected unit location");
|
||||||
|
Assert.That(u3.Location, Is.EqualTo(center), "Unexpected unit location");
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue