public void ReturnCacheTest()
        {
            VMWallet vwWallet = new VMWallet(new Dictionary<FaceValueTypes, int>{
                {FaceValueTypes.One,100},
                {FaceValueTypes.Two,100},
                {FaceValueTypes.Five,100},
                {FaceValueTypes.Ten,100}
            });

            List<Coin> AddingCoins = new List<Coin>{
            new Coin(FaceValueTypes.Ten),
            new Coin(FaceValueTypes.Ten),
            new Coin(FaceValueTypes.Two),
            new Coin(FaceValueTypes.One)
            };

            foreach(var coin in AddingCoins)
            {
                vwWallet.Add(coin);
            }

            Assert.AreEqual(23, vwWallet.MoneyCache);

            List<Coin> returned_coins = vwWallet.ReturnCache();

            Assert.AreEqual(AddingCoins.Count, returned_coins.Count);

            var e1 = AddingCoins.GetEnumerator();
            var e2 = returned_coins.GetEnumerator();

            while (e1.MoveNext() && e2.MoveNext())
            {
                Assert.AreEqual(e1.Current, e2.Current);
            }
        }
        public List <Coin> ReturnCache()
        {
            List <Coin> for_return = new List <Coin>();
            //Получаем список всех доступных монет
            Dictionary <Coin, int> avail_coins = new Dictionary <Coin, int>();

            foreach (var item in GetSorted())
            {
                avail_coins.Add(new Coin(item.Key), item.Value);
            }
            //Массив всех доступных номиналов
            int[] values = avail_coins.Where(p => p.Value > 0).OrderByDescending(p => p.Key.Info.Price).Select(p => p.Key.Info.Price).ToArray();
            int   i      = 0;

            while (_money_cache > 0 && i < values.Length)
            {
                //Сколько нам нужно монет данного номинала
                int need_coins = (int)Math.Floor((double)_money_cache / values[i]);
                //Сколько у нас их есть
                int have_coins = avail_coins.Where(p => p.Key.Info.Price == values[i]).Select(p => p.Value).First();
                //Если у нас есть такое кол-во данных монет то возвращаем его, иначе отдаем что есть
                if (need_coins > have_coins)
                {
                    need_coins = have_coins;
                }
                List <Coin> ret_coins = _GetCoins(values[i], need_coins);
                for_return.AddRange(ret_coins);
                _money_cache -= VMWallet.GetSum(ret_coins);
                i++;
            }
            return(for_return);
        }
        public ActionResult Index()
        {
            //Начальная инициализация
            vwWallet = new VMWallet(new Dictionary<FaceValueTypes, int>{
                {FaceValueTypes.One,100},
                {FaceValueTypes.Two,100},
                {FaceValueTypes.Five,100},
                {FaceValueTypes.Ten,100}
            });

            userWallet = new Wallet(new Dictionary<FaceValueTypes, int>
            {
                {FaceValueTypes.One,10},
                {FaceValueTypes.Two,30},
                {FaceValueTypes.Five,20},
                {FaceValueTypes.Ten,15}
            });

            productCatalog=new ProductCatalog(new Dictionary<ProductTypes,int>
                {
                    {ProductTypes.Tea,10},
                    {ProductTypes.Coffee,20},
                    {ProductTypes.MilkCoffee,20},
                    {ProductTypes.Juice,15}
                });

            return View();
        }