Rewrite yaml merger.

This commit is contained in:
Paul Chote
2016-01-30 03:04:34 +00:00
parent 1581ba951f
commit ab921682c4
15 changed files with 253 additions and 305 deletions

View File

@@ -97,87 +97,19 @@ namespace OpenRA.Test
}
}
[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.");
}
[TestCase(TestName = "Trait can be removed and later overridden")]
public void TraitCanBeRemovedAndLaterOverridden()
{
var baseYaml = @"
^BaseA:
MockString:
AString: ""Base""
Actor:
Inherits: ^BaseA
-MockString:
";
var overrideYaml = @"
Actor:
MockString:
AString: ""Override""
";
var actorInfo = CreateActorInfoFromYaml("Actor", null, baseYaml, overrideYaml);
Assert.IsTrue(actorInfo.HasTraitInfo<MockStringInfo>(), "Actor should have the MockStringInfo trait, but does not.");
Assert.IsTrue(actorInfo.TraitInfo<MockStringInfo>().AString == "\"Override\"",
"MockStringInfo trait has not been set with the correct override value for AString.");
}
// 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 nodes = mapYaml == null ? new List<MiniYamlNode>() : MiniYaml.FromString(mapYaml);
var sources = yamls.ToList();
if (mapYaml != null)
sources.Add(mapYaml);
var yaml = MiniYaml.Merge(sources.Select(s => MiniYaml.FromString(s)));
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);
return new ActorInfo(creator, name, unit);
}
}
}