public void WarningsTest_ChecksCombiners()
        {
            var partProducers = new List <ITieredProducer>()
            {
                this.drill1, this.partFactory
            };
            var combiners = new List <ITieredCombiner>()
            {
                this.combiner
            };
            Dictionary <string, double> availableMixins = new Dictionary <string, double>()
            {
                { StubRocketPartCombiner.ExpectedInputResource, 100.0 }
            };
            Dictionary <string, double> placeForOutput = new Dictionary <string, double>()
            {
                { StubRocketPartCombiner.ExpectedOutputResource, 100.0 }
            };

            // Verify no false-positives.
            var actual = StaticAnalysis.CheckCombiners(colonizationResearch, partProducers, combiners, availableMixins, placeForOutput).ToList();

            Assert.AreEqual(0, actual.Count);

            // Verify finds missing untiered input
            actual = StaticAnalysis.CheckCombiners(colonizationResearch, partProducers, combiners, this.emptyContainers, placeForOutput).ToList();
            Assert.AreEqual(1, actual.Count);
            Assert.AreEqual("To produce Rocket Parts you will need to bring some Complex Parts.", actual[0].Message);

            // Verify finds missing tiered input
            actual = StaticAnalysis.CheckCombiners(colonizationResearch, new List <ITieredProducer>(), combiners, availableMixins, placeForOutput).ToList();
            Assert.AreEqual(1, actual.Count);
            Assert.AreEqual("To produce Rocket Parts, you need produce LocalParts as input.", actual[0].Message);

            // Verify checks storage for output
            actual = StaticAnalysis.CheckCombiners(colonizationResearch, partProducers, combiners, availableMixins, new Dictionary <string, double>()).ToList();
            Assert.AreEqual(1, actual.Count);
            Assert.AreEqual("There's no place to put the Rocket Parts this base is producing.", actual[0].Message);
        }