Browse Source
git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/branches/2.1@2324 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61shortcuts
5 changed files with 314 additions and 1 deletions
@ -0,0 +1,140 @@
@@ -0,0 +1,140 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Collections; |
||||
using System.Windows.Forms; |
||||
|
||||
namespace ICSharpCode.CodeCoverage |
||||
{ |
||||
/// <summary>
|
||||
/// Sorts the list view that contains code coverage sequence
|
||||
/// points.
|
||||
/// </summary>
|
||||
public class SequencePointListViewSorter : IComparer, IDisposable |
||||
{ |
||||
ListView listView; |
||||
int column = -1; |
||||
SortOrder sortOrder = SortOrder.None; |
||||
|
||||
const int VisitCountColumn = 0; |
||||
const int SequencePointLineColumn = 1; |
||||
const int SequencePointStartColumnColumn = 2; |
||||
const int SequencePointEndLineColumn = 3; |
||||
const int SequencePointEndColumnColumn = 4; |
||||
|
||||
public SequencePointListViewSorter(ListView listView) |
||||
{ |
||||
this.listView = listView; |
||||
listView.ListViewItemSorter = this; |
||||
listView.ColumnClick += ListViewColumnClick; |
||||
} |
||||
|
||||
public void Dispose() |
||||
{ |
||||
if (listView != null) { |
||||
listView.ColumnClick -= ListViewColumnClick; |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Compares two list view items and sorts them according
|
||||
/// to the currently sorted column.
|
||||
/// </summary>
|
||||
public int Compare(object x, object y) |
||||
{ |
||||
CodeCoverageSequencePoint lhs = null; |
||||
CodeCoverageSequencePoint rhs = null; |
||||
|
||||
ListViewItem item = x as ListViewItem; |
||||
if (item != null) { |
||||
lhs = item.Tag as CodeCoverageSequencePoint; |
||||
} |
||||
|
||||
item = y as ListViewItem; |
||||
if (item != null) { |
||||
rhs = item.Tag as CodeCoverageSequencePoint; |
||||
} |
||||
|
||||
if (lhs != null && rhs != null) { |
||||
return Compare(lhs, rhs); |
||||
} |
||||
return 0; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Sorts the list view by the specified column.
|
||||
/// </summary>
|
||||
public void Sort(int column) |
||||
{ |
||||
if (this.column == column) { |
||||
ToggleSortOrder(); |
||||
} else { |
||||
sortOrder = SortOrder.Ascending; |
||||
} |
||||
this.column = column; |
||||
listView.Sort(); |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Compares two code coverage sequence points based on the
|
||||
/// currently sorted column and sort order.
|
||||
/// </summary>
|
||||
int Compare(CodeCoverageSequencePoint x, CodeCoverageSequencePoint y) |
||||
{ |
||||
int result = 0; |
||||
switch (column) { |
||||
case VisitCountColumn: |
||||
result = x.VisitCount - y.VisitCount; |
||||
break; |
||||
case SequencePointLineColumn: |
||||
result = x.Line - y.Line; |
||||
break; |
||||
case SequencePointStartColumnColumn: |
||||
result = x.Column - y.Column; |
||||
break; |
||||
case SequencePointEndLineColumn: |
||||
result = x.EndLine - y.EndLine; |
||||
break; |
||||
case SequencePointEndColumnColumn: |
||||
result = x.EndColumn - y.EndColumn; |
||||
break; |
||||
} |
||||
|
||||
// Sort by secondary sort column?
|
||||
if (result == 0 && column != SequencePointLineColumn) { |
||||
result = x.Line - y.Line; |
||||
} |
||||
|
||||
if (sortOrder == SortOrder.Descending) { |
||||
return -result; |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// Switches the sort order from ascending to descending
|
||||
/// and vice versa.
|
||||
/// </summary>
|
||||
void ToggleSortOrder() |
||||
{ |
||||
if (sortOrder == SortOrder.Ascending) { |
||||
sortOrder = SortOrder.Descending; |
||||
} else { |
||||
sortOrder = SortOrder.Ascending; |
||||
} |
||||
} |
||||
|
||||
/// <summary>
|
||||
/// User clicked a column header so sort that column.
|
||||
/// </summary>
|
||||
void ListViewColumnClick(object source, ColumnClickEventArgs e) |
||||
{ |
||||
Sort(e.Column); |
||||
} |
||||
} |
||||
} |
||||
@ -0,0 +1,165 @@
@@ -0,0 +1,165 @@
|
||||
// <file>
|
||||
// <copyright see="prj:///doc/copyright.txt"/>
|
||||
// <license see="prj:///doc/license.txt"/>
|
||||
// <owner name="Matthew Ward" email="mrward@users.sourceforge.net"/>
|
||||
// <version>$Revision$</version>
|
||||
// </file>
|
||||
|
||||
using System; |
||||
using System.Windows.Forms; |
||||
using ICSharpCode.CodeCoverage; |
||||
using NUnit.Framework; |
||||
|
||||
namespace ICSharpCode.CodeCoverage.Tests |
||||
{ |
||||
/// <summary>
|
||||
/// Tests the sorting of the list view that shows
|
||||
/// the code coverage sequence points (visit counts, etc).
|
||||
/// Here we are not actually using the real list view, but
|
||||
/// just a list view which has the same number of columns.
|
||||
/// Eventually the sorter class will be replaced in
|
||||
/// SharpDevelop 3.0 with the generic sorting classes.
|
||||
/// </summary>
|
||||
[TestFixture] |
||||
public class ListViewSortingTestFixture |
||||
{ |
||||
ListView listView; |
||||
CodeCoverageSequencePoint firstSequencePoint; |
||||
CodeCoverageSequencePoint secondSequencePoint; |
||||
SequencePointListViewSorter sorter; |
||||
const int VisitCountColumn = 0; |
||||
const int SequencePointLineColumn = 1; |
||||
const int SequencePointStartColumnColumn = 2; |
||||
const int SequencePointEndLineColumn = 3; |
||||
const int SequencePointEndColumnColumn = 4; |
||||
|
||||
[SetUp] |
||||
public void SetUp() |
||||
{ |
||||
listView = new ListView(); |
||||
sorter = new SequencePointListViewSorter(listView); |
||||
|
||||
listView.Columns.Add("Visit Count"); |
||||
listView.Columns.Add("Line"); |
||||
listView.Columns.Add("Column"); |
||||
listView.Columns.Add("End Line"); |
||||
listView.Columns.Add("End Column"); |
||||
|
||||
// Add first sequence point.
|
||||
firstSequencePoint = new CodeCoverageSequencePoint(String.Empty, 1, 5, 1, 5, 10); |
||||
ListViewItem item = new ListViewItem("First"); |
||||
item.Tag = firstSequencePoint; |
||||
listView.Items.Add(item); |
||||
|
||||
// Add second sequence point.
|
||||
secondSequencePoint = new CodeCoverageSequencePoint(String.Empty, 0, 10, 2, 10, 8); |
||||
item = new ListViewItem("Second"); |
||||
item.Tag = secondSequencePoint; |
||||
listView.Items.Add(item); |
||||
|
||||
// Need to create the control's handle otherwise
|
||||
// the list view will not sort.
|
||||
listView.CreateControl(); |
||||
} |
||||
|
||||
[TearDown] |
||||
public void TearDown() |
||||
{ |
||||
listView.Dispose(); |
||||
} |
||||
|
||||
[Test] |
||||
public void InitialOrderSameAsOrderAdded() |
||||
{ |
||||
Assert.AreSame(firstSequencePoint, listView.Items[0].Tag); |
||||
Assert.AreSame(secondSequencePoint, listView.Items[1].Tag); |
||||
} |
||||
|
||||
[Test] |
||||
public void SortVisitCountColumn() |
||||
{ |
||||
sorter.Sort(VisitCountColumn); |
||||
Assert.AreSame(secondSequencePoint, listView.Items[0].Tag); |
||||
} |
||||
|
||||
[Test] |
||||
public void SortVisitCountColumnTwice() |
||||
{ |
||||
sorter.Sort(VisitCountColumn); |
||||
sorter.Sort(VisitCountColumn); |
||||
Assert.AreSame(firstSequencePoint, listView.Items[0].Tag); |
||||
} |
||||
|
||||
[Test] |
||||
public void SortLineColumnTwice() |
||||
{ |
||||
sorter.Sort(SequencePointLineColumn); |
||||
sorter.Sort(SequencePointLineColumn); |
||||
Assert.AreSame(secondSequencePoint, listView.Items[0].Tag); |
||||
} |
||||
|
||||
[Test] |
||||
public void SortStartColumnTwice() |
||||
{ |
||||
sorter.Sort(SequencePointStartColumnColumn); |
||||
sorter.Sort(SequencePointStartColumnColumn); |
||||
Assert.AreSame(secondSequencePoint, listView.Items[0].Tag); |
||||
} |
||||
|
||||
[Test] |
||||
public void SortEndLineTwice() |
||||
{ |
||||
sorter.Sort(SequencePointEndLineColumn); |
||||
sorter.Sort(SequencePointEndLineColumn); |
||||
Assert.AreSame(secondSequencePoint, listView.Items[0].Tag); |
||||
} |
||||
|
||||
[Test] |
||||
public void SortEndColumn() |
||||
{ |
||||
sorter.Sort(SequencePointEndColumnColumn); |
||||
Assert.AreSame(secondSequencePoint, listView.Items[0].Tag); |
||||
} |
||||
|
||||
[Test] |
||||
public void CompareNulls() |
||||
{ |
||||
Assert.AreEqual(0, sorter.Compare(null, null)); |
||||
} |
||||
|
||||
[Test] |
||||
public void CompareNullRhs() |
||||
{ |
||||
Assert.AreEqual(0, sorter.Compare(null, new ListViewItem())); |
||||
} |
||||
|
||||
[Test] |
||||
public void CompareTwoListViewItemsWithNoTags() |
||||
{ |
||||
sorter.Sort(VisitCountColumn); |
||||
Assert.AreEqual(0, sorter.Compare(new ListViewItem(), new ListViewItem())); |
||||
} |
||||
|
||||
[Test] |
||||
public void CompareRhsListViewItemWithNoTag() |
||||
{ |
||||
sorter.Sort(VisitCountColumn); |
||||
Assert.AreEqual(0, sorter.Compare(listView.Items[0], new ListViewItem())); |
||||
} |
||||
|
||||
[Test] |
||||
public void SecondarySortByLineWhenVisitCountSame() |
||||
{ |
||||
sorter.Sort(VisitCountColumn); |
||||
CodeCoverageSequencePoint pt1 = new CodeCoverageSequencePoint(String.Empty, 0, 1, 0, 0, 0); |
||||
CodeCoverageSequencePoint pt2 = new CodeCoverageSequencePoint(String.Empty, 0, 2, 0, 0, 0); |
||||
|
||||
ListViewItem item1 = new ListViewItem(); |
||||
item1.Tag = pt1; |
||||
ListViewItem item2 = new ListViewItem(); |
||||
item2.Tag = pt2; |
||||
|
||||
Assert.AreEqual(-1, sorter.Compare(item1, item2)); |
||||
} |
||||
} |
||||
} |
||||
Loading…
Reference in new issue