532 lines
13 KiB
C#
532 lines
13 KiB
C#
// Copyright (c) AlphaSierraPapa for the SharpDevelop Team (for details please see \doc\copyright.txt)
|
|
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
|
|
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using NUnit.Framework;
|
|
|
|
namespace ICSharpCode.AvalonEdit.Document
|
|
{
|
|
[TestFixture]
|
|
public class LineManagerTests
|
|
{
|
|
TextDocument document;
|
|
|
|
[SetUp]
|
|
public void SetUp()
|
|
{
|
|
document = new TextDocument();
|
|
}
|
|
|
|
[Test]
|
|
public void CheckEmptyDocument()
|
|
{
|
|
Assert.AreEqual("", document.Text);
|
|
Assert.AreEqual(0, document.TextLength);
|
|
Assert.AreEqual(1, document.LineCount);
|
|
}
|
|
|
|
[Test]
|
|
public void CheckClearingDocument()
|
|
{
|
|
document.Text = "Hello,\nWorld!";
|
|
Assert.AreEqual(2, document.LineCount);
|
|
document.Text = "";
|
|
Assert.AreEqual("", document.Text);
|
|
Assert.AreEqual(0, document.TextLength);
|
|
Assert.AreEqual(1, document.LineCount);
|
|
}
|
|
|
|
[Test]
|
|
public void CheckGetLineInEmptyDocument()
|
|
{
|
|
Assert.AreEqual(1, document.Lines.Count);
|
|
List<DocumentLine> lines = new List<DocumentLine>(document.Lines);
|
|
Assert.AreEqual(1, lines.Count);
|
|
DocumentLine line = document.Lines[0];
|
|
Assert.AreSame(line, lines[0]);
|
|
Assert.AreSame(line, document.GetLineByNumber(1));
|
|
Assert.AreSame(line, document.GetLineByOffset(0));
|
|
}
|
|
|
|
[Test]
|
|
public void CheckLineSegmentInEmptyDocument()
|
|
{
|
|
DocumentLine line = document.GetLineByNumber(1);
|
|
Assert.AreEqual(1, line.LineNumber);
|
|
Assert.AreEqual(0, line.Offset);
|
|
Assert.IsFalse(line.IsDeleted);
|
|
Assert.AreEqual(0, line.Length);
|
|
Assert.AreEqual(0, line.TotalLength);
|
|
Assert.AreEqual(0, line.DelimiterLength);
|
|
}
|
|
|
|
[Test]
|
|
public void LineIndexOfTest()
|
|
{
|
|
DocumentLine line = document.GetLineByNumber(1);
|
|
Assert.AreEqual(0, document.Lines.IndexOf(line));
|
|
DocumentLine lineFromOtherDocument = new TextDocument().GetLineByNumber(1);
|
|
Assert.AreEqual(-1, document.Lines.IndexOf(lineFromOtherDocument));
|
|
document.Text = "a\nb\nc";
|
|
DocumentLine middleLine = document.GetLineByNumber(2);
|
|
Assert.AreEqual(1, document.Lines.IndexOf(middleLine));
|
|
document.Remove(1, 3);
|
|
Assert.IsTrue(middleLine.IsDeleted);
|
|
Assert.AreEqual(-1, document.Lines.IndexOf(middleLine));
|
|
}
|
|
|
|
[Test]
|
|
public void InsertInEmptyDocument()
|
|
{
|
|
document.Insert(0, "a");
|
|
Assert.AreEqual(document.LineCount, 1);
|
|
DocumentLine line = document.GetLineByNumber(1);
|
|
Assert.AreEqual("a", document.GetText(line));
|
|
}
|
|
|
|
[Test]
|
|
public void SetText()
|
|
{
|
|
document.Text = "a";
|
|
Assert.AreEqual(document.LineCount, 1);
|
|
DocumentLine line = document.GetLineByNumber(1);
|
|
Assert.AreEqual("a", document.GetText(line));
|
|
}
|
|
|
|
[Test]
|
|
public void InsertNothing()
|
|
{
|
|
document.Insert(0, "");
|
|
Assert.AreEqual(document.LineCount, 1);
|
|
Assert.AreEqual(document.TextLength, 0);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentNullException))]
|
|
public void InsertNull()
|
|
{
|
|
document.Insert(0, null);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentNullException))]
|
|
public void SetTextNull()
|
|
{
|
|
document.Text = null;
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveNothing()
|
|
{
|
|
document.Remove(0, 0);
|
|
Assert.AreEqual(document.LineCount, 1);
|
|
Assert.AreEqual(document.TextLength, 0);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void GetCharAt0EmptyDocument()
|
|
{
|
|
document.GetCharAt(0);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void GetCharAtNegativeOffset()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.GetCharAt(-1);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void GetCharAtEndOffset()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.GetCharAt(document.TextLength);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void InsertAtNegativeOffset()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.Insert(-1, "text");
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void InsertAfterEndOffset()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.Insert(4, "text");
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void RemoveNegativeAmount()
|
|
{
|
|
document.Text = "abcd";
|
|
document.Remove(2, -1);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void RemoveTooMuch()
|
|
{
|
|
document.Text = "abcd";
|
|
document.Remove(2, 10);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void GetLineByNumberNegative()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.GetLineByNumber(-1);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void GetLineByNumberTooHigh()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.GetLineByNumber(3);
|
|
}
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void GetLineByOffsetNegative()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.GetLineByOffset(-1);
|
|
}
|
|
|
|
|
|
[Test, ExpectedException(typeof(ArgumentOutOfRangeException))]
|
|
public void GetLineByOffsetToHigh()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.GetLineByOffset(10);
|
|
}
|
|
|
|
[Test]
|
|
public void InsertAtEndOffset()
|
|
{
|
|
document.Text = "a\nb";
|
|
CheckDocumentLines("a",
|
|
"b");
|
|
document.Insert(3, "text");
|
|
CheckDocumentLines("a",
|
|
"btext");
|
|
}
|
|
|
|
[Test]
|
|
public void GetCharAt()
|
|
{
|
|
document.Text = "a\r\nb";
|
|
Assert.AreEqual('a', document.GetCharAt(0));
|
|
Assert.AreEqual('\r', document.GetCharAt(1));
|
|
Assert.AreEqual('\n', document.GetCharAt(2));
|
|
Assert.AreEqual('b', document.GetCharAt(3));
|
|
}
|
|
|
|
[Test]
|
|
public void CheckMixedNewLineTest()
|
|
{
|
|
const string mixedNewlineText = "line 1\nline 2\r\nline 3\rline 4";
|
|
document.Text = mixedNewlineText;
|
|
Assert.AreEqual(mixedNewlineText, document.Text);
|
|
Assert.AreEqual(4, document.LineCount);
|
|
for (int i = 1; i < 4; i++) {
|
|
DocumentLine line = document.GetLineByNumber(i);
|
|
Assert.AreEqual(i, line.LineNumber);
|
|
Assert.AreEqual("line " + i, document.GetText(line));
|
|
}
|
|
Assert.AreEqual(1, document.GetLineByNumber(1).DelimiterLength);
|
|
Assert.AreEqual(2, document.GetLineByNumber(2).DelimiterLength);
|
|
Assert.AreEqual(1, document.GetLineByNumber(3).DelimiterLength);
|
|
Assert.AreEqual(0, document.GetLineByNumber(4).DelimiterLength);
|
|
}
|
|
|
|
[Test]
|
|
public void LfCrIsTwoNewLinesTest()
|
|
{
|
|
document.Text = "a\n\rb";
|
|
Assert.AreEqual("a\n\rb", document.Text);
|
|
CheckDocumentLines("a",
|
|
"",
|
|
"b");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveFirstPartOfDelimiter()
|
|
{
|
|
document.Text = "a\r\nb";
|
|
document.Remove(1, 1);
|
|
Assert.AreEqual("a\nb", document.Text);
|
|
CheckDocumentLines("a",
|
|
"b");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveLineContentAndJoinDelimiters()
|
|
{
|
|
document.Text = "a\rb\nc";
|
|
document.Remove(2, 1);
|
|
Assert.AreEqual("a\r\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveLineContentAndJoinDelimiters2()
|
|
{
|
|
document.Text = "a\rb\nc\nd";
|
|
document.Remove(2, 3);
|
|
Assert.AreEqual("a\r\nd", document.Text);
|
|
CheckDocumentLines("a",
|
|
"d");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveLineContentAndJoinDelimiters3()
|
|
{
|
|
document.Text = "a\rb\r\nc";
|
|
document.Remove(2, 2);
|
|
Assert.AreEqual("a\r\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveLineContentAndJoinNonMatchingDelimiters()
|
|
{
|
|
document.Text = "a\nb\nc";
|
|
document.Remove(2, 1);
|
|
Assert.AreEqual("a\n\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveLineContentAndJoinNonMatchingDelimiters2()
|
|
{
|
|
document.Text = "a\nb\rc";
|
|
document.Remove(2, 1);
|
|
Assert.AreEqual("a\n\rc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveMultilineUpToFirstPartOfDelimiter()
|
|
{
|
|
document.Text = "0\n1\r\n2";
|
|
document.Remove(1, 3);
|
|
Assert.AreEqual("0\n2", document.Text);
|
|
CheckDocumentLines("0",
|
|
"2");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveSecondPartOfDelimiter()
|
|
{
|
|
document.Text = "a\r\nb";
|
|
document.Remove(2, 1);
|
|
Assert.AreEqual("a\rb", document.Text);
|
|
CheckDocumentLines("a",
|
|
"b");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveFromSecondPartOfDelimiter()
|
|
{
|
|
document.Text = "a\r\nb\nc";
|
|
document.Remove(2, 3);
|
|
Assert.AreEqual("a\rc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveFromSecondPartOfDelimiterToDocumentEnd()
|
|
{
|
|
document.Text = "a\r\nb";
|
|
document.Remove(2, 2);
|
|
Assert.AreEqual("a\r", document.Text);
|
|
CheckDocumentLines("a",
|
|
"");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveUpToMatchingDelimiter1()
|
|
{
|
|
document.Text = "a\r\nb\nc";
|
|
document.Remove(2, 2);
|
|
Assert.AreEqual("a\r\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveUpToMatchingDelimiter2()
|
|
{
|
|
document.Text = "a\r\nb\r\nc";
|
|
document.Remove(2, 3);
|
|
Assert.AreEqual("a\r\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveUpToNonMatchingDelimiter()
|
|
{
|
|
document.Text = "a\r\nb\rc";
|
|
document.Remove(2, 2);
|
|
Assert.AreEqual("a\r\rc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveTwoCharDelimiter()
|
|
{
|
|
document.Text = "a\r\nb";
|
|
document.Remove(1, 2);
|
|
Assert.AreEqual("ab", document.Text);
|
|
CheckDocumentLines("ab");
|
|
}
|
|
|
|
[Test]
|
|
public void RemoveOneCharDelimiter()
|
|
{
|
|
document.Text = "a\nb";
|
|
document.Remove(1, 1);
|
|
Assert.AreEqual("ab", document.Text);
|
|
CheckDocumentLines("ab");
|
|
}
|
|
|
|
void CheckDocumentLines(params string[] lines)
|
|
{
|
|
Assert.AreEqual(lines.Length, document.LineCount, "LineCount");
|
|
for (int i = 0; i < lines.Length; i++) {
|
|
Assert.AreEqual(lines[i], document.GetText(document.Lines[i]), "Text of line " + (i + 1));
|
|
}
|
|
}
|
|
|
|
[Test]
|
|
public void FixUpFirstPartOfDelimiter()
|
|
{
|
|
document.Text = "a\n\nb";
|
|
document.Replace(1, 1, "\r");
|
|
Assert.AreEqual("a\r\nb", document.Text);
|
|
CheckDocumentLines("a",
|
|
"b");
|
|
}
|
|
|
|
[Test]
|
|
public void FixUpSecondPartOfDelimiter()
|
|
{
|
|
document.Text = "a\r\rb";
|
|
document.Replace(2, 1, "\n");
|
|
Assert.AreEqual("a\r\nb", document.Text);
|
|
CheckDocumentLines("a",
|
|
"b");
|
|
}
|
|
|
|
[Test]
|
|
public void InsertInsideDelimiter()
|
|
{
|
|
document.Text = "a\r\nc";
|
|
document.Insert(2, "b");
|
|
Assert.AreEqual("a\rb\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"b",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void InsertInsideDelimiter2()
|
|
{
|
|
document.Text = "a\r\nd";
|
|
document.Insert(2, "b\nc");
|
|
Assert.AreEqual("a\rb\nc\nd", document.Text);
|
|
CheckDocumentLines("a",
|
|
"b",
|
|
"c",
|
|
"d");
|
|
}
|
|
|
|
[Test]
|
|
public void InsertInsideDelimiter3()
|
|
{
|
|
document.Text = "a\r\nc";
|
|
document.Insert(2, "b\r");
|
|
Assert.AreEqual("a\rb\r\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"b",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void ExtendDelimiter1()
|
|
{
|
|
document.Text = "a\nc";
|
|
document.Insert(1, "b\r");
|
|
Assert.AreEqual("ab\r\nc", document.Text);
|
|
CheckDocumentLines("ab",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void ExtendDelimiter2()
|
|
{
|
|
document.Text = "a\rc";
|
|
document.Insert(2, "\nb");
|
|
Assert.AreEqual("a\r\nbc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"bc");
|
|
}
|
|
|
|
[Test]
|
|
public void ReplaceLineContentBetweenMatchingDelimiters()
|
|
{
|
|
document.Text = "a\rb\nc";
|
|
document.Replace(2, 1, "x");
|
|
Assert.AreEqual("a\rx\nc", document.Text);
|
|
CheckDocumentLines("a",
|
|
"x",
|
|
"c");
|
|
}
|
|
|
|
[Test]
|
|
public void GetOffset()
|
|
{
|
|
document.Text = "Hello,\nWorld!";
|
|
Assert.AreEqual(0, document.GetOffset(1, 1));
|
|
Assert.AreEqual(1, document.GetOffset(1, 2));
|
|
Assert.AreEqual(5, document.GetOffset(1, 6));
|
|
Assert.AreEqual(6, document.GetOffset(1, 7));
|
|
Assert.AreEqual(7, document.GetOffset(2, 1));
|
|
Assert.AreEqual(8, document.GetOffset(2, 2));
|
|
Assert.AreEqual(12, document.GetOffset(2, 6));
|
|
Assert.AreEqual(13, document.GetOffset(2, 7));
|
|
}
|
|
|
|
[Test]
|
|
public void GetOffsetIgnoreNegativeColumns()
|
|
{
|
|
document.Text = "Hello,\nWorld!";
|
|
Assert.AreEqual(0, document.GetOffset(1, -1));
|
|
Assert.AreEqual(0, document.GetOffset(1, -100));
|
|
Assert.AreEqual(0, document.GetOffset(1, 0));
|
|
Assert.AreEqual(7, document.GetOffset(2, -1));
|
|
Assert.AreEqual(7, document.GetOffset(2, -100));
|
|
Assert.AreEqual(7, document.GetOffset(2, 0));
|
|
}
|
|
|
|
[Test]
|
|
public void GetOffsetIgnoreTooHighColumns()
|
|
{
|
|
document.Text = "Hello,\nWorld!";
|
|
Assert.AreEqual(6, document.GetOffset(1, 8));
|
|
Assert.AreEqual(6, document.GetOffset(1, 100));
|
|
Assert.AreEqual(13, document.GetOffset(2, 8));
|
|
Assert.AreEqual(13, document.GetOffset(2, 100));
|
|
}
|
|
}
|
|
}
|