public void should_get_error_message_when_manager_is_full()
        {
            //Given
            var bagKeepers = new List<IBagKeeper>();
            IBagKeeper lockerForManager = new Locker(1);
            lockerListForRobot = new List<IBagKeeper>();
            lockerListForRobot.Add(new Locker(1));
            var lockerListForSmartRobot = new List<IBagKeeper>();
            lockerListForSmartRobot.Add(new Locker(1));
            var lockerListForSuperRobot = new List<IBagKeeper>();
            lockerListForSuperRobot.Add(new Locker(1));
            robot = new Robot(lockerListForRobot);
            var smartRobot = new SmartRobot(lockerListForSmartRobot);
            var superRobot = new SuperRobot(lockerListForSuperRobot);

            bagKeepers.Add(smartRobot);
            bagKeepers.Add(superRobot);
            bagKeepers.Add(lockerForManager);
            bagKeepers.Add(robot);
            manager = new Manager(bagKeepers);

            //When
            for (int i = 0; i < 4; i++)
            {
                manager.Store(new Bag());
            }

            //Then
            var ex = Assert.Throws<ArgumentException>(() => manager.Store(new Bag()));
            Assert.That(ex.Message, Is.EqualTo("The manager is full!"));
        }
        public void should_get_a_ticket_when_robot_fisrt_store_a_bag_in_locker()
        {
            var robot = new Robot(lockers);
            var bag = new Bag();
            Ticket ticket = robot.Store(bag);

            Assert.NotNull(ticket);
        }
        public void should_pick_bag_which_we_stroed_in()
        {
            var robot = new Robot(lockers);
            var bagStore = new Bag();

            Ticket ticket = robot.Store(bagStore);

            var bagPick = robot.Pick(ticket);

            Assert.AreSame(bagPick, bagStore);
        }
        public void should_return_error_message_when_lockers_are_full()
        {
            var lockerSize = 10;
            var robot = new Robot(oneLocker);

            for (int i = 0; i < lockerSize; i++)
            {
                robot.Store(new Bag());
            }
            var anotherBag = new Bag();

            var ex = Assert.Throws<ArgumentException>(() => robot.Store(anotherBag));
            Assert.That(ex.Message, Is.EqualTo("The lockers are full!"));
        }
        public void should_circle_pick_and_store()
        {
            var robot = new Robot(oneLocker);
            for (int i = 0; i <= oneLocker.Count; i++)
            {
                robot.Store(new Bag());
            }

            var firstBag = new Bag();
            var secondBag = new Bag();

            var firstTicket = robot.Store(firstBag);
            robot.Pick(firstTicket);

            var secondTicket = robot.Store(secondBag);

            Assert.NotNull(secondTicket);
        }
        public void should_return_error_message_when_robot_without_lockers()
        {
            List<IBagKeeper> emptyLockers = new List<IBagKeeper>();
            var bag1 = new Bag();

            var robot = new Robot(emptyLockers);

            var ex = Assert.Throws<ArgumentException>(() => robot.Store(bag1));
            Assert.That(ex.Message, Is.EqualTo("No locker is available"));
        }
        public void should_store_bag_in_sequence()
        {
            var lockersWithOneCapcity = new List<IBagKeeper>();
            for (int i = 0; i < LOCKER_COUNT; i++)
            {
                lockersWithOneCapcity.Add(new Locker(1));
            }

            var robot = new Robot(lockersWithOneCapcity);

            lockersWithOneCapcity[0].Store(new Bag());
            lockersWithOneCapcity[2].Store(new Bag());

            robot.Store(new Bag());

            Assert.AreEqual(lockersWithOneCapcity[1].Capacity, 0);
            Assert.AreEqual(lockersWithOneCapcity[3].Capacity, 1);
        }
        public void should_return_null_when_pick_bag_with_used_ticket()
        {
            var robot = new Robot(oneLocker);
            var firstBag = new Bag();

            var ticket = robot.Store(firstBag);

            robot.Pick(ticket);

            Assert.Null(robot.Pick(ticket));
        }
        public void should_get_ticket_when_manage_robots_to_store_bag()
        {
            //Given
            lockerListForRobot = new List<IBagKeeper>();
            lockerListForRobot.Add(locker);

            robot = new Robot(lockerListForRobot);
            robotList = new List<IBagKeeper>();
            robotList.Add(robot);

            manager = new Manager(robotList);

            //When
            var ticket = manager.Store(bag);

            //Then
            Assert.AreSame(bag, robot.Pick(ticket));
        }
        public void should_manage_robots_and_lockers_to_store_bag()
        {
            //Given
            var bagKeepers = new List<IBagKeeper>();
            locker = new Locker(1);
            IBagKeeper lockerForManager = new Locker(1);
            lockerListForRobot = new List<IBagKeeper>();
            lockerListForRobot.Add(locker);
            robot = new Robot(lockerListForRobot);
            bagKeepers.Add(lockerForManager);
            bagKeepers.Add(robot);
            manager = new Manager(bagKeepers);

            //When
            Ticket ticket = manager.Store(bag);
            Ticket ticket2 = manager.Store(bag2);

            //Then
            Assert.NotNull(ticket);
            Assert.NotNull(ticket2);
            Assert.AreSame(bag, manager.Pick(ticket));
            Assert.AreSame(bag2, manager.Pick(ticket2));
        }