public SurvivedTextLine GetTextLine(List<String> originalText, List<String> changedText)
        {
            if (originalText == null || changedText == null)
                throw new ArgumentNullException();
            _textLineCoreResults = new Dictionary<Tuple<int, int>, SurvivedTextLine>();
            _indexOfWithComparerResults = new Dictionary<Tuple<int, int>, int>();
            _weightKeeper = new Dictionary<SurvivedTextLine, int>();

            SurvivedTextLineComposite result = new SurvivedTextLineComposite("", 0, 0);

            for (int origLineIndex = 0; origLineIndex < originalText.Count; origLineIndex++)
            {
                var origStrLine = originalText[origLineIndex];

                var changedLineIndex = GetIndexOfWithComparer(origLineIndex, changedText, origStrLine, 0, Comparer);
                if (changedLineIndex >= 0)
                {
                    result.TextLines.Add(GetTextLineCore(
                        originalText, changedText, origLineIndex, changedLineIndex, Comparer));
                }
            }

            if (result.TextLines.Count <= 0)
            {
                return new SurvivedTextLineDummy();
            }

            return result.GetThisAndNextValues().Skip(1).First();
        }
        public void GetMaxWeightLine()
        {
            // arraange
            SurvivedTextLineComposite tlc_a = new SurvivedTextLineComposite("a", 1, 0);
            SurvivedTextLineLeaf tll_b = new SurvivedTextLineLeaf("b", 2, 0);
            SurvivedTextLineLeaf tll_d = new SurvivedTextLineLeaf("d", 3, 0);
            SurvivedTextLineLeaf tll_e = new SurvivedTextLineLeaf("e", 4, 0);
            tlc_a.TextLines = new List<SurvivedTextLine> {tll_b, tll_d, tll_e};

            // act
            var res = tlc_a.GetMaxWeightLine();

            //assert
            Assert.AreEqual(tll_b, res);
        }
        public void GetWeightTest1()
        {
            // arraange
            SurvivedTextLine tl = new SurvivedTextLineComposite("a",0,0)
            {
                TextLines = new List<SurvivedTextLine>
                {
                    new SurvivedTextLineLeaf("b",1,0),
                    new SurvivedTextLineLeaf("c",2,0),
                    new SurvivedTextLineLeaf("d",3,0)
                }
            };

            // act
            var res = tl.GetTotalWeight();

            //assert
            Assert.AreEqual(4, res);
        }
        private SurvivedTextLine GetTextLineCore(
            List<String> originalText, 
            List<String> changedText,
            int origLineIndex, 
            int changedLineIndex, 
            IComparer<string> comparer)
        {
            var key = new Tuple<int, int>(origLineIndex, changedLineIndex);
            if (_textLineCoreResults.ContainsKey(key))
            {
                return _textLineCoreResults[key];
            }

            SurvivedTextLineComposite result =
                new SurvivedTextLineComposite(originalText[origLineIndex], origLineIndex, changedLineIndex)
                {
                    WeightKeeper = _weightKeeper
                };

            for (int origLineIndexTmp = origLineIndex + 1; origLineIndexTmp < originalText.Count; origLineIndexTmp++)
            {
                var origStrLine = originalText[origLineIndexTmp];

                var changedLineIndexTmp = GetIndexOfWithComparer(origLineIndexTmp, changedText, origStrLine, changedLineIndex + 1, comparer);
                if (changedLineIndexTmp >= 0)
                {
                    result.TextLines.Add(GetTextLineCore(
                        originalText, changedText, origLineIndexTmp, changedLineIndexTmp, comparer));
                }
            }

            _textLineCoreResults.Add(new Tuple<int, int>(origLineIndex, changedLineIndex), result);
            return result;
        }