public void WarningsTest_CheckTieredProduction_MixedTiers()
        {
            colonizationResearch.SetMaxTier(StubColonizationResearchScenario.farmingResearchCategory, "munmuss", TechTier.Tier2);

            // Validate it catches that it's consistent, but undertiered
            farm1.Tier = TechTier.Tier2;
            farm2.Tier = TechTier.Tier2;
            var actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, this.producers, this.emptyContainers, this.emptyContainers).ToList();

            Assert.AreEqual(2, actual.Count);
            Assert.AreEqual("Not all the products in the production chain for Snacks have advanced to Tier2.", actual[0].Message);
            Assert.IsTrue(actual[0].IsClearlyBroken);
            Assert.IsNotNull(actual[0].FixIt);
            Assert.AreEqual("There are Tier2 producers of Snacks, but it requires equal-tier Fertilizer production in order to work.", actual[1].Message);
            actual[0].FixIt();
            Assert.AreEqual(TechTier.Tier1, farm1.Tier);
            Assert.AreEqual(TechTier.Tier1, farm2.Tier);

            colonizationResearch.SetMaxTier(StubColonizationResearchScenario.productionResearchCategory, "munmuss", TechTier.Tier2);
            fertFactory1.Tier = TechTier.Tier2;
            drill1.Tier       = TechTier.Tier2;
            fertFactory1.Tier = TechTier.Tier2;
            farm1.Tier        = TechTier.Tier2;
            farm2.Tier        = TechTier.Tier2;
            actual            = StaticAnalysis.CheckTieredProduction(colonizationResearch, this.producers, this.emptyContainers, this.emptyContainers).ToList();
            Assert.AreEqual(1, actual.Count);
            Assert.AreEqual(actual[0].Message, $"Scanning technology at munmuss has not kept up with production technologies - Tier2 parts will not function until you deploy an equal-tier scanner to orbit around munmuss.");
            Assert.IsTrue(actual[0].IsClearlyBroken);
            Assert.IsNotNull(actual[0].FixIt);
            actual[0].FixIt();
            Assert.AreEqual(drill1.Tier, TechTier.Tier1);
            Assert.AreEqual(fertFactory1.Tier, TechTier.Tier1);
            Assert.AreEqual(farm1.Tier, TechTier.Tier1);
            Assert.AreEqual(farm2.Tier, TechTier.Tier1);
        }
        public void WarningsTest_CheckTieredProduction_Hydroponics()
        {
            List <ITieredProducer> hydroProducers = new List <ITieredProducer>()
            {
                this.hydro1, this.hydro2
            };

            // Verify no false-positives.
            var actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, hydroProducers, this.basicHydroponicSupplies, this.emptyContainers).ToList();

            Assert.AreEqual(0, actual.Count);

            hydroProducers[0].Tier = TechTier.Tier0;
            hydroProducers[1].Tier = TechTier.Tier2;
            actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, hydroProducers, this.basicHydroponicSupplies, this.emptyContainers).ToList();
            Assert.AreEqual(2, actual.Count);
            Assert.AreEqual($"This base is not taking advantage of the latest tech for producing HydroponicSnacks", actual[0].Message);
            Assert.IsNotNull(actual[0].FixIt);
            actual[0].FixIt();
            Assert.AreEqual(TechTier.Tier2, hydroProducers[0].Tier);
            Assert.AreEqual(TechTier.Tier2, hydroProducers[0].Tier);

            Assert.AreEqual($"Not all of the parts producing {StubColonizationResearchScenario.HydroponicSnacks.BaseName} are set at {TechTier.Tier2.DisplayName()}", actual[1].Message);
            Assert.IsNotNull(actual[1].FixIt);
        }
        public void WarningsTest_CheckTieredProduction_LandedMixedupFarms()
        {
            // Validate it catches that it's consistent, but undertiered
            farm1.Tier = TechTier.Tier0;
            var actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, this.producers, this.emptyContainers, this.emptyContainers).ToList();

            Assert.AreEqual(2, actual.Count);
            Assert.AreEqual(actual[0].Message, $"This base is not taking advantage of the latest tech for producing Snacks");
            Assert.AreEqual(actual[1].Message, $"Not all of the parts producing {farm1.Output.BaseName} are set at {farm2.Tier}");
            Assert.IsNotNull(actual[1].FixIt);
            actual[1].FixIt();
            Assert.AreEqual(TechTier.Tier1, farm1.Tier);
            actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, this.producers, this.emptyContainers, this.emptyContainers).ToList();
            Assert.AreEqual(0, actual.Count);
        }
        public void UnderstandsMaxTier()
        {
            colonizationResearch.SetMaxTier(StubColonizationResearchScenario.farmingResearchCategory, "munmuss", TechTier.Tier3);
            colonizationResearch.SetMaxTier(StubColonizationResearchScenario.productionResearchCategory, "munmuss", TechTier.Tier3);
            colonizationResearch.SetMaxTier(StubColonizationResearchScenario.scanningResearchCategory, "munmuss", TechTier.Tier3);
            colonizationResearch.SetMaxTier(StubColonizationResearchScenario.shiniesResearchCategory, "munmuss", TechTier.Tier2);

            var producers = new List <ITieredProducer>()
            {
                new StubProducer(StubColonizationResearchScenario.Fertilizer, StubColonizationResearchScenario.Stuff, 6, TechTier.Tier3),
                new StubProducer(StubColonizationResearchScenario.Stuff, null, 6, TechTier.Tier3),
                new StubProducer(StubColonizationResearchScenario.Shinies, null, 6, TechTier.Tier2)
            };

            var actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, producers, this.emptyContainers, this.emptyContainers).ToList();

            Assert.AreEqual(0, actual.Count);
        }
        public void WarningsTest_CheckTieredProduction_LandedUndertiered()
        {
            // Verify no false-positives.
            var actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, this.producers, this.emptyContainers, this.emptyContainers).ToList();

            Assert.AreEqual(0, actual.Count);

            // Validate it catches that it's consistent, but undertiered
            foreach (var p in this.producers)
            {
                p.Tier = TechTier.Tier0;
            }
            actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, this.producers, this.emptyContainers, this.emptyContainers).ToList();
            Assert.AreEqual(1, actual.Count);
            Assert.AreEqual("This base is not taking advantage of the latest tech for producing Stuff", actual[0].Message);
            Assert.IsNotNull(actual[0].FixIt);
            actual[0].FixIt();
            actual = StaticAnalysis.CheckTieredProduction(colonizationResearch, this.producers, this.emptyContainers, this.emptyContainers).ToList();
            Assert.AreEqual(0, actual.Count);
        }