コード例 #1
0
        public void When_User_Inserts_More_Than_Enough_Coins_And_Purchases_A_Product_Success_Message_Is_Returned_And_Change_Is_Returned()
        {
            var productName = "Test";
            var testProduct = new Product()
            {
                Name = productName, Price = 5, Quantity = 1
            };
            var machineLoader = new TestMachineLoader();

            machineLoader.StorageProducts.Add(testProduct);
            machineLoader.StorageCoins.Add(1, 1);
            machineLoader.StorageCoins.Add(2, 1);
            machineLoader.StorageCoins.Add(3, 1);

            var machine = new VendingMachineService(machineLoader, null, new MockCoinValidator());

            machine.LoadMachine().Wait();

            machine.AcceptCoin(2);
            machine.AcceptCoin(2);
            machine.AcceptCoin(2);

            var result = machine.SellProduct(productName);

            result.Status.ShouldBe(eSellProductStatus.Success);
            result.Change.Sum(coin => coin.Key * coin.Value).ShouldBe(1);
        }
コード例 #2
0
        public void Test_Product_Sold_Out_Check_Display_Second_Time()
        {
            MessageService        _messageService       = new MessageService();
            VendingMachineService vendingMachineService = new VendingMachineService(_messageService);

            // Setup Vending Defaults
            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));

            // 3 Dimes
            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = 5, Radius = 21
            }));
            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = 5, Radius = 21
            }));

            // Candy
            Assert.DoesNotThrow(() => vendingMachineService.SelectProduct(2));

            Assert.DoesNotThrow(() => vendingMachineService.CheckDisplay());
            var returnedDisplay = vendingMachineService.CheckDisplay();

            Assert.AreEqual("INSERT COIN", returnedDisplay);
        }
コード例 #3
0
        public void VendingMachineServiceTests_should_Purchase_the_product(int orderNumber, int quantity, decimal price)
        {
            var cut    = new VendingMachineService();
            var actual = cut.Purchase(orderNumber, quantity, price);

            actual.Should().BeTrue();
        }
コード例 #4
0
        public void Test_Product_REeturned_Change_After_Purchase()
        {
            MessageService        _messageService       = new MessageService();
            VendingMachineService vendingMachineService = new VendingMachineService(_messageService);

            // Setup Vending Defaults
            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));

            // 3 Dimes
            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = 5, Radius = 21
            }));
            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = 5, Radius = 21
            }));
            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = 5, Radius = 21
            }));

            Assert.DoesNotThrow(() => vendingMachineService.SelectProduct(1));

            var returnedDisplay = vendingMachineService.CheckDisplay();
            var returnedChange  = vendingMachineService.ReturnCoins();

            Assert.AreEqual("THANK YOU", returnedDisplay);
        }
コード例 #5
0
        public void WithdrawVendingItem_WithdrawItemNoStocks_ReturnsInsertedCoins()
        {
            List <VendingCoin> insertedCoins = new List <VendingCoin>()
            {
                new VendingCoin()
                {
                    Value = 1, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .50M, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .50M, Quantity = 1
                },
            };

            VendingMachineService vms = new VendingMachineService(new VendingCoinInventoryService());
            var tea = VendingItemRepository.VendingItems.Where(w => w.Name == "Tea").FirstOrDefault();

            tea.Quantity = 0;

            var result = vms.WithdrawVendingItem(new VendingItem()
            {
                Name = "Tea", Price = 1.80M, Quantity = 1
            },
                                                 insertedCoins);

            tea.Quantity = 10;
            Assert.Equal(2, result.ReturnedAmount);
            Assert.Contains("No stocks available", result.Message);
        }
コード例 #6
0
        public void WithdrawVendingItem_WithdrawItemNoChange_ReturnsThankYouNoChange()
        {
            List <VendingCoin> insertedCoins = new List <VendingCoin>()
            {
                new VendingCoin()
                {
                    Value = 1, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .20M, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .50M, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .10M, Quantity = 1
                },
            };
            VendingMachineService vms = new VendingMachineService(new VendingCoinInventoryService());

            var result = vms.WithdrawVendingItem(new VendingItem()
            {
                Name = "Tea", Price = 1.80M, Quantity = 10
            },
                                                 insertedCoins);

            Assert.Equal(0, result.ReturnedAmount);
            Assert.Contains("Thank You", result.Message);
        }
