/// <summary>
        /// Reads the details for chance and community chest cards from a csv file
        /// </summary>
        /// <returns>A list of Luck objects that represent each card</returns>
        public List<Luck> ReadCardDetailsFromCSV()
        {
            try
            {
                var luckFactory = new LuckFactory();
                var reader = new StreamReader(File.OpenRead("carddetails.csv"));
                var cardDetailsFromCSV = new List<Luck>();

                while (!reader.EndOfStream)
                {
                    var line = reader.ReadLine();
                    if (line.Contains("Name")) continue; // Ignore the column headings

                    var values = line.Split(',');

                    var card = luckFactory.create(values[0], Convert.ToBoolean(values[1]), Convert.ToDecimal(values[2]));

                    cardDetailsFromCSV.Add(card);
                }

                return cardDetailsFromCSV;
            }
            catch (Exception ex)
            {
                throw new ApplicationException(ex.Message);
            }
        }
        public void CreateProperties()
        {
            var resFactory = new ResidentialFactory();
            var transFactory = new TransportFactory();
            var utilFactory = new UtilityFactory();
            var genericFactory = new PropertyFactory();
            var luckFactory = new LuckFactory();


            try
            {
                var propertyDetails = _fileReader.ReadPropertyDetailsFromCSV();

                // Add the properties to the board
                foreach (var propertyDetail in propertyDetails)
                {
                    switch (propertyDetail.Type.ToLower())
                    {
                        case "luck":
                            Board.Access()
                                .AddProperty(luckFactory.create(propertyDetail.Name, propertyDetail.IsPenalty,
                                    propertyDetail.Amount));
                            break;
                        case "residential":
                            Board.Access()
                                .AddProperty(resFactory.create(propertyDetail.Name, propertyDetail.Price,
                                    propertyDetail.Rent, propertyDetail.HouseCost, propertyDetail.HouseColour));
                            break;
                        case "transport":
                            Board.Access().AddProperty(transFactory.create(propertyDetail.Name));
                            break;
                        case "utility":
                            Board.Access().AddProperty(utilFactory.create(propertyDetail.Name));
                            break;
                        case "generic":
                            Board.Access().AddProperty(genericFactory.Create(propertyDetail.Name));
                            break;
                    }
                }

                Console.WriteLine("Properties have been setup");
            }
            catch (Exception ex)
            {
                Console.WriteLine("Oops, something went wrong setting up the properties: {0}", ex.Message);
            }
        }
        public void getting_a_chance_card()
        {
            var luckFactory = new LuckFactory();
            var chanceCard = luckFactory.create("It's your birthday, collect $40.", false, 40);
            Board.Access().AddChanceCard(chanceCard);

            var cardFromBoard = Board.Access().GetChanceCard();

            // First we should get the card
            Assert.IsNotNull(cardFromBoard);

            // It should be the one we added
            Assert.AreSame(cardFromBoard, chanceCard);

            // Now we have it, should be removed
            Assert.IsNull(Board.Access().GetChanceCard());

            // So they'll be no cards left
            Assert.AreEqual(0, Board.Access().GetChanceCards().Count);
        }
        public void verify_ToString_methods()
        {
            // need to reset and add a property to the board for these tests
            var luckFactory = new LuckFactory();
            Board.Access().ResetBoard();
            Board.Access().AddProperty(luckFactory.create("Go", false, 200));

            _emptyPlayer.SetBalance(500);
            _emptyPlayer.SetName("Josh");
            _emptyPlayer.SetLocation(0);

            const string expectedStandardToString = "Josh";
            var actualStandardToString = _emptyPlayer.ToString();

            Assert.AreEqual(expectedStandardToString, actualStandardToString);

            const string expectedBriefDetailToString = "You are on Go.\tYou have $500.";
            var actualBriefDetailToString = _emptyPlayer.BriefDetailToString();

            Assert.AreEqual(expectedBriefDetailToString, actualBriefDetailToString);

            var expectedFullDetailToString = string.Format("Player:Josh.\nBalance: $500\nLocation: Go: \t Owned by: Leeroy Jenkins (Square 0) \nProperties Owned:\n{0}", _emptyPlayer.PropertiesOwnedToString());
            var actualFullDetailToString = _emptyPlayer.FullDetailToString();

            Assert.AreEqual(expectedFullDetailToString, actualFullDetailToString);

            const string expectedDiceRollToString = "Rolling dice: \t Dice 1: 0 \t Dice 2: 0";
            var actualDiceRollToString = _emptyPlayer.DiceRollingToString();
        }