Esempio n. 1
0
        /// <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));
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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);
        }
Esempio n. 6
0
        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;
        }
Esempio n. 7
0
        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();
        }