コード例 #7
0
        public async Task ReturnCorrectAmount()
        {
            // setup in-memory database
            var dbContextOptions = new Microsoft.EntityFrameworkCore.DbContextOptionsBuilder <VmDbContext>().UseInMemoryDatabase("VMDB");
            var dbContext        = new VmDbContext(dbContextOptions.Options);

            // seed some data
            DataSeedingHelper.Seed(dbContext);

            var service = new VendingMachineService(dbContext);
            var product = (await service.GetProductsAsync()).First();

            var change   = new Dictionary <decimal, int>();
            var payCoins = new Dictionary <decimal, int>();

            payCoins.Add(0.1m, 5);
            payCoins.Add(1.0m, 2);

            var ok = await service.PurchaseAsync(product.Id, payCoins, change);

            Assert.True(ok);

            var changeSum = change.ToList().Sum(x => x.Key * x.Value);
            var paiedSum  = payCoins.ToList().Sum(x => x.Key * x.Value);

            Assert.Equal(changeSum, paiedSum - product.Price);
        }
コード例 #8
0
        public void VendingMachineServiceTests_should_populated_the_items()
        {
            var cut    = new VendingMachineService();
            var actual = cut.GetProductMap();

            actual.Should().NotBeNull();
            actual.Count.Should().BeGreaterThan(0);
        }
コード例 #9
0
        public void When_User_Inserts_A_Coin_Vending_Machine_Stores_It()
        {
            var machine = new VendingMachineService(null, null, new MockCoinValidator());

            machine.AcceptCoin(0.5);

            machine.CurrentInsertedAmount.ShouldBe(0.5);
        }
コード例 #10
0
        public void Test_Vending_Machine_Cash_Setup()
        {
            Mock <IMessageService> _messageService       = new Mock <IMessageService>();
            VendingMachineService  vendingMachineService = new VendingMachineService(_messageService.Object);


            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
        }
コード例 #11
0
        public void Test_Vending_Machine_Stock_Setup()
        {
            Mock <IMessageService> _messageService       = new Mock <IMessageService>();
            VendingMachineService  vendingMachineService = new VendingMachineService(_messageService.Object);


            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));
        }
コード例 #12
0
        public void When_User_Asks_To_Return_Coins_Coins_Are_Returned()
        {
            var machine = new VendingMachineService(null, null, new MockCoinValidator());

            machine.AcceptCoin(0.5);
            var returnedCoins = machine.ReturnCoins();

            machine.CurrentInsertedAmount.ShouldBe(0);
            returnedCoins.Sum(coin => coin.Key * coin.Value).ShouldBe(0.5);
        }
コード例 #13
0
        public void VendingMachineServiceTests_should_Purchase_the_product_and_quantity_should_be_decrement(int orderNumber, int quantity, decimal price, int totalQuantity)
        {
            var cut           = new VendingMachineService();
            var actual        = cut.Purchase(orderNumber, quantity, price);
            var getProductMap = cut.GetProductMap();
            var product       = getProductMap[orderNumber];

            actual.Should().BeTrue();
            product.TotalItem.Should().Be(totalQuantity - quantity);
        }
コード例 #14
0
        public void VendingMachineServiceTests_should_throw_the_PurchaseException_when_price_Invalid(int orderNumber, int quantity, decimal price)
        {
            void Action()
            {
                var cut = new VendingMachineService();

                cut.Purchase(orderNumber, quantity, price);
            }

            Assert.Throws <PurchaseException>((Action)Action);
        }
コード例 #15
0
        public void VendingMachineServiceTests_should_throw_the_PurchaseException_when_quantity_is_greater_that_total_item()
        {
            void Action()
            {
                var cut = new VendingMachineService();

                cut.Purchase(1, 200, 1);
            }

            Assert.Throws <PurchaseException>((Action)Action);
        }
コード例 #16
0
        public void VendingMachineServiceTests_should_throw_the_PurchaseException_when_purchased_quantity_not_valid()
        {
            void Action()
            {
                var cut = new VendingMachineService();

                cut.Purchase(1, 2, 1);
            }

            Assert.Throws <PurchaseException>((Action)Action);
        }
コード例 #17
0
        public VendingMachineController(
            VendingMachineContext context,
            CoinChangerService coinChangerService,
            VendingMachineService vendingMachineService
            )
        {
            _context               = context;
            _coinChangerService    = coinChangerService;
            _vendingMachineService = vendingMachineService;

            vendingMachineService.InitializeData();
        }
コード例 #18
0
        public void Test_Inserting_Nickle()
        {
            Mock <IMessageService> _messageService       = new Mock <IMessageService>();
            VendingMachineService  vendingMachineService = new VendingMachineService(_messageService.Object);

            // Setup Vending Defaults
            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));

            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = 5, Radius = 21
            }));
        }
コード例 #19
0
        public void Test_Display_When_Empty()
        {
            MessageService        _messageService       = new MessageService();
            VendingMachineService vendingMachineService = new VendingMachineService(_messageService);

            // Setup Vending Defaults
            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));

            var returnedDisplay = vendingMachineService.CheckDisplay();

            Assert.AreEqual("INSERT COIN", returnedDisplay);
        }
