private void ChainEqualityComparer_WithDecorator_Tests(TestChainEqualityComparerDecorator comparer, int count, int lengthFrom, long lengthTo)
        {
            for (int length = lengthFrom; length <= lengthTo; length++)
            {
                var log = new List <string>();
                log.Add(count.ToString());
                log.Add(length.ToString());

                log.Add("\tequal:");
                // equal chains
                ChainEqualityComparer_WithDecorator_Test(comparer, log, count, length, i => "an item of the chain");

                log.Add("\trandom:");
                // random chains
                var random = new Random();
                ChainEqualityComparer_WithDecorator_Test(comparer, log, count, length, i => random.Next(0, 1_000_000).ToString());

                log.Add("\tpermut:");
                // permutation chains
                var keys = GenerateKeys(count, length, random);
                ChainEqualityComparer_WithDecorator_Test(comparer, log, count, length, i => keys[i][random.Next(0, length - 1)]);

                string line = string.Join('|', log);

                _output.WriteLine(line);
                Console.WriteLine(line);
            }
        }
        private void ChainEqualityComparer_WithDecorator_Test(TestChainEqualityComparerDecorator comparer, List <string> log, int count, int length, Func <int, string> getNext)
        {
            var hashSet = new HashSet <string[]>(comparer);

            for (int i = 0; i < count; i++)
            {
                string[] chain = new string[length];

                for (int j = 0; j < length; j++)
                {
                    string next = getNext(i);

                    chain[j] = next;
                }

                hashSet.Add(chain);
            }

            log.Add(comparer.GetHashCodeCounter.ToString());
            log.Add(comparer.EqualsCounter.ToString());
            log.Add(comparer.GetHashCodeMs.ToString());
            log.Add(comparer.EqualsMs.ToString());
        }
        public void ChainEqualityComparer_Tests(int count, int lengthFrom, long lengthTo)
        {
            var comparer = new TestChainEqualityComparerDecorator(new ChainEqualityComparer());

            ChainEqualityComparer_WithDecorator_Tests(comparer, count, lengthFrom, lengthTo);
        }