public void ConstructWithTwoLinesNoCrLfAtEof()
        {
            // arrange
            const string input   = "\tfirst line\r\tsecond line";
            var          mockLog = new Mock <ILog>();
            var          source  = new CodeCoverageStringTextSource(input, "", mockLog.Object);

            // assert
            Assert.True(source.LinesCount == 2);

            // act
            var result = source.GetLine(1); // existing line index

            // assert
            Assert.True(result == "\tfirst line\r");

            // act
            result = source.GetLine(2); // existing line index

            // assert
            Assert.True(result == "\tsecond line");

            // act
            result = source.GetLine(0); // invalid line index

            // assert
            Assert.True(result == string.Empty);

            // act on first line
            var sp = new SequencePoint {
                StartLine = 1, StartColumn = 8, EndLine = 1, EndColumn = 12
            };

            result = source.GetText(sp);

            // assert
            Assert.True(result == "line");

            // act on second line
            sp = new SequencePoint {
                StartLine = 2, StartColumn = 9, EndLine = 2, EndColumn = 13
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "line");
        }
        public void ConstructWithNullString()
        {
            // arrange
            var source = new CodeCoverageStringTextSource(null, "");

            // assert
            Assert.True(source.LinesCount == 0);

            // act
            var result = source.GetLine(1); // not existing line index

            // assert
            Assert.True(result == string.Empty);

            // act
            result = source.GetLine(0); // invalid line index

            // assert
            Assert.True(result == string.Empty);
        }
        public void ConstructWithEmptyString()
        {
            // arrangevar mockLog = new Mock<ILog>();
            var mockLog = new Mock <ILog>();
            var source  = new CodeCoverageStringTextSource(string.Empty, "", mockLog.Object);

            // assert
            Assert.True(source.LinesCount == 0);

            // act
            var result = source.GetLine(1); // not existing line index

            // assert
            Assert.True(result == string.Empty);

            // act
            result = source.GetLine(0); // invalid line index

            // assert
            Assert.True(result == string.Empty);

            // act
            var sp = new SequencePoint {
                StartLine = 1, StartColumn = 1, EndLine = 1, EndColumn = 6
            };

            result = source.GetText(sp);

            // assert
            Assert.True(result == string.Empty);

            // act
            sp = new SequencePoint {
                StartLine = -1, StartColumn = -1, EndLine = -2, EndColumn = 6
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == string.Empty);
        }
        public void CountLinesWithCrLf()
        {
            // arrange
            const string input  = "\r\n\r\n\r\n\r\n";
            var          source = new CodeCoverageStringTextSource(input, "");

            // assert
            Assert.True(source.LinesCount == 4);

            // act
            var result = source.GetLine(1); // existing line index

            // assert
            Assert.True(result == "\r\n");
        }
        public void CountLinesWithMixedLineEnd()
        {
            // arrange
            const string input = "\r\r\r\n \r\n \r\n \r \n \n\n\n\r\n\n";
            //                     1 2   3    4    5  6  7  8 910  1112
            var source = new CodeCoverageStringTextSource(input, "");

            // assert
            Assert.True(source.LinesCount == 12);

            // act
            var result = source.GetLine(1); // existing line index

            // assert
            Assert.True(result == "\r");
        }
        public void CountLinesWithLineFeed()
        {
            // arrange
            const string input   = "\n\n\n\n\n\n\n";
            var          mockLog = new Mock <ILog>();
            var          source  = new CodeCoverageStringTextSource(input, "", mockLog.Object);

            // assert
            Assert.True(source.LinesCount == 7);

            // act
            var result = source.GetLine(1); // existing line index

            // assert
            Assert.True(result == "\n");
        }
        public void ConstructWithSingleLine()
        {
            // arrange
            const string input  = "single line";
            var          source = new CodeCoverageStringTextSource(input, "");

            // assert
            Assert.True(source.LinesCount == 1);

            // act
            var result = source.GetLine(1); // existing line index

            // assert
            Assert.True(result == input);

            // act
            result = source.GetLine(0); // invalid line index

            // assert
            Assert.True(result == string.Empty);

            // act
            var sp = new SequencePoint {
                StartLine = 1, StartColumn = 1, EndLine = 1, EndColumn = 7
            };

            result = source.GetText(sp);

            // assert
            Assert.True(result == "single");

            // act with too small StartColumn
            sp = new SequencePoint {
                StartLine = 1, StartColumn = -1, EndLine = 1, EndColumn = 7
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "single");

            // act with too large StartColumn
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 19, EndLine = 1, EndColumn = 20
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "");

            // act with too small EndColumn
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 1, EndLine = 1, EndColumn = 0
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "");

            // act with too large EndColumn
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 1, EndLine = 1, EndColumn = 20
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "single line");
        }
        public void ConstructWithFiveLines()
        {
            // arrange
            const string input  = "\tfirst line\n \n\tthird line\r\n \r   fifth line\r";
            var          source = new CodeCoverageStringTextSource(input, "");

            // assert
            Assert.True(source.LinesCount == 5);

            // act
            var result = source.GetLine(1); // existing line index

            // assert
            Assert.True(result == "\tfirst line\n");

            // act
            result = source.GetLine(2); // existing line index

            // assert
            Assert.True(result == " \n");

            // act
            result = source.GetLine(3); // existing line index

            // assert
            Assert.True(result == "\tthird line\r\n");

            // act
            result = source.GetLine(4); // existing line index

            // assert
            Assert.True(result == " \r");

            // act
            result = source.GetLine(5); // existing line index

            // assert
            Assert.True(result == "   fifth line\r");

            // act
            result = source.GetLine(9); // invalid line index

            // assert
            Assert.True(result == string.Empty);

            // act third line request
            var sp = new SequencePoint {
                StartLine = 3, StartColumn = 8, EndLine = 3, EndColumn = 12
            };

            result = source.GetText(sp);

            // assert
            Assert.True(result == "line");

            // act invalid two lines request
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 8, EndLine = 2, EndColumn = 13
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "line\n \n");

            // act valid two lines request
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 8, EndLine = 2, EndColumn = 2
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "line\n ");

            // act three lines request
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 8, EndLine = 3, EndColumn = 12
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "line\n \n\tthird line");
        }
        public void ConstructWithTwoLines()
        {
            // arrange
            const string input  = "\tfirst line\n\tsecond line\r";
            var          source = new CodeCoverageStringTextSource(input, "");

            // assert
            Assert.True(source.LinesCount == 2);

            // act with existing line index
            var result = source.GetLine(1);

            // assert
            Assert.True(result == "\tfirst line\n");

            // act with existing line index
            result = source.GetLine(2);

            // assert
            Assert.True(result == "\tsecond line\r");

            // act with invalid line index
            result = source.GetLine(0);

            // assert
            Assert.True(result == string.Empty);

            // act
            var sp = new SequencePoint {
                StartLine = 2, StartColumn = 9, EndLine = 2, EndColumn = 13
            };

            result = source.GetText(sp);

            // assert
            Assert.True(result == "line");

            // act with two lines request
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 8, EndLine = 2, EndColumn = 13
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "line\n\tsecond line");

            // act with extended two lines request
            sp = new SequencePoint {
                StartLine = 1, StartColumn = -8, EndLine = 2, EndColumn = 30
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "\tfirst line\n\tsecond line\r");

            // act with invalid first line request
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 28, EndLine = 2, EndColumn = 30
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "\tsecond line\r");

            // act with invalid first line and invalid second line request
            sp = new SequencePoint {
                StartLine = 1, StartColumn = 28, EndLine = 2, EndColumn = 0
            };
            result = source.GetText(sp);

            // assert
            Assert.True(result == "");
        }