Add tests for trait inheritance and removals in yaml.
This commit is contained in:
committed by
Oliver Brakmann
parent
0caffa8196
commit
9e43daeec7
@@ -28,6 +28,10 @@ namespace OpenRA.Test
|
|||||||
class MockEInfo : MockTraitInfo, Requires<MockFInfo> { }
|
class MockEInfo : MockTraitInfo, Requires<MockFInfo> { }
|
||||||
class MockFInfo : MockTraitInfo, Requires<MockDInfo> { }
|
class MockFInfo : MockTraitInfo, Requires<MockDInfo> { }
|
||||||
|
|
||||||
|
class MockA2Info : MockTraitInfo { }
|
||||||
|
class MockB2Info : MockTraitInfo { }
|
||||||
|
class MockC2Info : MockTraitInfo { }
|
||||||
|
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class ActorInfoTest
|
public class ActorInfoTest
|
||||||
{
|
{
|
||||||
@@ -88,5 +92,65 @@ namespace OpenRA.Test
|
|||||||
Assert.That(count, Is.EqualTo(Math.Floor(count)), "Should be symmetrical");
|
Assert.That(count, Is.EqualTo(Math.Floor(count)), "Should be symmetrical");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[TestCase(TestName = "Trait inheritance and removal can be composed")]
|
||||||
|
public void TraitInheritanceAndRemovalCanBeComposed()
|
||||||
|
{
|
||||||
|
var baseYaml = @"
|
||||||
|
^BaseA:
|
||||||
|
MockA2:
|
||||||
|
^BaseB:
|
||||||
|
Inherits@a: ^BaseA
|
||||||
|
MockB2:
|
||||||
|
";
|
||||||
|
var extendedYaml = @"
|
||||||
|
Actor:
|
||||||
|
Inherits@b: ^BaseB
|
||||||
|
-MockA2:
|
||||||
|
";
|
||||||
|
var mapYaml = @"
|
||||||
|
^BaseC:
|
||||||
|
MockC2:
|
||||||
|
Actor:
|
||||||
|
Inherits@c: ^BaseC
|
||||||
|
";
|
||||||
|
|
||||||
|
var actorInfo = CreateActorInfoFromYaml("Actor", mapYaml, baseYaml, extendedYaml);
|
||||||
|
Assert.IsFalse(actorInfo.HasTraitInfo<MockA2Info>(), "Actor should not have the MockA2 trait, but does.");
|
||||||
|
Assert.IsTrue(actorInfo.HasTraitInfo<MockB2Info>(), "Actor should have the MockB2 trait, but does not.");
|
||||||
|
Assert.IsTrue(actorInfo.HasTraitInfo<MockC2Info>(), "Actor should have the MockC2 trait, but does not.");
|
||||||
|
}
|
||||||
|
|
||||||
|
[TestCase(TestName = "Trait can be removed after multiple inheritance")]
|
||||||
|
public void TraitCanBeRemovedAfterMultipleInheritance()
|
||||||
|
{
|
||||||
|
var baseYaml = @"
|
||||||
|
^BaseA:
|
||||||
|
MockA2:
|
||||||
|
Actor:
|
||||||
|
Inherits: ^BaseA
|
||||||
|
MockA2:
|
||||||
|
";
|
||||||
|
var overrideYaml = @"
|
||||||
|
Actor:
|
||||||
|
-MockA2
|
||||||
|
";
|
||||||
|
|
||||||
|
var actorInfo = CreateActorInfoFromYaml("Actor", null, baseYaml, overrideYaml);
|
||||||
|
Assert.IsFalse(actorInfo.HasTraitInfo<MockA2Info>(), "Actor should not have the MockA2 trait, but does.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// This needs to match the logic used in RulesetCache.LoadYamlRules
|
||||||
|
ActorInfo CreateActorInfoFromYaml(string name, string mapYaml, params string[] yamls)
|
||||||
|
{
|
||||||
|
var initialNodes = mapYaml == null ? new List<MiniYamlNode>() : MiniYaml.FromString(mapYaml);
|
||||||
|
var yaml = yamls
|
||||||
|
.Select(s => MiniYaml.FromString(s))
|
||||||
|
.Aggregate(initialNodes, MiniYaml.MergePartial);
|
||||||
|
var allUnits = yaml.ToDictionary(node => node.Key, node => node.Value);
|
||||||
|
var unit = allUnits[name];
|
||||||
|
var creator = new ObjectCreator(new[] { typeof(ActorInfoTest).Assembly });
|
||||||
|
return new ActorInfo(creator, name, unit, allUnits);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user