Skip to content

Commit 95b0fe4

Browse files
ThunderFrameretailcoder
authored andcommitted
Adds Unit Test support for Visio, clipboard formats for Test Explorer (#1595)
* Adds RTF and XML Spreadsheet data formats Still need to RTF-escape content values Temporary Fix in InspectionResultBase, for instances of unsaved filename boom. * XML Spreadsheet builds from XMLWriter instead of StringBuilder Adds ColumnInfos helper classes, for specifying and formatting column titles, not yet fully implemented. * Improves Clipboard export formatter Adds a DocumentName property to QualifiedModuleName, adds DocumentName to column output. * adds notes and placeholder for Outllook's Application.Run alternative not implemented - need to write to events in the ThisOutlookSession before this will work. * Adds columns to inspection results, and adds column titles changes to Column alignment, font weights, colspans * improvements to InspectionResults Clipboard Refines DocumentName of QualifiedModule * Adds DisplayName and Title for Projects and Components ProjectDisplayName eg. `Book1` ProjectTitle eg. `VBA Project (Book1) ComponentDisplayName eg. `Home` ComponentTitle eg. `shtHome (Home)` * corrects ComponentTitle behaviour still needs testing across multiple hosts. * removes temporary comments * adds DisplayName to extra QualifiedModuleName constructor was out of Sync with Next, so had to add these fields to the newly discovered ctor. * Adds Unit Test support for Visio, clipboard formats for Test Explorer Adds Start and End Times for Unit Test results (only viewable in Clipboard exports) Title and Headings aren't yet localized. No plain-text clipboard export format yet
1 parent 90b2767 commit 95b0fe4

File tree

8 files changed

+109
-17
lines changed

8 files changed

+109
-17
lines changed

RetailCoder.VBE/UI/CodeInspections/InspectionResultsViewModel.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ private void ExecuteCopyResultsCommand(object parameter)
373373
? RubberduckUI.CodeInspections_NumberOfIssuesFound_Singular
374374
: RubberduckUI.CodeInspections_NumberOfIssuesFound_Plural;
375375

376-
var title = string.Format(resource, DateTime.Now.ToString(CultureInfo.InstalledUICulture), _results.Count);
376+
var title = string.Format(resource, DateTime.Now.ToString(CultureInfo.InvariantCulture), _results.Count);
377377

378378
var textResults = title + Environment.NewLine + string.Join("", _results.Select(result => result.ToString() + Environment.NewLine).ToArray());
379379
var csvResults = ExportFormatter.Csv(aResults, title,ColumnInfos);

RetailCoder.VBE/UI/UnitTesting/TestExplorerViewModel.cs

Lines changed: 41 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
using System;
22
using System.Diagnostics;
3+
using System.Globalization;
4+
using System.IO;
35
using System.Linq;
6+
using System.Windows;
47
using System.Windows.Input;
58
using Microsoft.Vbe.Interop;
69
using Rubberduck.Common;
@@ -305,20 +308,49 @@ private void ExecuteSelectedTestCommand(object obj)
305308

306309
private void ExecuteCopyResultsCommand(object parameter)
307310
{
308-
var results = string.Join(Environment.NewLine, _model.LastRun.Select(test => test.ToString()));
311+
const string XML_SPREADSHEET_DATA_FORMAT = "XML Spreadsheet";
309312

310-
var passed = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Succeeded) + " " + TestOutcome.Succeeded;
311-
var failed = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Failed) + " " + TestOutcome.Failed;
312-
var inconclusive = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Inconclusive) + " " + TestOutcome.Inconclusive;
313-
var ignored = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Ignored) + " " + TestOutcome.Ignored;
313+
ColumnInfo[] ColumnInfos = { new ColumnInfo("Project"), new ColumnInfo("Component"), new ColumnInfo("Method"), new ColumnInfo("Outcome"), new ColumnInfo("Output"),
314+
new ColumnInfo("Start Time"), new ColumnInfo("End Time"), new ColumnInfo("Duration (ms)", hAlignment.Right) };
314315

315-
var duration = RubberduckUI.UnitTest_TotalDuration + " - " + TotalDuration;
316+
var aResults = _model.Tests.Select(test => test.ToArray()).ToArray();
316317

317-
var resource = "Rubberduck Unit Tests - {0}{6}{1} | {2} | {3} | {4}{6}{5} ms{6}";
318-
var text = string.Format(resource, DateTime.Now, passed, failed, inconclusive, ignored, duration, Environment.NewLine) + results;
318+
var resource = "Rubberduck Test Results - {0}";
319+
var title = string.Format(resource, DateTime.Now.ToString(CultureInfo.InvariantCulture));
319320