コード例 #20
0
        static void Main(string[] args)
        {
            IVendingMachineService vendingMachine = new VendingMachineService();

            vendingMachine.AddItems(Enums.Item.Chip, 2);
            vendingMachine.AddCoins(Enums.Coin.Cent, 0);

            Request request = new Request(Item.Chip);

            request.AddDollar();

            var retVal = vendingMachine.MakePurchase(request);
        }
コード例 #21
0
        public void Test_Product_Select_No_Money_Value_1()
        {
            MessageService        _messageService       = new MessageService();
            VendingMachineService vendingMachineService = new VendingMachineService(_messageService);

            // Setup Vending Defaults
            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));

            Assert.DoesNotThrow(() => vendingMachineService.SelectProduct(1));
            var returnedDisplay = vendingMachineService.CheckDisplay();

            Assert.AreEqual("PRICE: 1.00", returnedDisplay);
        }
コード例 #22
0
        public void WithdrawVendingItem_WithdrawItemReturnChangeFromInsertedCoins_ReturnsFewerCoinsChange()
        {
            List <VendingCoin> insertedCoins = new List <VendingCoin>()
            {
                new VendingCoin()
                {
                    Value = 1, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .20M, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .50M, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .10M, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .20M, Quantity = 1
                },
            };
            VendingCoinInventoryService vis = new VendingCoinInventoryService();
            var invSnapshot = vis.CreateInventorySnapshot();

            VendingCoinRepository.VendingCoins.ToList().Clear();
            VendingCoinRepository.VendingCoins = new List <VendingCoin>()
            {
                new VendingCoin()
                {
                    Value = .10M, Quantity = 1
                },
            };
            VendingMachineService vms = new VendingMachineService(new VendingCoinInventoryService());

            var result = vms.WithdrawVendingItem(new VendingItem()
            {
                Name = "Tea", Price = 1.80M, Quantity = 10
            },
                                                 insertedCoins);

            Assert.Equal(.20M, result.ReturnedAmount);
            Assert.Equal(.20M, result.ReturnedCoins.Where(w => w.Value == .20M).Select(s => s.Amount).FirstOrDefault());
            Assert.Contains("Thank You", result.Message);
            vis.RestoreInventorySnapshot(invSnapshot.ToList());
        }
コード例 #23
0
        public void Setup()
        {
            var dataSvc = new InMemoryDataStoreService();

            _vmSvc = new VendingMachineService(dataSvc);

            _viewModel = _vmSvc.SetViewModel();

            _inputModel = new CoffeeInputModel
            {
                Cost     = 2.00,
                Size     = Size.Medium,
                Sugars   = 2,
                Creamers = 3,
            };
        }
コード例 #24
0
        public void When_User_Inserts_More_Than_Enough_Coins_And_Purchases_A_Product_But_There_Are_Not_Enough_Coins_For_Change_An_Out_Of_Change_Message_Is_Shown()
        {
            var productName = "Test";
            var testProduct = new Product()
            {
                Name = productName, Price = 1, Quantity = 1
            };
            var machine = new VendingMachineService(null, null, new MockCoinValidator());

            machine.AddProduct(testProduct);

            machine.AcceptCoin(5);
            var result = machine.SellProduct(productName);

            result.Status.ShouldBe(eSellProductStatus.OutOfChange);
            result.Change.Any().ShouldBeFalse();
        }
コード例 #25
0
        public void When_User_Inserts_Just_Enough_Coins_And_Purchases_A_Product_Success_Is_Returned()
        {
            var productName = "Test";
            var testProduct = new Product()
            {
                Name = productName, Price = 1, Quantity = 1
            };
            var machine = new VendingMachineService(null, null, new MockCoinValidator());

            machine.AddProduct(testProduct);

            machine.AcceptCoin(1);
            var result = machine.SellProduct(productName);

            result.Status.ShouldBe(eSellProductStatus.Success);
            result.Change.Any().ShouldBeFalse();
        }
        private void OnUpdate(List <Events.TickNametagData> nametags)
        {
            if (!IsDictionaryLoaded)
            {
                return;
            }

            if (Player.IsPlayingAnim(Dictionary, "PLYR_BUY_DRINK_PT1", 1))
            {
                if (Player.GetAnimCurrentTime(Dictionary, "PLYR_BUY_DRINK_PT1") > 0.1f)
                {
                    AttachmentHandler.Add("soda");
                }

                if (Player.GetAnimCurrentTime(Dictionary, "PLYR_BUY_DRINK_PT1") > 0.98f)
                {
                    Player.TaskPlayAnim(Dictionary, "PLYR_BUY_DRINK_PT2", 4f, -1000f, -1, 1048576, 0f, false, false, false);
                    Invoker.Invoke(0x2208438012482A1A, Player.Handle, false, false); // PED::_SET_PED_FAST_ANIMATIONS
                }
            }

            if (Player.IsPlayingAnim(Dictionary, "PLYR_BUY_DRINK_PT2", 1))
            {
                if (Player.GetAnimCurrentTime(Dictionary, "PLYR_BUY_DRINK_PT2") > 0.98f)
                {
                    Player.TaskPlayAnim(Dictionary, "PLYR_BUY_DRINK_PT3", 1000f, -4f, -1, 1048624, 0f, false, false, false);
                    Invoker.Invoke(0x2208438012482A1A, Player.Handle, false, false); // PED::_SET_PED_FAST_ANIMATIONS
                }
            }

            if (Player.IsPlayingAnim(Dictionary, "PLYR_BUY_DRINK_PT3", 1))
            {
                if (Player.GetAnimCurrentTime(Dictionary, "PLYR_BUY_DRINK_PT3") > 0.306f)
                {
                    AttachmentHandler.Remove("soda");
                }

                if (Player.GetAnimCurrentTime(Dictionary, "PLYR_BUY_DRINK_PT3") > 0.9f)
                {
                    Streaming.RemoveAnimDict(Dictionary);
                    Audio.ReleaseAmbientAudioBank();
                    IsDictionaryLoaded = false;
                    VendingMachineService.SetInUse(false);
                }
            }
        }
