6 changed files with 187 additions and 10 deletions
@ -0,0 +1,166 @@ |
|||||||
|
// 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 System.Linq; |
||||||
|
using ICSharpCode.NRefactory.Editor; |
||||||
|
using NUnit.Framework; |
||||||
|
|
||||||
|
namespace ICSharpCode.AvalonEdit.Highlighting |
||||||
|
{ |
||||||
|
[TestFixture] |
||||||
|
public class HighlightedLineMergeTests |
||||||
|
{ |
||||||
|
IDocument document = new ReadOnlyDocument(new string(' ', 20)); |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void SimpleMerge1() |
||||||
|
{ |
||||||
|
HighlightedLine baseLine = new HighlightedLine(document, document.GetLineByNumber(1)); |
||||||
|
baseLine.Sections.Add(MakeSection(0, 1, "B")); |
||||||
|
|
||||||
|
HighlightedLine additionalLine = new HighlightedLine(document, document.GetLineByNumber(1)); |
||||||
|
additionalLine.Sections.Add(MakeSection(0, 2, "A")); |
||||||
|
|
||||||
|
baseLine.MergeWith(additionalLine); |
||||||
|
// The additional section gets split up so that it fits into the tree structure
|
||||||
|
Assert.That(baseLine.Sections, Is.EqualTo( |
||||||
|
new[] { |
||||||
|
MakeSection(0, 1, "B"), |
||||||
|
MakeSection(0, 1, "A"), |
||||||
|
MakeSection(1, 2, "A") |
||||||
|
}).Using(new SectionComparer())); |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void SimpleMerge2() |
||||||
|
{ |
||||||
|
HighlightedLine baseLine = new HighlightedLine(document, document.GetLineByNumber(1)); |
||||||
|
baseLine.Sections.Add(MakeSection(0, 1, "B")); |
||||||
|
baseLine.Sections.Add(MakeSection(0, 1, "BN")); |
||||||
|
|
||||||
|
HighlightedLine additionalLine = new HighlightedLine(document, document.GetLineByNumber(1)); |
||||||
|
additionalLine.Sections.Add(MakeSection(0, 2, "A")); |
||||||
|
|
||||||
|
baseLine.MergeWith(additionalLine); |
||||||
|
// The additional section gets split up so that it fits into the tree structure
|
||||||
|
Assert.That(baseLine.Sections, Is.EqualTo( |
||||||
|
new[] { |
||||||
|
MakeSection(0, 1, "B"), |
||||||
|
MakeSection(0, 1, "BN"), |
||||||
|
MakeSection(0, 1, "A"), |
||||||
|
MakeSection(1, 2, "A") |
||||||
|
}).Using(new SectionComparer())); |
||||||
|
} |
||||||
|
|
||||||
|
HighlightedSection MakeSection(int start, int end, string name) |
||||||
|
{ |
||||||
|
return new HighlightedSection { Offset = start, Length = end - start, Color = new HighlightingColor { Name = name }}; |
||||||
|
} |
||||||
|
|
||||||
|
class SectionComparer : IEqualityComparer<HighlightedSection> |
||||||
|
{ |
||||||
|
public bool Equals(HighlightedSection a, HighlightedSection b) |
||||||
|
{ |
||||||
|
return a.Offset == b.Offset && a.Length == b.Length && a.Color.Name == b.Color.Name; |
||||||
|
} |
||||||
|
|
||||||
|
public int GetHashCode(HighlightedSection obj) |
||||||
|
{ |
||||||
|
return obj.Offset; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
#region Automatic Test
|
||||||
|
/* |
||||||
|
const int combinations = 6 * 3 * 4 * 3 * 3 * 4; |
||||||
|
HighlightingColor[] baseLineColors = { |
||||||
|
new HighlightingColor { Name = "Base-A" }, |
||||||
|
new HighlightingColor { Name = "Base-B" }, |
||||||
|
new HighlightingColor { Name = "Base-N" }, |
||||||
|
new HighlightingColor { Name = "Base-C" } |
||||||
|
}; |
||||||
|
HighlightingColor[] additionalLineColors = { |
||||||
|
new HighlightingColor { Name = "Add-A" }, |
||||||
|
new HighlightingColor { Name = "Add-B" }, |
||||||
|
new HighlightingColor { Name = "Add-N" }, |
||||||
|
new HighlightingColor { Name = "Add-C" } |
||||||
|
}; |
||||||
|
|
||||||
|
HighlightedLine BuildHighlightedLine(int num, HighlightingColor[] colors) |
||||||
|
{ |
||||||
|
// We are build a HighlightedLine with 4 segments:
|
||||||
|
// A B C (top-level) and N nested within B.
|
||||||
|
// These are the integers controlling the generating process:
|
||||||
|
|
||||||
|
int aStart = GetNum(ref num, 5); // start offset of A
|
||||||
|
int aLength = GetNum(ref num, 2); // length of A
|
||||||
|
|
||||||
|
int bDistance = GetNum(ref num, 3); // distance from start of B to end of A
|
||||||
|
int bStart = aStart + aLength + bDistance; |
||||||
|
int nDistance = GetNum(ref num, 2); // distance from start of B to start of N, range 0-2
|
||||||
|
int nLength = GetNum(ref num, 2); // length of N
|
||||||
|
int bEndDistance = GetNum(ref num, 2); // distance from end of N to end of B
|
||||||
|
int bLength = nDistance + nLength + bEndDistance; |
||||||
|
|
||||||
|
int cDistance = GetNum(ref num, 3); // distance from end of B to start of C
|
||||||
|
int cStart = bStart + bLength + cDistance; |
||||||
|
int cLength = 1; |
||||||
|
Assert.AreEqual(0, num); |
||||||
|
|
||||||
|
var documentLine = document.GetLineByNumber(1); |
||||||
|
HighlightedLine line = new HighlightedLine(document, documentLine); |
||||||
|
line.Sections.Add(new HighlightedSection { Offset = aStart, Length = aLength, Color = colors[0] }); |
||||||
|
line.Sections.Add(new HighlightedSection { Offset = bStart, Length = bLength, Color = colors[1] }); |
||||||
|
line.Sections.Add(new HighlightedSection { Offset = bStart + nDistance, Length = nLength, Color = colors[2] }); |
||||||
|
line.Sections.Add(new HighlightedSection { Offset = cStart, Length = cLength, Color = colors[3] }); |
||||||
|
|
||||||
|
return line; |
||||||
|
} |
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Gets a number between 0 and max (inclusive)
|
||||||
|
/// </summary>
|
||||||
|
int GetNum(ref int num, int max) |
||||||
|
{ |
||||||
|
int result = num % (max+1); |
||||||
|
num = num / (max + 1); |
||||||
|
return result; |
||||||
|
} |
||||||
|
|
||||||
|
[Test] |
||||||
|
public void TestAll() |
||||||
|
{ |
||||||
|
for (int c1 = 0; c1 < combinations; c1++) { |
||||||
|
HighlightedLine line1 = BuildHighlightedLine(c1, additionalLineColors); |
||||||
|
for (int c2 = 0; c2 < combinations; c2++) { |
||||||
|
HighlightedLine line2 = BuildHighlightedLine(c2, baseLineColors); |
||||||
|
HighlightingColor[] expectedPerCharColors = new HighlightingColor[document.TextLength]; |
||||||
|
ApplyColors(expectedPerCharColors, line2); |
||||||
|
ApplyColors(expectedPerCharColors, line1); |
||||||
|
try { |
||||||
|
line2.MergeWith(line1); |
||||||
|
} catch (InvalidOperationException ex) { |
||||||
|
throw new InvalidOperationException(string.Format("Error for c1 = {0}, c2 = {1}", c1, c2), ex); |
||||||
|
} |
||||||
|
|
||||||
|
HighlightingColor[] actualPerCharColors = new HighlightingColor[document.TextLength]; |
||||||
|
ApplyColors(actualPerCharColors, line2); |
||||||
|
Assert.AreEqual(expectedPerCharColors, actualPerCharColors, string.Format("c1 = {0}, c2 = {1}", c1, c2)); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
void ApplyColors(HighlightingColor[] perCharColors, HighlightedLine line) |
||||||
|
{ |
||||||
|
foreach (var section in line.Sections) { |
||||||
|
for (int i = 0; i < section.Length; i++) { |
||||||
|
perCharColors[section.Offset + i] = section.Color; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
*/ |
||||||
|
#endregion
|
||||||
|
} |
||||||
|
} |
||||||
Loading…
Reference in new issue