Browse Source

CodeCoverage ListView Color & Content

pull/67/head
Dragan 12 years ago
parent
commit
ec565a7d0b
  1. 4
      data/resources/StringResources.resx
  2. 1
      src/AddIns/Analysis/CodeCoverage/Project/CodeCoverage.csproj
  3. 11
      src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageBranchPoint.cs
  4. 48
      src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageControl.cs
  5. 19
      src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethodElement.cs
  6. 208
      src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageStringTextSource.cs

4
data/resources/StringResources.resx

@ -3316,8 +3316,8 @@ You can also choose to store the setting in the .user-file instead of the projec @@ -3316,8 +3316,8 @@ You can also choose to store the setting in the .user-file instead of the projec
<data name="ICSharpCode.CodeCoverage.EndLine" xml:space="preserve">
<value>End Line</value>
</data>
<data name="ICSharpCode.CodeCoverage.AllBranches" xml:space="preserve">
<value>All Branches</value>
<data name="ICSharpCode.CodeCoverage.Content" xml:space="preserve">
<value>Content</value>
</data>
<data name="ICSharpCode.CodeCoverage.NoCodeCoverageResultsGenerated" xml:space="preserve">
<value>No code coverage results file generated:</value>

1
src/AddIns/Analysis/CodeCoverage/Project/CodeCoverage.csproj

@ -83,6 +83,7 @@ @@ -83,6 +83,7 @@
<Compile Include="Src\CodeCoverageResults.cs" />
<Compile Include="Src\CodeCoverageMethod.cs" />
<Compile Include="Src\CodeCoverageSequencePoint.cs" />
<Compile Include="Src\CodeCoverageStringTextSource.cs" />
<Compile Include="Src\CodeCoverageTestRunner.cs" />
<Compile Include="Src\CodeCoverageTestRunnerContext.cs" />
<Compile Include="Src\CodeCoverageTestRunnerFactory.cs" />

11
src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageBranchPoint.cs

@ -1,11 +1,6 @@ @@ -1,11 +1,6 @@
/*
* Created by SharpDevelop.
* User: ddur
* Date: 26/11/2013
* Time: 02:58
*
* To change this template use Tools | Options | Coding | Edit Standard Headers.
*/
// Copyright (c) https://github.com/ddur
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
namespace ICSharpCode.CodeCoverage

48
src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageControl.cs

@ -4,9 +4,9 @@ @@ -4,9 +4,9 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Text.RegularExpressions;
using System.Windows.Forms;
using System.Windows.Forms.Integration;
using ICSharpCode.AvalonEdit;
using ICSharpCode.AvalonEdit.AddIn;
using ICSharpCode.AvalonEdit.Document;
@ -34,7 +34,7 @@ namespace ICSharpCode.CodeCoverage @@ -34,7 +34,7 @@ namespace ICSharpCode.CodeCoverage
ColumnHeader endLineColumnHeader;
ColumnHeader startColumnColumnHeader;
ColumnHeader endColumnColumnHeader;
ColumnHeader allBranchesColumnHeader;
ColumnHeader contentColumnHeader;
ToolStrip toolStrip;
bool showSourceCodePanel;
bool showVisitCountPanel = true;
@ -301,12 +301,34 @@ namespace ICSharpCode.CodeCoverage @@ -301,12 +301,34 @@ namespace ICSharpCode.CodeCoverage
item.SubItems.Add(sequencePoint.Column.ToString());
item.SubItems.Add(sequencePoint.EndLine.ToString());
item.SubItems.Add(sequencePoint.EndColumn.ToString());
item.SubItems.Add(sequencePoint.BranchCoverage.ToString());
item.SubItems.Add(sequencePoint.Content.Length>80?sequencePoint.Content.Substring(0,80):sequencePoint.Content);
item.BackColor = GetSequencePointBackColor(sequencePoint);
item.ForeColor = GetSequencePointForeColor(sequencePoint);
item.Tag = sequencePoint;
listView.Items.Add(item);
}
static System.Drawing.Color GetSequencePointBackColor(CodeCoverageSequencePoint sequencePoint) {
if (sequencePoint.VisitCount > 0) {
if ( sequencePoint.BranchCoverage == true ) {
return CodeCoverageOptions.VisitedColor;
}
return CodeCoverageOptions.PartVisitedColor;
}
return CodeCoverageOptions.NotVisitedColor;
}
static System.Drawing.Color GetSequencePointForeColor(CodeCoverageSequencePoint sequencePoint) {
if (sequencePoint.VisitCount > 0) {
if ( sequencePoint.BranchCoverage == true ) {
return CodeCoverageOptions.VisitedForeColor;
}
return CodeCoverageOptions.PartVisitedForeColor;
}
return CodeCoverageOptions.NotVisitedForeColor;
}
void ListViewItemActivate(object sender, EventArgs e)
{
if (listView.SelectedItems.Count > 0) {
@ -394,37 +416,39 @@ namespace ICSharpCode.CodeCoverage @@ -394,37 +416,39 @@ namespace ICSharpCode.CodeCoverage
listView.FullRowSelect = true;
listView.HideSelection = false;
listView.ItemActivate += ListViewItemActivate;
listView.Font = Core.WinForms.WinFormsResourceService.DefaultMonospacedFont;
visitCountColumnHeader = new ColumnHeader();
visitCountColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.VisitCount}");
visitCountColumnHeader.Width = 80;
visitCountColumnHeader.Width = -2;
startLineColumnHeader = new ColumnHeader();
startLineColumnHeader.Text = StringParser.Parse("${res:Global.TextLine}");
startLineColumnHeader.Width = 80;
startLineColumnHeader.Width = -2;
startColumnColumnHeader = new ColumnHeader();
startColumnColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.Column}");
startColumnColumnHeader.Width = 80;
startColumnColumnHeader.Width = -2;
endLineColumnHeader = new ColumnHeader();
endLineColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.EndLine}");
endLineColumnHeader.Width = 80;
endLineColumnHeader.Width = -2;
endColumnColumnHeader = new ColumnHeader();
endColumnColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.EndColumn}");
endColumnColumnHeader.Width = 80;
endColumnColumnHeader.Width = -2;
allBranchesColumnHeader = new ColumnHeader();
allBranchesColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.AllBranches}");
allBranchesColumnHeader.Width = 80;
contentColumnHeader = new ColumnHeader();
contentColumnHeader.Text = StringParser.Parse("${res:ICSharpCode.CodeCoverage.Content}");
contentColumnHeader.Width = 500;
listView.Columns.AddRange(new ColumnHeader[] {visitCountColumnHeader,
startLineColumnHeader,
startColumnColumnHeader,
endLineColumnHeader,
endColumnColumnHeader,
allBranchesColumnHeader
contentColumnHeader
});
// Create custom list view sorter.

