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

            tvr.vesselModified = true;

            bool allGood = false;

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

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

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

            rm.ExecuteKITModules(1, ref resources, ref maxims);

            // This code should never get called, as there was no processing performed
            Assert.IsFalse(tvr.OnKITProcessingFinishedCalled, "called OnKITProcessingFinishedCalled when unexpected");

            var consumer = new TestIKITMod();

            consumer.callBack = (IResourceManager resMan) =>
            {
                allGood = true;
            };

            tvr.moduleList.Add(consumer);

            rm.ExecuteKITModules(1, ref resources, ref maxims);

            Assert.IsTrue(allGood, "failed to execute IKITMod");
            Assert.IsTrue(tvr.OnKITProcessingFinishedCalled, "did not call OnKITProcessingFinishedCalled");
        }
        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 TestVesselModificationandRTG()
        {
            var tvr = new TestVesselResources();

            tvr.vesselModified = true;

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

            maximums.Add(ResourceName.ElectricCharge, 5);

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

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

            rm.ExecuteKITModules(1, ref resources, ref maximums);

            Assert.IsTrue(true == tvr.vesselModifiedCalled, "Did not perform IVesselResources.VesselModified() callback");

            var producer = new TestIKITMod();

            producer.callBack = (IResourceManager resMan) =>
            {
                resMan.ProduceResource(ResourceName.ElectricCharge, 0.75);
            };

            tvr.moduleList.Add(producer);

            rm.ExecuteKITModules(1, ref resources, ref maximums);

            Assert.IsTrue(resources.ContainsKey(ResourceName.ElectricCharge), "did not generate ElectricCharge");
            Assert.IsTrue(resources[ResourceName.ElectricCharge] == 0.75, "did not generate expected amount of ElectricCharge");

            resources.Clear();

            tvr.vesselModified = tvr.vesselModifiedCalled = false;

            rm.ExecuteKITModules(0.2, ref resources, ref maximums);
            Assert.IsTrue(resources.ContainsKey(ResourceName.ElectricCharge), "did not generate ElectricCharge");
            Assert.IsTrue(resources[ResourceName.ElectricCharge] == 0.75 * 0.2, "did not generate expected amount of ElectricCharge");
        }
        public void TestFixedDeltaTime()
        {
            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;

            var consumer = new TestIKITMod();

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

            tvr.moduleList.Add(consumer);

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

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

            maximums.Add(ResourceName.ElectricCharge, 20);

            rm.ExecuteKITModules(1, ref empty, ref maximums);
            Assert.IsTrue(empty[ResourceName.ElectricCharge] == 19, $"1 seconds should result in 19 EC left");
            rm.ExecuteKITModules(2, ref empty, ref maximums);
            Assert.IsTrue(empty[ResourceName.ElectricCharge] == 17, $"2 seconds should result in 17 EC left. Instead got {empty[ResourceName.ElectricCharge]}");
            rm.ExecuteKITModules(0.2, ref empty, ref maximums);
            Assert.IsTrue(empty[ResourceName.ElectricCharge] == 16.8, $".2 seconds should result in 16.8 EC left. Instead got {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}");
        }