public int TestBoard(ISuggestionStrategy strategy, Board board, Board[] allBoards, IDictionary <string, int> itemCounts)
        {
            Item[] filledItems = new Item[SuperMarioWiiConstants.ItemsPerBoard];
            int    suggestion  = 0;

            while (allBoards.Where(x => x.Matches(filledItems)).Count() > 1)
            {
                var suggestionId = strategy.SuggestNextItemPosition(allBoards, filledItems);
                suggestion++;

                if (suggestionId != null)
                {
                    var item = board[suggestionId.Value];

                    if (!itemCounts.ContainsKey(item.Name))
                    {
                        itemCounts.Add(item.Name, 0);
                    }
                    itemCounts[item.Name]++;

                    filledItems[suggestionId.Value] = item;
                }
            }

            Assert.False(filledItems.Where(i => i == Item.Bowser).Count() > 1, "Lost because found two Bowsers");
            Assert.False((filledItems.Where(i => i == Item.MiniBowser).Count() > 1), "Lost because found two MiniBowsers");

            var solutions = allBoards.Where(x => x.Matches(filledItems)).ToArray();

            Assert.Single(solutions);
            return(suggestion);
        }
        public void TestStrategy(ISuggestionStrategy strategy)
        {
            var allBoards   = SuperMarioWiiBoards.DefaultBoardSet.AllBoards.ToArray();
            var suggestions = new List <int>();

            var itemCounts = new Dictionary <string, int>();

            foreach (var b in allBoards)
            {
                suggestions.Add(TestBoard(strategy, b, allBoards, itemCounts));
            }

            output.WriteLine($"Result: Min={suggestions.Min()}, Max={suggestions.Max()}, Avg={suggestions.Average()}");

            foreach (var k in itemCounts.OrderByDescending(a => a.Value))
            {
                output.WriteLine(k.Key + " = " + k.Value);
            }
        }