19
src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageMethodElement.cs

@ -10,9 +10,6 @@ using System.Text; @@ -10,9 +10,6 @@ using System.Text;
using System.Text.RegularExpressions;
using System.Xml.Linq;
using ICSharpCode.SharpDevelop;
using ICSharpCode.SharpDevelop.Editor;
namespace ICSharpCode.CodeCoverage
{
public class CodeCoverageMethodElement
@ -38,7 +35,7 @@ namespace ICSharpCode.CodeCoverage @@ -38,7 +35,7 @@ namespace ICSharpCode.CodeCoverage
Init();
}
private static string cacheFileName = String.Empty;
private static IDocument cacheDocument = null;
private static CodeCoverageStringTextSource cacheDocument = null;
public string FileID { get; private set; }
public string FileName { get; private set; }
@ -80,8 +77,7 @@ namespace ICSharpCode.CodeCoverage @@ -80,8 +77,7 @@ namespace ICSharpCode.CodeCoverage
try {
stream.Position = 0;
string textSource = ICSharpCode.AvalonEdit.Utils.FileReader.ReadFileContent(stream, Encoding.Default);
ITextBuffer textBuffer = new StringTextBuffer (textSource);
cacheDocument = new ReadOnlyDocument(textBuffer);
cacheDocument = new CodeCoverageStringTextSource(textSource);
} catch {}
}
} catch {}
@ -120,14 +116,15 @@ namespace ICSharpCode.CodeCoverage @@ -120,14 +116,15 @@ namespace ICSharpCode.CodeCoverage
sp.EndColumn = (int)GetDecimalAttributeValue(xSPoint.Attribute("ec"));
sp.VisitCount = (int)GetDecimalAttributeValue(xSPoint.Attribute("vc"));
if (cacheFileName == sp.Document && cacheDocument != null) {
int startOffset = cacheDocument.PositionToOffset(sp.Line, sp.Column);
int finalOffset = cacheDocument.PositionToOffset(sp.EndLine, sp.EndColumn);
// normalise white-space
sp.Content = Regex.Replace(cacheDocument.GetText(startOffset, finalOffset - startOffset), @"\s+", " ");
sp.Content = cacheDocument.GetText(sp);
if (sp.Line != sp.EndLine) {
sp.Content = Regex.Replace (sp.Content, @"\s+", " ");
}
sp.Length = Regex.Replace (sp.Content, @"\s", "").Length; // ignore white-space for coverage%
} else {
sp.Content = String.Empty;
sp.Length = 0;
}
sp.Length = sp.Content.Length;
sp.Offset = (int)GetDecimalAttributeValue(xSPoint.Attribute("offset"));
sp.BranchCoverage = true;

208
src/AddIns/Analysis/CodeCoverage/Project/Src/CodeCoverageStringTextSource.cs

