private static string ConvertFromRunner(CacheTestMessage s) { var x = s.Test.Name; var lastdot = x.LastIndexOf('.'); if(lastdot == -1) return ""; string ret; if(s.Test.Runner == TestRunner.MSpec) { ret = "mspecMachine.Specifications.It " + x.Substring(0, lastdot) + "." + x.Substring(lastdot + 1, x.Length - lastdot - 1); } else if(s.Test.Runner == TestRunner.SimpleTesting) { ret = "Simple.Testing.ClientFramework.Specification " + x.Substring(0, lastdot) + "::" + x.Substring(lastdot + 1, x.Length - lastdot - 1) + "()"; } else if(x.Contains("(")) { ret = "System.Void " + x.Substring(0, lastdot) + "::" + RemoveParens(x.Substring(lastdot + 1, x.Length - lastdot - 1)) + "()"; } else { ret = "System.Void " + x.Substring(0, lastdot) + "::" + x.Substring(lastdot + 1, x.Length - lastdot - 1) + "()"; } return ret.Replace("+", "/"); }
private void onTestMessage(CacheTestMessage cacheTestMessage) { var controls = new List<string>(); controls.Add(_control.linkLabelTestDetails.Name); controls.Add(_control.linkLabelDebugTest.Name); //controls.Add(_control.linkLabelSystemMessages.Name); displayAndOrder(controls.ToArray()); }
private void onTestMessage(CacheTestMessage cacheTestMessage, bool isRunning) { var controls = new List<string>(); controls.Add(_control.linkLabelTestDetails.Name); controls.Add(_control.linkLabelDebugTest.Name); if (isRunning) controls.Add(_control.linkLabelCancelRun.Name); displayAndOrder(controls.ToArray()); }
public override void OnMessage(object message) { if (isType<RunStartedMessage>(message)) { clearRunnerTypeAnyItems(); } if (isType<BuildRunMessage>(message)) { if (((BuildRunMessage)message).Results.Errors.Length == 0) { var project = ((BuildRunMessage)message).Results.Project; // Make sure no errors remain in log lock (_buildMessages) { var toRemove = new List<KeyValuePair<long, CacheBuildMessage>>(); foreach (var item in _buildMessages) { if (project == null || item.Value.Project.Equals(project)) toRemove.Add(item); } var ids = new List<long>(); foreach (var item in toRemove) { ids.Add(item.Key); _buildMessages.Remove(item); } _dispatch("remove-builditems", new { ids = ids.ToArray() }); } } } if (isType<CacheMessages>(message)) { var cache = (CacheMessages)message; removeItems(cache); foreach (var error in cache.ErrorsToAdd) addItem("Build error", formatBuildResult(error), Color.Red, error); foreach (var failed in cache.FailedToAdd) addItem("Test failed", formatTestResult(failed), Color.Red, failed); foreach (var warning in cache.WarningsToAdd) addItem("Build warning", formatBuildResult(warning), Color.Black, warning); foreach (var ignored in cache.IgnoredToAdd) addItem("Test ignored", formatTestResult(ignored), Color.Black, ignored); } if (isType<LiveTestStatusMessage>(message)) { var liveStatus = (LiveTestStatusMessage)message; foreach (var test in liveStatus.FailedButNowPassingTests) { var testItem = new CacheTestMessage(test.Assembly, test.Test); removeTestItem((t) => isTheSameTestAs(testItem, t)); } foreach (var test in liveStatus.FailedTests) { var testItem = new CacheTestMessage(test.Assembly, test.Test); removeTestItem((t) => isTheSameTestAs(testItem, t)); addItem("Test failed", formatTestResult(testItem), Color.Red, testItem); } } }
public void Exec(vsCommandExecOption ExecuteOption, ref object VariantIn, ref object VariantOut, ref bool Handled) { var pos = new OnDemandRunFromCursorPosition(_applicationObject); var types = pos.FromCurrentPosition(); if (types.Tests.Count() == 1 || types.Members.Count() == 1) { var assembly = _getAssemblyFromProject(_applicationObject.ActiveDocument.ProjectItem.ContainingProject.FullName); if (assembly == null) return; var test = types.Tests.Count() > 0 ? types.Tests.ElementAt(0) : types.Members.ElementAt(0); var testMessage = new CacheTestMessage(assembly, new Messages.TestResult(Messages.TestRunner.Any, Messages.TestRunStatus.Passed, test)); _peek(testMessage); if (!_manualBuild() || _buildRunner.Build()) { var debugger = new DebugHandler(_applicationObject); _debug(testMessage); } } }
private string getText(CacheTestMessage message) { var stackTrace = new StringBuilder(); foreach (var line in message.Test.StackTrace) { if (File.Exists(line.File)) { stackTrace.AppendLine(string.Format("at {0} in {1}{2}:line {3}{4}", line.Method, LinkParser.TAG_START, line.File, line.LineNumber, LinkParser.TAG_END)); } else { var text = string.Format("at {0} in {1}{2}{3}", line.Method, LinkParser.TAG_START, line.File, LinkParser.TAG_END); if (text.Replace("<<Link>>", "").Replace("<</Link>>", "").Trim() != "at in") stackTrace.AppendLine(text); } } return string.Format( "Assembly: {0}{4}" + "Test: {1}{4}" + "Duration: " + getDuration(message) + "{4}{4}" + "Message:{4}{2}{4}{4}" + "Stack trace{4}{3}", message.Assembly, message.Test.DisplayName, message.Test.Message, stackTrace.ToString(), Environment.NewLine); }
public void Exec(vsCommandExecOption ExecuteOption, ref object VariantIn, ref object VariantOut, ref bool Handled) { var pos = new OnDemandRunFromCursorPosition(_applicationObject); Core.DebugLog.Debug.WriteDebug("Looking for test at current position"); var types = pos.FromCurrentPosition(); if (types.Tests.Count() == 1 || types.Members.Count() == 1) { Core.DebugLog.Debug.WriteDebug("Found 1 test"); Core.DebugLog.Debug.WriteDebug("Getting assembly for " + _applicationObject.ActiveDocument.ProjectItem.ContainingProject.FullName); var assembly = _getAssemblyFromProject(_applicationObject.ActiveDocument.ProjectItem.ContainingProject.FullName); if (assembly == null) return; var test = types.Tests.Count() > 0 ? types.Tests.ElementAt(0) : types.Members.ElementAt(0); var testMessage = new CacheTestMessage(assembly, new Messages.TestResult(Messages.TestRunner.Any, Messages.TestRunStatus.Passed, test)); Core.DebugLog.Debug.WriteDebug("Peeking at test message"); _peek(testMessage); if (!_manualBuild() || _buildRunner.Build()) { Core.DebugLog.Debug.WriteDebug("Starting debug"); _debug(testMessage); } } }
public void SetLastDebugSession(CacheTestMessage msg) { LastDebugSession = msg; }
public void AddFailed(CacheTestMessage failed) { _failedToAdd.Add(failed); }
private IStackLine getMatchingStackLine(CacheTestMessage testItem) { foreach (var line in testItem.Test.StackTrace) { if (line.Method.Equals(testItem.Test.Name)) return line; } var lastWithLine = testItem.Test.StackTrace.LastOrDefault(x => x.LineNumber > 0); if (lastWithLine != null) return lastWithLine; return null; }
private string formatTestResult(CacheTestMessage item) { return string.Format("{0} -> ({1}) {2}", item.Test.Status, item.Test.Runner.ToString(), item.Test.DisplayName); }
private new void Handle(LiveTestStatusMessage liveStatus) { if (!_isRunning) return; listViewFeedback.SuspendLayout(); var ofCount = liveStatus.TotalNumberOfTests > 0 ? string.Format(" of {0}", liveStatus.TotalNumberOfTests) : ""; var testName = liveStatus.CurrentTest; if (testName.Trim().Length > 0) testName += " in "; printMessage(new RunMessages(RunMessageType.Normal, string.Format("testing {3}{0} ({1}{2} tests completed)", Path.GetFileNameWithoutExtension(liveStatus.CurrentAssembly), liveStatus.TestsCompleted, ofCount, testName))); if (_showFailing) { foreach (var test in liveStatus.FailedButNowPassingTests) { var testItem = new CacheTestMessage(test.Assembly, test.Test); foreach (ListViewItem item in listViewFeedback.Items) { if (item.Tag.GetType() != typeof(CacheTestMessage)) continue; var itm = (CacheTestMessage)item.Tag; if (isTheSameTestAs(itm, testItem)) { item.Remove(); break; } } } object selected = null; if (listViewFeedback.SelectedItems.Count == 1) selected = listViewFeedback.SelectedItems[0].Tag; foreach (var test in liveStatus.FailedTests) { var testItem = new CacheTestMessage(test.Assembly, test.Test); ListViewItem toRemove = null; foreach (ListViewItem item in listViewFeedback.Items) { if (item.Tag.GetType() != typeof(CacheTestMessage)) continue; var itm = (CacheTestMessage)item.Tag; if (isTheSameTestAs(itm, testItem)) { toRemove = item; break; } } int index = toRemove == null ? 0 : toRemove.Index; if (toRemove != null) toRemove.Remove(); addFeedbackItem("Test failed", formatTestResult(testItem), Color.Red, testItem, selected, index); } } listViewFeedback.ResumeLayout(); }
public void AddFailed(CacheTestMessage failed) { _failedToAdd.Add(failed); }
public void Debug(CacheTestMessage test) { try { AutoTest.Core.DebugLog.Debug.WriteDebug("Starting debug session"); var found = false; var targetFramework = ""; found = setBreakpointFromMethod(test, ref targetFramework); if (!found) found = setBreakpointFromStacktrace(test, ref targetFramework); if (!found) return; var process = new AutoTestRunnerDebugProcess(); var assembly = test.Assembly; AutoTest.Core.DebugLog.Debug.WriteDebug("Starting process suspended"); var command = ""; var options = new RunOptions(); var runner = new RunnerOptions(getTestRunner(TestRunnerConverter.ToString(test.Test.Runner), test.Assembly, test.Test.Name)); var asm = new AssemblyOptions(test.Assembly); asm.AddTest(test.Test.Name); runner.AddAssembly(asm); options.AddTestRun(runner); AutoTest.Core.DebugLog.Debug.WriteDebug(string.Format("Starting {0}", command)); var processID = process.StartPaused(options, test.Test.Runner); try { AutoTest.Core.DebugLog.Debug.WriteDebug("Locating debugger for Visual Studio " + _application.Version); var dbg2 = (EnvDTE80.Debugger2)_application.Debugger; var trans = (EnvDTE80.Transport)dbg2.Transports.Item("Default"); EnvDTE80.Engine[] dbgeng; if (_application.Version == "9.0") { dbgeng = new EnvDTE80.Engine[] { trans.Engines.Item("Managed") }; } else { if (process.Framework == new Version(4, 0)) dbgeng = new EnvDTE80.Engine[] { trans.Engines.Item("Managed (v4.0)") }; else dbgeng = new EnvDTE80.Engine[] { trans.Engines.Item("Managed (v2.0, v1.1, v1.0)") }; } EnvDTE80.Process2 proc2 = null; foreach (EnvDTE80.Process2 proc in dbg2.GetProcesses(trans, null)) { if (proc.ProcessID == processID) { proc2 = proc; break; } } if (proc2 != null) proc2.Attach2(dbgeng); } catch (Exception ex) { AutoTest.Core.DebugLog.Debug.WriteException(ex); throw; } finally { AutoTest.Core.DebugLog.Debug.WriteDebug("Resuming process"); process.Resume(); } } catch (Exception ex) { AutoTest.Core.DebugLog.Debug.WriteException(ex); } }
private string getFixture(CacheTestMessage x) { if (x.Test.Runner == TestRunner.MSpec) return x.Test.Name; var end = x.Test.Name.LastIndexOf('.'); if (end == -1) return x.Test.Name; return x.Test.Name.Substring(0, end); }
private bool existsIn(CacheTestMessage[] cacheTestMessages, CacheTestMessage item) { var query = from i in cacheTestMessages where i.Assembly.Equals(item.Assembly) && i.Test.Runner.Equals(item.Test.Runner) && i.Test.Name.Equals(item.Test.Name) select i; return query.Count() > 0; }
public static bool CannotDebug(EnvDTE80.DTE2 app, CacheTestMessage test) { lock (_dirtyRealtimeDocuments) { clearOutdatedRealtimeChanges(""); var inRealtime = _dirtyRealtimeDocuments.Count != 0; if (inRealtime) { _client.PauseEngine(); System.Threading.Thread.Sleep(1000); app.ExecuteCommand("File.SaveAll"); _client.ResumeEngine(); } } return false; }
public void SetDataFrom(BinaryReader reader) { _errorsToAdd = new List<CacheBuildMessage>(); _errorsToRemove = new List<CacheBuildMessage>(); _warningsToAdd = new List<CacheBuildMessage>(); _warningsToRemove = new List<CacheBuildMessage>(); _failedToAdd = new List<CacheTestMessage>(); _ignoredToAdd = new List<CacheTestMessage>(); _testsToRemove = new List<CacheTestMessage>(); var errors = reader.ReadInt32(); for (int i = 0; i < errors; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _errorsToAdd.Add(message); } errors = reader.ReadInt32(); for (int i = 0; i < errors; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _errorsToRemove.Add(message); } var warnings = reader.ReadInt32(); for (var i = 0; i < warnings; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _warningsToAdd.Add(message); } warnings = reader.ReadInt32(); for (var i = 0; i < warnings; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _warningsToRemove.Add(message); } var failed = reader.ReadInt32(); for (var i = 0; i < failed; i++) { var result = new CacheTestMessage("", null); result.SetDataFrom(reader); _failedToAdd.Add(result); } var ignored = reader.ReadInt32(); for (var i = 0; i < ignored; i++) { var result = new CacheTestMessage("", null); result.SetDataFrom(reader); _ignoredToAdd.Add(result); } ignored = reader.ReadInt32(); for (var i = 0; i < ignored; i++) { var result = new CacheTestMessage("", null); result.SetDataFrom(reader); _testsToRemove.Add(result); } }
public void RemoveTest(CacheTestMessage ignored) { _testsToRemove.Add(ignored); }
public void AddIgnored(CacheTestMessage ignored) { _ignoredToAdd.Add(ignored); }
private bool setBreakpointFromMethod(CacheTestMessage test, ref string targetFramework) { AutoTest.Core.DebugLog.Debug.WriteDebug("Attempting to set breakpoint through test method for " + test.Test.Name); var breakpoint = _application.Debugger.Breakpoints.Add(test.Test.Name.Replace("+", ".")); if (breakpoint != null) return true; return false; }
public void SetDataFrom(BinaryReader reader) { _errorsToAdd = new List <CacheBuildMessage>(); _errorsToRemove = new List <CacheBuildMessage>(); _warningsToAdd = new List <CacheBuildMessage>(); _warningsToRemove = new List <CacheBuildMessage>(); _failedToAdd = new List <CacheTestMessage>(); _ignoredToAdd = new List <CacheTestMessage>(); _testsToRemove = new List <CacheTestMessage>(); var errors = reader.ReadInt32(); for (int i = 0; i < errors; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _errorsToAdd.Add(message); } errors = reader.ReadInt32(); for (int i = 0; i < errors; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _errorsToRemove.Add(message); } var warnings = reader.ReadInt32(); for (var i = 0; i < warnings; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _warningsToAdd.Add(message); } warnings = reader.ReadInt32(); for (var i = 0; i < warnings; i++) { var message = new CacheBuildMessage("", null); message.SetDataFrom(reader); _warningsToRemove.Add(message); } var failed = reader.ReadInt32(); for (var i = 0; i < failed; i++) { var result = new CacheTestMessage("", null); result.SetDataFrom(reader); _failedToAdd.Add(result); } var ignored = reader.ReadInt32(); for (var i = 0; i < ignored; i++) { var result = new CacheTestMessage("", null); result.SetDataFrom(reader); _ignoredToAdd.Add(result); } ignored = reader.ReadInt32(); for (var i = 0; i < ignored; i++) { var result = new CacheTestMessage("", null); result.SetDataFrom(reader); _testsToRemove.Add(result); } }
private bool setBreakpointFromStacktrace(CacheTestMessage test, ref string targetFramework) { // pull test name from full name var vsTestName = test.Test.Name.Replace("+", "."); var testName = vsTestName.Substring(vsTestName.LastIndexOf('.') + 1, vsTestName.Length - (vsTestName.LastIndexOf('.') + 1)); AutoTest.Core.DebugLog.Debug.WriteDebug("Attempting to set breakpoint through call stack for " + testName); foreach (var line in test.Test.StackTrace) { if (!File.Exists(line.File)) continue; AutoTest.Core.DebugLog.Debug.WriteDebug(string.Format("Locating file {0}", line.File)); var window = _application.OpenFile(EnvDTE.Constants.vsViewKindCode, line.File); if (breakOnFunctionElement(line.File, window.ProjectItem.FileCodeModel.CodeElements, testName)) { AutoTest.Core.DebugLog.Debug.WriteDebug("Found code file containing test and set breakpoint"); targetFramework = window.Project.Properties.Item("TargetFrameworkMoniker").Value.ToString(); AutoTest.Core.DebugLog.Debug.WriteDebug(string.Format("Target framework is {0}", targetFramework)); return true; } } return false; }
public DetailBuilder(CacheTestMessage message) { Text = getText(message); Links = getLinks(); }
private void goToTestItemReference(CacheTestMessage testItem) { if (testItem.Test.StackTrace.Length > 0) { // TODO: Add this again when type cache is faster if (CanGoToTypes) goToType(testItem.Assembly, testItem.Test.Name); else goToReference(testItem.Test.StackTrace[0].File, testItem.Test.StackTrace[0].LineNumber, 0); } }
public void RemoveTest(CacheTestMessage ignored) { _testsToRemove.Add(ignored); }
public bool isTheSameTestAs(CacheTestMessage original, CacheTestMessage item) { return original.Assembly.Equals(item.Assembly) && original.Test.Runner.Equals(item.Test.Runner) && original.Test.Name.Equals(item.Test.Name) && original.Test.DisplayName.Equals(item.Test.DisplayName); }
private string getDuration(CacheTestMessage message) { var duration = message.Test.TimeSpent; if (duration.TotalHours >= 1) return string.Format("{0} hours {1} minutes {2} seconds {3} milliseconds", duration.Hours, duration.Minutes, duration.Seconds, duration.Milliseconds); if (duration.TotalMinutes >= 1) return string.Format("{0} minutes {1} seconds {2} milliseconds", duration.Minutes, duration.Seconds, duration.Milliseconds); if (duration.TotalSeconds >= 1) return string.Format("{0} seconds {1} milliseconds", duration.Seconds, duration.Milliseconds); return string.Format("{0} milliseconds", duration.Milliseconds); }
private bool existsIn(IEnumerable<CacheTestMessage> cacheTestMessages, CacheTestMessage item) { var query = from i in cacheTestMessages where i.Assembly.Equals(item.Assembly) && i.Test.Runner.Equals(item.Test.Runner) && i.Test.Name.Equals(item.Test.Name) select i; return query.Any(); }
public void AddIgnored(CacheTestMessage ignored) { _ignoredToAdd.Add(ignored); }
private void goToTestItemReference(CacheTestMessage testItem) { if (testItem.Test.StackTrace.Length > 0) { var exactLine = getMatchingStackLine(testItem); if (exactLine != null) { goToReference(exactLine.File, exactLine.LineNumber, 0); return; } if (CanGoToTypes) if (goToType(testItem.Assembly, testItem.Test.Name)) return; } }
public void DebugTest(CacheTestMessage message) { var debugger = new DebugHandler(_application); debugger.Debug(message); LastDebugSession = message; }
public DebugTestArgs(CacheTestMessage test) { Test = test; }
private IStackLine getMatchingStackLine(CacheTestMessage testItem) { foreach (var line in testItem.Test.StackTrace) { if (line.Method.Equals(testItem.Test.Name)) return line; } return null; }