private static void Assert_KeysCollected(PerKeyCacheClientRuleAggregator aggregator,
                                                 Dictionary <Guid, IList <string> > expectedkeysForCacheClients,
                                                 List <IRoutedCacheClientRule> rules,
                                                 int numKeys)
        {
            Assert.NotNull(aggregator.CacheClients);
            Assert.NotNull(aggregator.KeysForCacheClient);

            Assert.AreEqual(Math.Min(numKeys, expectedkeysForCacheClients.Count),
                            aggregator.KeysForCacheClient.Count);

            foreach (KeyValuePair <Guid, IList <string> > actualKeysForCacheClientPair in aggregator.KeysForCacheClient)
            {
                Assert.IsTrue(expectedkeysForCacheClients
                              .ContainsKey(actualKeysForCacheClientPair.Key));

                CollectionAssert.AreEquivalent(expectedkeysForCacheClients[actualKeysForCacheClientPair.Key],
                                               actualKeysForCacheClientPair.Value);
            }

            Assert.AreEqual(Math.Min(rules.Count, numKeys),
                            aggregator.CacheClients.Count);

            foreach (KeyValuePair <Guid, ICacheClient> actualCacheClientPair in aggregator.CacheClients)
            {
                Assert.IsTrue(rules.Any(r => r.Id == actualCacheClientPair.Key));

                Assert.AreSame(rules.FirstOrDefault(r => r.Id == actualCacheClientPair.Key).Client,
                               actualCacheClientPair.Value);
            }
        }
        public void Test_CanCollect_All(int numKeys, int numClients)
        {
            PerKeyCacheClientRuleAggregator aggregator =
                new PerKeyCacheClientRuleAggregator();

            Dictionary <Guid, IList <string> > keysForCacheClients =
                new Dictionary <Guid, IList <string> >();

            //Init rules
            List <IRoutedCacheClientRule> cacheClientRules =
                CreateTestRules(numClients);

            foreach (IRoutedCacheClientRule r in cacheClientRules)
            {
                keysForCacheClients[r.Id] = new List <string>();
            }

            //Generate some keys and distribute
            // them per cache client rules
            List <string> testCacheKeys = GenerateTestKeys(numKeys,
                                                           cacheClientRules,
                                                           keysForCacheClients);

            aggregator.CollectAll(testCacheKeys, key =>
            {
                KeyValuePair <Guid, IList <string> > ruleWithKey = keysForCacheClients
                                                                   .FirstOrDefault(p => p.Value.Contains(key));

                return(cacheClientRules
                       .FirstOrDefault(r => r.Id == ruleWithKey.Key));
            });

            Assert_KeysCollected(aggregator,
                                 keysForCacheClients,
                                 cacheClientRules,
                                 numKeys);
        }
        public void Test_CanCollect_Single(int numKeys, int numClients)
        {
            PerKeyCacheClientRuleAggregator aggregator =
                new PerKeyCacheClientRuleAggregator();

            Dictionary <Guid, IList <string> > keysForCacheClients =
                new Dictionary <Guid, IList <string> >();

            //Init rules
            List <IRoutedCacheClientRule> cacheClientRules =
                CreateTestRules(numClients);

            foreach (IRoutedCacheClientRule r in cacheClientRules)
            {
                keysForCacheClients[r.Id] = new List <string>();
            }

            //Generate some keys and distribute
            // them per cache client rules
            List <string> testCacheKeys = GenerateTestKeys(numKeys,
                                                           cacheClientRules,
                                                           keysForCacheClients);

            foreach (KeyValuePair <Guid, IList <string> > keysForRules in keysForCacheClients)
            {
                IRoutedCacheClientRule rule = cacheClientRules.FirstOrDefault(r => r.Id == keysForRules.Key);
                foreach (string key in keysForRules.Value)
                {
                    aggregator.Collect(key, rule);
                }
            }

            Assert_KeysCollected(aggregator,
                                 keysForCacheClients,
                                 cacheClientRules,
                                 numKeys);
        }