コード例 #27
0
        public void Test_Insert_And_return_Of_Coins(int first, int second)
        {
            Mock <IMessageService> _messageService       = new Mock <IMessageService>();
            VendingMachineService  vendingMachineService = new VendingMachineService(_messageService.Object);

            // Setup Vending Defaults
            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));

            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = first, Radius = second
            }));

            var returnedStack = vendingMachineService.ReturnCoins();

            Assert.AreEqual((new Coin {
                Weight = first, Radius = second
            }), returnedStack.FirstOrDefault().Key);
        }
コード例 #28
0
        public void Test_Product_Select_Not_Enough_Money_Product_Value_Subsequent_Check()
        {
            MessageService        _messageService       = new MessageService();
            VendingMachineService vendingMachineService = new VendingMachineService(_messageService);

            // Setup Vending Defaults
            Assert.DoesNotThrow(() => vendingMachineService.SetupCashbox(initialCashBox));
            Assert.DoesNotThrow(() => vendingMachineService.SetupStock(initialStock));

            Assert.DoesNotThrow(() => vendingMachineService.AcceptCoin(new Coin {
                Weight = 5, Radius = 21
            }));
            Assert.DoesNotThrow(() => vendingMachineService.SelectProduct(1));
            Assert.DoesNotThrow(() => vendingMachineService.SelectProduct(1));

            var returnedDisplay = vendingMachineService.CheckDisplay();

            Assert.AreEqual("PRICE: 0.50", returnedDisplay);
        }
コード例 #29
0
        public void When_machine_state_is_json_saved_it_is_restored_correctly()
        {
            var machine = new VendingMachineService(new VendingMachineJsonLoader(), new VendingMachineJsonSaver(), new MockCoinValidator());

            machine.AddCoin(1);
            machine.AddProduct(new Product()
            {
                Name = "Test", Price = 5, Quantity = 1
            });
            machine.AcceptCoin(5);

            machine.SaveMachine().Wait();

            var loadedMachine = new VendingMachineService(new VendingMachineJsonLoader(), new VendingMachineJsonSaver(), new MockCoinValidator());

            loadedMachine.LoadMachine().Wait();

            machine.CurrentInsertedAmount.ShouldBe(5);
            machine.Products.First().Name.ShouldBe("Test");
            machine.CoinsAvailable.First().Key.ShouldBe(1);
        }
コード例 #30
0
        public void WithdrawVendingItem_WithdrawItemNoChange_ReturnsInsertedCoins()
        {
            List <VendingCoin> insertedCoins = new List <VendingCoin>()
            {
                new VendingCoin()
                {
                    Value = 1, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .50M, Quantity = 1
                },
                new VendingCoin()
                {
                    Value = .50M, Quantity = 1
                },
            };
            VendingCoinInventoryService vis = new VendingCoinInventoryService();
            var invSnapshot = vis.CreateInventorySnapshot();

            VendingCoinRepository.VendingCoins.Clear();
            VendingCoinRepository.VendingCoins = new List <VendingCoin>()
            {
                new VendingCoin()
                {
                    Value = .10M, Quantity = 1
                },
            };
            VendingMachineService vms = new VendingMachineService(new VendingCoinInventoryService());

            var result = vms.WithdrawVendingItem(new VendingItem()
            {
                Name = "Tea", Price = 1.80M, Quantity = 10
            },
                                                 insertedCoins);

            Assert.Equal(2, result.ReturnedAmount);
            Assert.Contains("Not enough coins", result.Message);
            vis.RestoreInventorySnapshot(invSnapshot.ToList());
        }