public void ThrowsExceptionWhenPassingLessOrEqualToZeroCapacityParameterToConstructor(int capacity)
 {
     Assert.Throws(typeof(ArgumentException), delegate()
     {
         SmartWarehouse<int> warehouse = new SmartWarehouse<int>(capacity);
     });
 }
 public void AddProducer_ThrowsExceptionWhenPassingNullReference()
 {
     SmartWarehouse<FormattedText> warehouse = new SmartWarehouse<FormattedText>(20);
     PasswordDistributor distributor = new PasswordDistributor(warehouse);
     Assert.Throws(typeof(NullReferenceException), delegate()
     {
         distributor.AddProducer(null);
     });
 }
 public void StopProduction_SuccessfullyStopsProduction()
 {
     SmartWarehouse<FormattedText> warehouse = new SmartWarehouse<FormattedText>(20);
     PasswordProducer pp = new PasswordProducer(new FormattedText("abc"));
     Assert.DoesNotThrow(delegate()
     {
         pp.StartProduction(warehouse);
         pp.StopProduction();
     });
 }
 public void StartConsumption_ThrowsExceptionWhenConsumptionAlreadyStarted()
 {
     SmartWarehouse<FormattedText> warehoue = new SmartWarehouse<FormattedText>(20);
     PasswordConsumer consumer = new PasswordConsumer(new FormattedText("abc"));
     consumer.StartConsumption(warehoue);
     Assert.Throws(typeof(InvalidOperationException), delegate()
     {
         consumer.StartConsumption(warehoue);
     });
 }
 private void AddNewWorker(SmartWarehouse<FormattedText> pWarehouse)
 {
     Worker newWorker = new Worker
     {
         warehouse = pWarehouse,
         thread = new Thread(Production)
     };
     workers.Add(newWorker);
     newWorker.thread.Start(workers.Count - 1);
 }
 public void AddProducer_ThrowsExceptionWhenPassingSameProducerMoreThanOnce()
 {
     SmartWarehouse<FormattedText> warehouse = new SmartWarehouse<FormattedText>(20);
     PasswordDistributor distributor = new PasswordDistributor(warehouse);
     PasswordProducer producer = new PasswordProducer(new FormattedText("abc"));
     distributor.AddProducer(producer);
     Assert.Throws(typeof(ArgumentException), delegate()
     {
         distributor.AddProducer(producer);
     });
 }
        public void StartProduction(SmartWarehouse<FormattedText> warehouse)
        {
            if (warehouse == null)
                throw new NullReferenceException();
            lock (workersLocker)
            {
                if (warehouseAlreadyOnList(warehouse))
                    throw new InvalidOperationException("Production is already in progress.");

                cancelationFlag = false;
                AddNewWorker(warehouse);
            }
        }
        public void StartConsumption(SmartWarehouse<FormattedText> warehouse)
        {
            if (warehouse == null)
                throw new NullReferenceException();
            lock (synchronizationObject)
            {
                if (IsConsumtionInProgress)
                    throw new InvalidOperationException("Consumption is already in progress.");

                IsConsumtionInProgress = true;
                worker = Task.Run(() =>
                    {
                        Consumption(warehouse);
                    });
            }
        }
        public void StartConsumption_ThrowsExceptionWhenTryingToCallMethodWhenConsumptionIsNotStopped()
        {
            SmartWarehouse<FormattedText> warehouse = new SmartWarehouse<FormattedText>(20);
            PasswordDistributor distributor = new PasswordDistributor(warehouse);
            PasswordConsumer consumer = new PasswordConsumer(new FormattedText("cba"));
            consumer.PasswordTakingMaximumTime = 20;
            distributor.AddConsumer(consumer);

            distributor.StartConsumption();
            Assert.Throws(typeof(InvalidOperationException), delegate()
            {
                distributor.StartConsumption();
            });
            Thread.Sleep(2);
            consumer.StopConsumption();
        }
        static void Main(string[] args)
        {
            SmartWarehouse<FormattedText> warehouse = new SmartWarehouse<FormattedText>(20);
            PasswordProducer pp = new PasswordProducer(new FormattedText("abc"));
            PasswordConsumer pc = new PasswordConsumer(new FormattedText("cba"));

            PasswordDistributor distributor = new PasswordDistributor(warehouse);
            distributor.AddProducer(pp);
            distributor.AddConsumer(pc);
            distributor.StartConsumption();

            PasswordConsumer consumer = new PasswordConsumer(new FormattedText("bca"));
            distributor.AddConsumer(consumer);

            distributor.StartProduction();

            PasswordProducer producer = new PasswordProducer(new FormattedText("abc"));
            distributor.AddProducer(producer);

            Console.ReadLine();
            Console.WriteLine(warehouse.Count);
        }
 public void ReturnsSmartWarehouseObject()
 {
     SmartWarehouse<int> warehouse = new SmartWarehouse<int>(2);
     Assert.IsNotNull(warehouse);
 }
        private void Consumption(SmartWarehouse<FormattedText> warehouse)
        {
            cancelationFlag = false;
            bool passwordFound = false;

            while (!cancelationFlag && !passwordFound)
            {
                Console.WriteLine("Consumer is trying to take the Password.");
                FormattedText temporaryPassword;
                bool passwordWasTaken = warehouse.TryTake(out temporaryPassword, PasswordTakingMaximumTime);

                if (passwordWasTaken)
                {
                    Console.WriteLine("Consumer took the Password.");
                    if (temporaryPassword.CompareTo(desiredPassword) == 0)
                    {
                        Console.WriteLine("Consumer found the Password.");
                        passwordFound = true;

                        if (OnDesiredPasswordFound != null)
                            OnDesiredPasswordFound();
                    }
                }
                else
                    Console.WriteLine("Consumer was not able to take the Password due to maximum waiting time.");
            }

            IsConsumtionInProgress = false;
        }
 private bool warehouseAlreadyOnList(SmartWarehouse<FormattedText> warehouse)
 {
     bool onList = false;
     foreach (Worker w in workers)
     {
         onList = ReferenceEquals(warehouse, w.warehouse);
         if (onList)
             break;
     }
     return onList;
 }
        public void StartProduction_ThrowsExceptionWhenTryingToCallMethodWhenProductionIsNotStopped()
        {
            SmartWarehouse<FormattedText> warehouse = new SmartWarehouse<FormattedText>(20);
            PasswordDistributor distributor = new PasswordDistributor(warehouse);
            PasswordProducer producer = new PasswordProducer(new FormattedText("abc"));
            producer.PasswordAdditionMaximumTime = 20;
            distributor.AddProducer(producer);

            distributor.StartProduction();
            Assert.Throws(typeof(InvalidOperationException), delegate()
            {
                distributor.StartProduction();
            });
            producer.StopProduction();
        }
 public void ReturnsPasswordDistributorObject()
 {
     SmartWarehouse<FormattedText> warehouse = new SmartWarehouse<FormattedText>(20);
     PasswordDistributor distributor = new PasswordDistributor(warehouse);
     Assert.IsNotNull(distributor);
 }
 public PasswordDistributor(SmartWarehouse<FormattedText> warehouse)
 {
     if (warehouse == null)
         throw new NullReferenceException();
     this.warehouse = warehouse;
 }