// 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 lines = new List(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)); } } }