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);
                }
            }
        }
示例#8
0
 public void SetLastDebugSession(CacheTestMessage msg)
 {
     LastDebugSession = msg;
 }
示例#9
0
 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();
        }
示例#13
0
 public void AddFailed(CacheTestMessage failed)
 {
     _failedToAdd.Add(failed);
 }
示例#14
0
        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);
 }
示例#16
0
 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;
 }
示例#17
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;
 }
示例#18
0
        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);
            }
        }
示例#19
0
 public void RemoveTest(CacheTestMessage ignored) { _testsToRemove.Add(ignored); }  
示例#20
0
 public void AddIgnored(CacheTestMessage ignored) { _ignoredToAdd.Add(ignored); }
示例#21
0
 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;
 }
示例#22
0
        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);
            }
        }
示例#23
0
 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();
 }
示例#25
0
 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);
     }
 }
示例#26
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();
 }
示例#30
0
 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;
     }
 }
示例#32
0
 public void DebugTest(CacheTestMessage message)
 {
     var debugger = new DebugHandler(_application);
     debugger.Debug(message);
     LastDebugSession = message;
 }
 public DebugTestArgs(CacheTestMessage test) { Test = test; }
示例#34
0
		private IStackLine getMatchingStackLine(CacheTestMessage testItem)
		{
			foreach (var line in testItem.Test.StackTrace) {
				if (line.Method.Equals(testItem.Test.Name))
					return line;
			}
			return null;
		}