public void TestBatteriesGetFilled()
        {
            var tvr = new TestVesselResources();

            tvr.vesselModified = true;

            var resources = new Dictionary <ResourceName, double>();

            var _rm = new KerbalInterstellarTechnologies.ResourceManagement.ResourceManager(tvr, RealCheatOptions.Instance);

            _rm.UseThisToHelpWithTesting = true;
            var rm = _rm as IResourceScheduler;

            bool   fixedUpdateCalledBeforeProvide = false;
            double canProvide = 0;

            var tims = new TestIKITModSuppliable();

            tims.provideRequestCallback = (IResourceManager resman, ResourceName resource, double amount) =>
            {
                Assert.IsTrue(fixedUpdateCalledBeforeProvide, "fixed update must be called before providing resources");

                var toSend = Math.Min(amount, canProvide);
                canProvide -= toSend;

                if (toSend > 0)
                {
                    resman.ProduceResource(resource, toSend);
                }

                return(canProvide > 0);
            };

            tims.resourcesProvidedCallback = () => new ResourceName[] { ResourceName.ElectricCharge };

            tims.testName = "ElectricCharge Callback";
            tims.priority = ResourcePriorityValue.Fifth;
            tims.callBack = (IResourceManager resman) =>
            {
                fixedUpdateCalledBeforeProvide = true;
                canProvide = 5;
            };

            tvr.moduleList.Add(tims);

            tvr.variableSupplierModules[ResourceName.ElectricCharge] = new List <IKITVariableSupplier>();
            tvr.variableSupplierModules[ResourceName.ElectricCharge].Add(tims);

            var empty = new Dictionary <ResourceName, double>();

            empty.Add(ResourceName.ElectricCharge, 0);
            var maximums = new Dictionary <ResourceName, double>();

            maximums.Add(ResourceName.ElectricCharge, 20);
            rm.ExecuteKITModules(1, ref empty, ref maximums);

            Assert.IsTrue(empty[ResourceName.ElectricCharge] == 5, $"did not fill battery - it is {empty[ResourceName.ElectricCharge]}");
        }
        public void TestVariableResourceSuppliable()
        {
            var tvr = new TestVesselResources();

            tvr.vesselModified = true;

            var resources = new Dictionary <ResourceName, double>();

            var _rm = new KerbalInterstellarTechnologies.ResourceManagement.ResourceManager(tvr, RealCheatOptions.Instance);

            _rm.UseThisToHelpWithTesting = true;
            var rm = _rm as IResourceScheduler;

            bool   requestCallbackRan             = false;
            bool   fixedUpdateCalledBeforeProvide = false;
            double canProvide = 0;

            var tims = new TestIKITModSuppliable();

            tims.provideRequestCallback = (IResourceManager resman, ResourceName resource, double amount) =>
            {
                requestCallbackRan = true;
                Assert.IsTrue(fixedUpdateCalledBeforeProvide, "fixed update must be called before providing resources");

                var toSend = Math.Min(amount, canProvide);
                canProvide -= toSend;

                if (toSend > 0)
                {
                    resman.ProduceResource(resource, toSend);
                }

                return(canProvide > 0);
            };

            tims.resourcesProvidedCallback = () => new ResourceName[] { ResourceName.ElectricCharge };

            tims.testName = "ElectricCharge Callback";
            tims.priority = ResourcePriorityValue.Fifth;
            tims.callBack = (IResourceManager resman) =>
            {
                fixedUpdateCalledBeforeProvide = true;
                canProvide = 5;
            };

            var consumer = new TestIKITMod();

            consumer.callBack = (IResourceManager resMan) =>
            {
                Assert.IsTrue(1 == resMan.ConsumeResource(ResourceName.ElectricCharge, 1), "failed to consume electric charge");
                Assert.IsTrue(1 == resMan.ConsumeResource(ResourceName.ElectricCharge, 1), "failed to consume electric charge");
                Assert.IsTrue(1 == resMan.ConsumeResource(ResourceName.ElectricCharge, 1), "failed to consume electric charge");
                Assert.IsTrue(1 == resMan.ConsumeResource(ResourceName.ElectricCharge, 1), "failed to consume electric charge");
                Assert.IsTrue(1 == resMan.ConsumeResource(ResourceName.ElectricCharge, 1), "failed to consume electric charge");

                var result = resMan.ConsumeResource(ResourceName.ElectricCharge, 2);
                Assert.IsTrue(0 == result, $"failed to NOT consume electric charge. got {result} EC");
            };

            tvr.moduleList.Add(consumer);
            tvr.moduleList.Add(tims);

            tvr.variableSupplierModules[ResourceName.ElectricCharge] = new List <IKITVariableSupplier>();
            tvr.variableSupplierModules[ResourceName.ElectricCharge].Add(tims);

            var empty = new Dictionary <ResourceName, double>();

            rm.ExecuteKITModules(1, ref empty, ref empty);

            var noEC = new Dictionary <ResourceName, double>();

            noEC[ResourceName.ElectricCharge] = 0;

            Assert.IsFalse(tims.provideRequestCallback(rm as IResourceManager, ResourceName.ElectricCharge, 20));

            Assert.IsTrue(requestCallbackRan, "callback code has NOT been ran");
            Assert.AreEqual(empty[ResourceName.ElectricCharge], noEC[ResourceName.ElectricCharge], $"resources are expected to be empty .. {empty} vs {noEC}");
        }