/// <summary> /// Run through all purchasing that takes place. /// </summary> public void BuyPhase() { // go through each pop in order of priority foreach (var buyer in Populous.PopsByPriority) { // go through their list of needs foreach (var needPair in buyer.TotalNeeds) { // Check that there is stuff that the pop // can trade for goods if (buyer.ForSale.All(x => x.Item2 <= 0)) { break; // if they don't they stop } // get the product and amount var need = needPair.Item1; var desired = needPair.Item2; // the units desired try { // Check if the product is available to buy if (ProductSupply.GetProductValue(need) <= 0) { // if nothing is available, add it to the shortfall. Shortfall.AddProducts(need, desired); continue; // and go to the next need } } catch (KeyNotFoundException) // If it doesn't exist in the supply at all. { // Add it in at 0 ProductSupply.IncludeProduct(need); // Subtract the missing product from shortfall. Shortfall.AddProducts(need, desired); continue; // and skip it here. } // Go to the market and buy what we can. var reciept = BuyGoodsFromMarket(buyer, need, desired); // process our reciept, getting how satisfied our need was. var satisfaction = reciept.GetProductValue(need); // Add satisfaction to our purchased good recorder _purchasedGoods.AddProducts(need, satisfaction); // Remove bought good from supply ProductSupply.SubtractProducts(need, satisfaction); // get the number of goods that couldn't be bought. var shortfall = desired - satisfaction; // add that to shortfall Shortfall.AddProducts(need, shortfall); } } // with all buying done, get surplus supply available by removing bought goods. _surplus.AddProducts(PurchasedGoods.Multiply(-1)); }
public void ReturnPartialSuccessWhenStorageIsNotSatisfactory() { // Setup storage MaintStorage = new ProductAmountCollection(); MaintStorage.AddProducts(MaintenaceProductMock1.Object, 1); MaintStorage.AddProducts(MaintenaceProductMock2.Object, 1); // satisfaction Satisfaction var sat = 0.0; // Get Result var result = sut.RunMaintenance(2, MaintStorage, out sat); // Assert Satisfaction is correct. Assert.That(sat, Is.EqualTo(0.5)); // Assert that Result is correct. AssertCollectionContains(result, MaintenaceProductMock1, 1); AssertCollectionContains(result, MaintenaceProductMock2, 1); }
public void ReturnNecissaryMaintenanceCostsAndMaintenanceMetFromRunMaintenanceWhenOverstocked() { // Setup storage MaintStorage = new ProductAmountCollection(); MaintStorage.AddProducts(MaintenaceProductMock1.Object, 5); MaintStorage.AddProducts(MaintenaceProductMock2.Object, 5); // satisfaction Satisfaction var sat = 0.0; // Get Result var result = sut.RunMaintenance(1, MaintStorage, out sat); // Assert Satisfaction is correct. Assert.That(sat, Is.EqualTo(1)); // Assert that Result is correct. AssertCollectionContains(result, MaintenaceProductMock1, 1); AssertCollectionContains(result, MaintenaceProductMock2, 1); }
public void ReturnTrueWhenProcessTakesOutputFromJob() { // Add product to both sut and other. jobOutputs.AddProducts(ProductMock1.Object, 1); sut._inputs.AddProducts(ProductMock1.Object, 1); // check they overlap. var result = sut.TakesOutputFrom(jobMock.Object); // Assert it's true. Assert.That(result, Is.True); }
public void ReturnTrueWhenProcessContainsInputsForJob() { // Add product to both sut and other. jobInputs.AddProducts(ProductMock1.Object, 1); sut._outputs.AddProducts(ProductMock1.Object, 1); // check they overlap. var result = sut.CreatesInputFor(jobMock.Object); // Assert it's true. Assert.That(result, Is.True); }
public void Setup() { randMock = new Mock <IRandomizer>(); randMock.Setup(x => x.NextDouble()) .Returns(0.5); FailProductMock1 = new Mock <IProduct>(); FailProductMock1.Setup(x => x.Id) .Returns(Guid.NewGuid()); FailProductMock2 = new Mock <IProduct>(); FailProductMock2.Setup(x => x.Id) .Returns(Guid.NewGuid()); FailsInto = new ProductAmountCollection(); FailsInto.AddProducts(FailProductMock1.Object, 1); FailsInto.AddProducts(FailProductMock2.Object, 1); MaintenaceProductMock1 = new Mock <IProduct>(); MaintenaceProductMock1.Setup(x => x.Id) .Returns(Guid.NewGuid()); MaintenaceProductMock2 = new Mock <IProduct>(); MaintenaceProductMock2.Setup(x => x.Id) .Returns(Guid.NewGuid()); Maintenance = new ProductAmountCollection(); Maintenance.AddProducts(MaintenaceProductMock1.Object, 1); Maintenance.AddProducts(MaintenaceProductMock2.Object, 1); sut = new Product(randMock.Object); sut.Id = TestId; sut.Name = TestName; sut.VariantName = TestVarName; sut.UnitName = TestUnit; sut.DefaultPrice = TestPrice; sut.Quality = TestQuality; sut.MTTF = 100; sut.ProductType = TestType; sut.Fractional = TestFractional; sut.FailsInto = FailsInto; sut.Maintenance = Maintenance; sut.Maintainable = true; }
public void Setup() { #region Needs LifeNeed = new Mock <IProduct>(); LifeNeed.Setup(x => x.Id).Returns(LifeNeedId); LifeNeed.Setup(x => x.Name).Returns("LifeNeed"); DailyNeed = new Mock <IProduct>(); DailyNeed.Setup(x => x.Id).Returns(DailyNeedId); DailyNeed.Setup(x => x.Name).Returns("DailyNeed"); LuxNeed = new Mock <IProduct>(); LuxNeed.Setup(x => x.Id).Returns(LuxNeedId); LuxNeed.Setup(x => x.Name).Returns("LuxNeed"); LifeNeedsMock = new ProductAmountCollection(); LifeNeedsMock.AddProducts(LifeNeed.Object, 1); DailyNeedsMock = new ProductAmountCollection(); DailyNeedsMock.AddProducts(DailyNeed.Object, 1); LuxuryNeedsMock = new ProductAmountCollection(); LuxuryNeedsMock.AddProducts(LuxNeed.Object, 1); #endregion Needs #region JobGoods JobInput = new Mock <IProduct>(); JobInput.Setup(x => x.Id).Returns(JobInputId); JobInput.Setup(x => x.Name).Returns("JobInput"); JobOutput = new Mock <IProduct>(); JobOutput.Setup(x => x.Id).Returns(JobOutputId); JobOutput.Setup(x => x.Name).Returns("JobOutput"); JobCapital = new Mock <IProduct>(); JobCapital.Setup(x => x.Id).Returns(JobCapitalId); JobCapital.Setup(x => x.Name).Returns("JobCapital"); ProducedGood = new Mock <IProduct>(); ProducedGood.Setup(x => x.Id).Returns(ProducedGoodId); JobInputs = new ProductAmountCollection(); JobInputs.AddProducts(JobInput.Object, 1); JobOutputs = new ProductAmountCollection(); JobOutputs.AddProducts(JobOutput.Object, 1); JobCapitals = new ProductAmountCollection(); JobCapitals.AddProducts(JobCapital.Object, 1); ProducedGoods = new ProductAmountCollection(); ProducedGoods.AddProducts(ProducedGood.Object, 1); #endregion JobGoods #region JobSetup JobMock = new Mock <IJob>(); JobMock.Setup(x => x.Inputs) .Returns(JobInputs); JobMock.Setup(x => x.Outputs) .Returns(JobOutputs); JobMock.Setup(x => x.Capital) .Returns(JobCapitals); JobMock.Setup(x => x.LaborRequirements) .Returns(1); JobMock.Setup(x => x.Inputs) .Returns(JobInputs); JobMock.Setup(x => x.Capital) .Returns(JobCapitals); #endregion JobSetup LaborMock = new Mock <IProduct>(); LaborMock.Setup(x => x.Id).Returns(LaborId); currencyValues = new ProductAmountCollection(); CurrencyMock1 = new Mock <IProduct>(); CurrencyMock1.Setup(x => x.Id).Returns(Currency1Id); CurrencyMock1.Setup(x => x.Name).Returns("Currency1"); CurrencyMock2 = new Mock <IProduct>(); CurrencyMock2.Setup(x => x.Id).Returns(Currency2Id); CurrencyMock2.Setup(x => x.Name).Returns("Currency2"); MarketMock = new Mock <IMarket>(); MarketMock.Setup(x => x.GetPrice(LifeNeed.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(DailyNeed.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(LuxNeed.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(JobInput.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(JobOutput.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(JobCapital.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(ProducedGood.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(CurrencyMock1.Object)) .Returns(100); MarketMock.Setup(x => x.GetPrice(CurrencyMock2.Object)) .Returns(100); MarketMock.Setup(x => x.AcceptedCurrencies) .Returns(new List <IProduct> { CurrencyMock1.Object, CurrencyMock2.Object }); sut = new PopulationGroup { Id = TestId, Name = TestName, Count = PopCount, JobLabor = LaborMock.Object, DailyNeeds = DailyNeedsMock, LifeNeeds = LifeNeedsMock, LuxuryNeeds = LuxuryNeedsMock, PrimaryJob = JobMock.Object, Priority = Priority1, Storage = new ProductAmountCollection(), ForSale = new ProductAmountCollection(), SecondaryJobs = new List <IJob>(), SkillLevel = SkillLevel, SkillName = SkillName, }; sut.InitializeStorage(); }