public void ComposeCivilizations_CallsIntoPolicyComposerForPolicyData()
        {
            var templateOne = BuildCivTemplate("Civ One", Color.black);

            var civOne = BuildCivilization(templateOne, 1, 10);

            var policyData = new SerializableSocialPolicyData();

            MockPolicyComposer.Setup(composer => composer.ComposePoliciesFromCiv(civOne)).Returns(policyData);

            var mapData = new SerializableMapData();

            var civComposer = Container.Resolve <CivilizationComposer>();

            civComposer.ComposeCivilizations(mapData);

            Assert.AreEqual(policyData, mapData.Civilizations[0].SocialPolicies);
        }
        public void DecomposeCivilizations_CallsIntoPolicyComposerCorrectly()
        {
            var policyDataOne = new SerializableSocialPolicyData();
            var policyDataTwo = new SerializableSocialPolicyData();

            var mapData = new SerializableMapData()
            {
                Civilizations = new List <SerializableCivilizationData>()
                {
                    new SerializableCivilizationData()
                    {
                        TemplateName = "Template One", SocialPolicies = policyDataOne
                    },
                    new SerializableCivilizationData()
                    {
                        TemplateName = "Template Two", SocialPolicies = policyDataTwo
                    }
                },
                CivDiscoveryPairs = new List <Tuple <string, string> >()
            };

            BuildCivTemplate("Template One", Color.white);
            BuildCivTemplate("Template Two", Color.red);

            var civComposer = Container.Resolve <CivilizationComposer>();

            civComposer.DecomposeCivilizations(mapData);

            MockPolicyComposer.Verify(
                composer => composer.DecomposePoliciesIntoCiv(
                    policyDataOne, It.Is <ICivilization>(civ => civ.Template.Name.Equals("Template One"))
                    ),
                Times.Once,
                "DecomposePoliciesIntoCiv not called as expected on anticipated civOne and policyDataOne"
                );

            MockPolicyComposer.Verify(
                composer => composer.DecomposePoliciesIntoCiv(
                    policyDataTwo, It.Is <ICivilization>(civ => civ.Template.Name.Equals("Template Two"))
                    ),
                Times.Once,
                "DecomposePoliciesIntoCiv not called as expected on anticipated civTwo and policyDataTwo"
                );
        }
        public void DecomposePoliciesIntoCiv_OverridesUnlockedPoliciesWithCorrectAvailablePolicies()
        {
            var policyOne = BuildPolicy("Policy One");

            BuildPolicy("Policy Two");
            var policyThree = BuildPolicy("Policy Three");

            var civOne = BuildCivilization("Civ One", null, null);

            var policyData = new SerializableSocialPolicyData()
            {
                UnlockedTrees    = new List <string>(),
                UnlockedPolicies = new List <string>()
                {
                    "Policy One", "Policy Three"
                }
            };

            var composer = Container.Resolve <SocialPolicyComposer>();

            MockPolicyCanon.Setup(
                canon => canon.OverrideUnlockedPoliciesForCiv(
                    It.IsAny <IEnumerable <ISocialPolicyDefinition> >(),
                    It.IsAny <ICivilization>()
                    )
                ).Callback(delegate(IEnumerable <ISocialPolicyDefinition> newUnlockedPolicies, ICivilization civ) {
                Assert.AreEqual(civOne, civ, "OverrideUnlockedPoliciesForCiv was given an unexpected civ argument");
                CollectionAssert.AreEquivalent(
                    new List <ISocialPolicyDefinition>()
                {
                    policyOne, policyThree
                }, newUnlockedPolicies,
                    "OverrideUnlockedPoliciesForCiv was given an unexpected newUnlockedPolicies argument"
                    );
                Assert.Pass();
            });

            composer.DecomposePoliciesIntoCiv(policyData, civOne);

            Assert.Fail("OverrideUnlockedPoliciesForCiv was never called");
        }