@ -0,0 +1,208 @@ @@ -0,0 +1,208 @@
// Copyright (c) https://github.com/ddur
// This code is distributed under the GNU LGPL (for details please see \doc\license.txt)
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
namespace ICSharpCode.CodeCoverage
{
/// <summary>StringTextSource (ReadOnly)
/// <remarks>Line and column counting starts at 1.</remarks>
/// <remarks>IDocument/ITextBuffer/ITextSource fails returning single char "{"?</remarks>
/// </summary>
public class CodeCoverageStringTextSource
{
private readonly string textSource;
private struct lineInfo {
public int Offset;
public int Length;
}
private readonly lineInfo[] lines;
public CodeCoverageStringTextSource(string source)
{
this.textSource = source.Clone() as string; // disconnect from source
List<lineInfo> lineInfoList = new List<lineInfo>();
int offset = 0;
int counter = 0;
bool nl = false;
bool cr = false;
bool lf = false;
lineInfo sl;
foreach ( short ch in textSource ) {
switch (ch) {
case 13:
if (cr||lf) {
nl = true;
} else {
cr = true;
}
break;
case 10:
if (lf) {
nl = true;
} else {
lf = true;
}
break;
default:
if (cr||lf) {
nl = true;
}
break;
}
if (nl) {
sl = new lineInfo();
sl.Offset = offset;
sl.Length = counter - offset;
lineInfoList.Add(sl);
offset = counter;
cr = false;
lf = false;
nl = false;
}
++counter;
}
sl = new lineInfo();
sl.Offset = offset;
sl.Length = counter - offset;
lineInfoList.Add(sl);
lines = lineInfoList.ToArray();
}
/// <summary>Return text/source using SequencePoint line/col info
/// </summary>
/// <param name="sp"></param>
/// <returns></returns>
public string GetText(CodeCoverageSequencePoint sp) {
return this.GetText(sp.Line, sp.Column, sp.EndLine, sp.EndColumn );
}
/// <summary>Return text at Line/Column/EndLine/EndColumn position
/// <remarks>Line and Column counting starts at 1.</remarks>
/// </summary>
/// <param name="Line"></param>
/// <param name="Column"></param>
/// <param name="EndLine"></param>
/// <param name="EndColumn"></param>
/// <returns></returns>
public string GetText(int Line, int Column, int EndLine, int EndColumn) {
StringBuilder text = new StringBuilder();
string line;
bool argOutOfRange;
if (Line==EndLine) {
#region One line request
line = GetLine(Line);
Debug.Assert(!(Column < 1), "Column < 1");
Debug.Assert(!(Column > EndColumn), "Column > EndColumn");
Debug.Assert(!(EndColumn > line.Length), "EndColumn > line.Length");
argOutOfRange = Column < 1
|| Column > EndColumn
|| EndColumn > line.Length;
if (!argOutOfRange) {
text.Append(line.Substring(Column-1,EndColumn-Column));
}
#endregion
} else if (Line<EndLine) {
#region Multi-line request
#region First line
line = GetLine(Line);
Debug.Assert(!(Column < 1), "Column < 1");
Debug.Assert(!(Column > line.Length), "Column > line.Length");
argOutOfRange = Column < 1
|| Column > line.Length;
if (!argOutOfRange) {
text.Append(line.Substring(Column-1));
}
#endregion
#region More than two lines
for ( int lineIndex = Line+1; lineIndex < EndLine; lineIndex++ ) {
text.Append ( GetLine ( lineIndex ) );
}
#endregion
#region Last line
line = GetLine(EndLine);
Debug.Assert(!(EndColumn < 1), "EndColumn < 1");
Debug.Assert(!(EndColumn > line.Length), "EndColumn > line.Length");
argOutOfRange = EndColumn < 1
|| EndColumn > line.Length;
if (!argOutOfRange) {
text.Append(line.Substring(0,EndColumn));
}
#endregion
#endregion
} else {
Debug.Fail("Line > EndLine");
}
return text.ToString();
}
/// <summary>Return SequencePoint enumerated line
/// </summary>
/// <param name="lineNr"></param>
/// <returns></returns>
public string GetLine ( int LineNo ) {
string retString = String.Empty;
if ( LineNo > 0 && LineNo <= lines.Length ) {
lineInfo lineInfo = lines[LineNo-1];
retString = textSource.Substring(lineInfo.Offset, lineInfo.Length);
} else {
Debug.Fail( "Line number out of range" );
}
return retString;
}
public static string IndentTabs ( string ToIndent, int TabSize ) {
string retString = ToIndent;
if ( ToIndent.Contains ( "\t" ) ) {
int counter = 0;
int remains = 0;
int repeat = 0;
char prevChar = char.MinValue;
StringBuilder indented = new StringBuilder();
foreach ( char currChar in ToIndent ) {
if ( currChar == '\t' ) {
remains = counter % TabSize;
repeat = remains == 0 ? TabSize : remains;
indented.Append( ' ', repeat );
} else {
indented.Append ( currChar, 1 );
if ( char.IsLowSurrogate(currChar)
&& char.IsHighSurrogate(prevChar)
) { --counter; }
}
prevChar = currChar;
++counter;
}
retString = indented.ToString();
}
return retString;
}
}
}
Loading…
Cancel
Save