The congeneric chain.
Inheritance: AbstractChain
        public void IndependenceMessageTest()
        {
            congenericChain = new CongenericChain(message, 10);

            var newMessage = (ValueString)congenericChain.Element;

            Assert.AreNotSame(congenericChain.Element, newMessage);
        }
        public void SimilarChainsGetTest()
        {
            var congenericChainA = new CongenericChain(new[] { 2, 8 }, elements["A"], 10);

            var chainCreatedCongenericChain = chains[2].CongenericChain(elements["A"]);

            Assert.AreEqual(congenericChainA, chainCreatedCongenericChain);
        }
 public void Initialization()
 {
     message = new ValueString('1');
     congenericChain = new CongenericChain(message, 10);
     wrongMessage = new ValueString('2');
 }
        /// <summary>
        /// Fills all congeneric chains of this chain.
        /// All congeneric sequences stored in <see cref="congenericChains"/> field.
        /// </summary>
        private void FillCongenericChains()
        {
            var occurrences = new List<int>[alphabet.Cardinality - 1];

            for (int i = 0; i < alphabet.Cardinality - 1; i++)
            {
                occurrences[i] = new List<int>();
            }

            for (int j = 0; j < building.Length; j++)
            {
                if (building[j] != 0)
                {
                    occurrences[building[j] - 1].Add(j);
                }
            }

            congenericChains = new CongenericChain[alphabet.Cardinality - 1];
            for (int k = 0; k < alphabet.Cardinality - 1; k++)
            {
                congenericChains[k] = new CongenericChain(occurrences[k], alphabet[k + 1], building.Length);
            }
        }