320-
_clipboard.Write(text);
321+
//var textResults = title + Environment.NewLine + string.Join("", _results.Select(result => result.ToString() + Environment.NewLine).ToArray());
322+
var csvResults = ExportFormatter.Csv(aResults, title, ColumnInfos);
323+
var htmlResults = ExportFormatter.HtmlClipboardFragment(aResults, title, ColumnInfos);
324+
var rtfResults = ExportFormatter.RTF(aResults, title);
325+
326+
MemoryStream strm1 = ExportFormatter.XmlSpreadsheetNew(aResults, title, ColumnInfos);
327+
//Add the formats from richest formatting to least formatting
328+
_clipboard.AppendStream(DataFormats.GetDataFormat(XML_SPREADSHEET_DATA_FORMAT).Name, strm1);
329+
_clipboard.AppendString(DataFormats.Rtf, rtfResults);
330+
_clipboard.AppendString(DataFormats.Html, htmlResults);
331+
_clipboard.AppendString(DataFormats.CommaSeparatedValue, csvResults);
332+
//_clipboard.AppendString(DataFormats.UnicodeText, textResults);
333+
334+
_clipboard.Flush();
321335
}
336+
337+
//KEEP THIS, AS IT MAKES FOR THE BASIS OF A USEFUL *SUMMARY* REPORT
338+
//private void ExecuteCopyResultsCommand(object parameter)
339+
//{
340+
// var results = string.Join(Environment.NewLine, _model.LastRun.Select(test => test.ToString()));
341+
342+
// var passed = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Succeeded) + " " + TestOutcome.Succeeded;
343+
// var failed = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Failed) + " " + TestOutcome.Failed;
344+
// var inconclusive = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Inconclusive) + " " + TestOutcome.Inconclusive;
345+
// var ignored = _model.LastRun.Count(test => test.Result.Outcome == TestOutcome.Ignored) + " " + TestOutcome.Ignored;
346+
347+
// var duration = RubberduckUI.UnitTest_TotalDuration + " - " + TotalDuration;
348+
349+
// var resource = "Rubberduck Unit Tests - {0}{6}{1} | {2} | {3} | {4}{6}{5} ms{6}";
350+
// var text = string.Format(resource, DateTime.Now, passed, failed, inconclusive, ignored, duration, Environment.NewLine) + results;
351+
352+
// _clipboard.Write(text);
353+
//}
322354

323355
public void Dispose()
324356
{

RetailCoder.VBE/UnitTesting/TestMethod.cs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Globalization;
34
using System.Linq;
45
using System.Runtime.InteropServices;
56
using Microsoft.Vbe.Interop;
@@ -41,6 +42,7 @@ public void Run()
4142

4243
AssertCompletedEventArgs result;
4344
var duration = new TimeSpan();
45+
var startTime = DateTime.Now;
4446
try
4547
{
4648
AssertHandler.OnAssertCompleted += HandleAssertCompleted;
@@ -53,13 +55,13 @@ public void Run()
5355
{
5456
result = new AssertCompletedEventArgs(TestOutcome.Inconclusive, "Test raised an error. " + exception.Message);
5557
}
56-
57-
UpdateResult(result.Outcome, result.Message, duration.Milliseconds);
58+
var endTime = DateTime.Now;
59+
UpdateResult(result.Outcome, result.Message, duration.Milliseconds, startTime, endTime);
5860
}
5961

60-
public void UpdateResult(TestOutcome outcome, string message = "", long duration = 0)
62+
public void UpdateResult(TestOutcome outcome, string message = "", long duration = 0, DateTime? startTime = null, DateTime? endTime = null)
6163
{
62-
Result.SetValues(outcome, message, duration);
64+
Result.SetValues(outcome, message, duration, startTime, endTime);
6365
OnPropertyChanged("Result");
6466
}
6567

@@ -108,6 +110,12 @@ public NavigateCodeEventArgs GetNavigationArgs()
108110
}
109111
}
110112

113+
public object[] ToArray()
114+
{
115+
return new object[] { QualifiedMemberName.QualifiedModuleName.ProjectTitle, QualifiedMemberName.QualifiedModuleName.ComponentTitle, QualifiedMemberName.MemberName,
116+
_result.Outcome.ToString(), _result.Output, _result.StartTime.ToString(CultureInfo.InvariantCulture), _result.EndTime.ToString(CultureInfo.InvariantCulture), _result.Duration };
117+
}
118+
111119
public bool Equals(TestMethod other)
112120
{
113121
return QualifiedMemberName.Equals(other.QualifiedMemberName);

RetailCoder.VBE/UnitTesting/TestResult.cs

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
1-
namespace Rubberduck.UnitTesting
1+
using System;
2+
3+
namespace Rubberduck.UnitTesting
24
{
35
public class TestResult
46
{
5-
public void SetValues(TestOutcome outcome, string output = "", long duration = 0)
7+
public void SetValues(TestOutcome outcome, string output = "", long duration = 0, DateTime? startTime = null, DateTime? endTime = null)
68
{
79
_outcome = outcome;
810
_output = output;
911
_duration = duration;
12+
_startTime = startTime ?? DateTime.Now;
13+
_endTime = endTime ?? DateTime.Now;
1014
}
1115

1216
public void SetDuration(long duration)
@@ -19,11 +23,19 @@ public TestResult(TestOutcome outcome, string output = "", long duration = 0)
1923
_outcome = outcome;
2024
_output = output;
2125
_duration = duration;
26+
_startTime = DateTime.Now;
27+
_endTime = DateTime.Now;
2228
}
2329

2430
private long _duration;
2531
public long Duration { get { return _duration; } }
2632

33+
private DateTime _startTime;
34+
public DateTime StartTime { get { return _startTime; } }
35+
36+
private DateTime _endTime;
37+
public DateTime EndTime { get { return _endTime; } }
38+
2739
private TestOutcome _outcome;
2840
public TestOutcome Outcome { get { return _outcome; } }
2941

Rubberduck.VBEEditor/Extensions/VbeExtensions.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ public static IHostApplication HostApplication(this VBE vbe)
6868
return new OutlookApp();
6969
case "Microsoft Publisher":
7070
return new PublisherApp();
71+
case "Microsoft Visio":
72+
return new VisioApp();
7173
case "AutoCAD":
7274
return new AutoCADApp();
7375
case "CorelDRAW":
@@ -94,7 +96,9 @@ public static IHostApplication HostApplication(this VBE vbe)
9496
return new OutlookApp();
9597
case "Publisher":
9698
return new PublisherApp();
97-
case "AutoCAD":
99+
case "Visio":
100+
return new VisioApp();
101+
case "AutoCAD":
98102
return new AutoCADApp();
99103
case "CorelDRAW":
100104
return new CorelDRAWApp(vbe);

Rubberduck.VBEEditor/Rubberduck.VBEditor.csproj

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,11 @@
6868
<HintPath>..\libs\Corel.GraphicsSuite.Interop.CorelDRAW.dll</HintPath>
6969
<EmbedInteropTypes>True</EmbedInteropTypes>
7070
</Reference>
71+
<Reference Include="Microsoft.Office.Interop.Visio, Version=15.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c, processorArchitecture=MSIL">
72+
<SpecificVersion>False</SpecificVersion>
73+
<EmbedInteropTypes>True</EmbedInteropTypes>
74+
<HintPath>..\libs\Microsoft.Office.Interop.Visio.dll</HintPath>
75+
</Reference>
7176
<Reference Include="Microsoft.Office.Interop.Word, Version=12.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c">
7277
<SpecificVersion>False</SpecificVersion>
7378
<EmbedInteropTypes>True</EmbedInteropTypes>
@@ -116,6 +121,7 @@
116121
<Compile Include="VBEHost\OutlookApp.cs" />
117122
<Compile Include="VBEHost\PowerPointApp.cs" />
118123
<Compile Include="VBEHost\PublisherApp.cs" />
124+
<Compile Include="VBEHost\Visio.cs" />
119125
<Compile Include="VBEHost\WordApp.cs" />
120126
<Compile Include="VBEHost\AutoCADApp.cs" />
121127
<Compile Include="Extensions\VbProjectExtensions.cs" />

Rubberduck.VBEEditor/VBEHost/Visio.cs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using Microsoft.Office.Interop.Visio;
2+
using Microsoft.Vbe.Interop;
3+
4+
namespace Rubberduck.VBEditor.VBEHost
5+
{
6+
public class VisioApp : HostApplicationBase<Microsoft.Office.Interop.Visio.Application>
7+
{
8+
public VisioApp() : base("Visio") { }
9+
public VisioApp(VBE vbe) : base(vbe, "Visio") { }
10+
11+
public override void Run(QualifiedMemberName qualifiedMemberName)
12+
{
13+
try
14+
{
15+
Document doc = Application.Documents[qualifiedMemberName.QualifiedModuleName.ProjectDisplayName];
16+
var call = GenerateMethodCall(qualifiedMemberName);
17+
doc.ExecuteLine(call);
18+
}
19+
catch
20+
{
21+
//Failed to run
22+
}
23+
}
24+
protected virtual string GenerateMethodCall(QualifiedMemberName qualifiedMemberName)
25+
{
26+
var moduleName = qualifiedMemberName.QualifiedModuleName.Component.Name;
27+
return string.Concat(moduleName, ".", qualifiedMemberName.MemberName);
28+
}
29+
}
30+
}
644 KB
Binary file not shown.

0 commit comments

Comments
 (0)