📄 nunitform.cs
字号:
stopButton.Enabled = false;
if ( IsTestRunning )
{
DialogResult dialogResult = UserMessage.Ask(
"Do you want to cancel the running test?" );
if ( dialogResult == DialogResult.No )
stopButton.Enabled = true;
else
TestLoader.CancelTestRun();
}
}
/// <summary>
/// When a tree item is selected, display info pertaining
/// to that test unless a test is running.
/// </summary>
// private void OnSelectedTestChanged( UITestNode test )
// {
// if ( !IsTestRunning )
// {
// suiteName.Text = test.ShortName;
// statusBar.Initialize( test.CountTestCases() );
// }
// }
//
// private void OnCheckedTestChanged(System.Collections.IList tests)
// {
// if ( !IsTestRunning )
// {
// int count = 0;
// foreach (UITestNode test in tests)
// {
// count += test.CountTestCases();
// }
// statusBar.Initialize(count);
// }
// }
#endregion
#region Event Handlers for Test Load and Unload
private void OnTestProjectLoaded( object sender, TestProjectEventArgs e )
{
SetTitleBar( e.ProjectName );
projectMenu.Visible = true;
}
private void OnTestProjectUnloaded( object sender, TestProjectEventArgs e )
{
SetTitleBar( null );
projectMenu.Visible = false;
}
private void OnTestLoadStarting( object sender, TestEventArgs e )
{
runButton.Enabled = false;
}
private void OnTestUnloadStarting( object sender, TestEventArgs e )
{
runButton.Enabled = false;
}
private void OnReloadStarting( object sender, TestEventArgs e )
{
runButton.Enabled = false;
}
/// <summary>
/// A test suite has been loaded, so update
/// recent assemblies and display the tests in the UI
/// </summary>
private void OnTestLoaded( object sender, TestEventArgs e )
{
runButton.Enabled = true;
ClearTabs();
Version currentVersion = Assembly.GetExecutingAssembly().GetName().Version;
if ( TestLoader.FrameworkVersion == null )
{
UserMessage.Display( "This assembly was not built with the NUnit framework and contains no tests.", "Not a Test Assembly");
}
else if ( TestLoader.FrameworkVersion != currentVersion )
{
string msg = string.Format( "This assembly is using version {0} of the framework.\rThe {1} assembly is referencing version {2} of the framework.\r\rIf problems arise, rebuild the assembly referencing version {0}",
currentVersion, e.Name, TestLoader.FrameworkVersion, currentVersion );
UserMessage.Display( msg, "Incompatible nunit.framework.dll");
}
}
/// <summary>
/// A test suite has been unloaded, so clear the UI
/// and remove any references to the suite.
/// </summary>
private void OnTestUnloaded( object sender, TestEventArgs e )
{
suiteName.Text = null;
runButton.Enabled = false;
ClearTabs();
}
/// <summary>
/// The current test suite has changed in some way,
/// so update the info in the UI and clear the
/// test results, since they are no longer valid.
/// </summary>
private void OnTestChanged( object sender, TestEventArgs e )
{
if ( UserSettings.Options.ClearResults )
ClearTabs();
runButton.Enabled = true;
}
private void OnProjectLoadFailure( object sender, TestProjectEventArgs e )
{
UserMessage.DisplayFailure( e.Exception, "Project Not Loaded" );
UserSettings.RecentProjects.Remove( e.ProjectName );
runButton.Enabled = true;
}
/// <summary>
/// Event handler for assembly load faiulres. We do this via
/// an event since some errors may occur asynchronously.
/// </summary>
private void OnTestLoadFailure( object sender, TestEventArgs e )
{
UserMessage.DisplayFailure( e.Exception, "Assembly Not Loaded" );
if ( !IsTestLoaded )
OnTestUnloaded( sender, e );
else
runButton.Enabled = true;
}
#endregion
#region Handlers for Test Running Events
/// <summary>
/// A test run is starting, so prepare the UI
/// </summary>
// private void InvokeRunStarting( object sender, TestEventArgs e )
// {
// Invoke( new TestEventHandler( OnRunStarting ), new object[] { e } );
// }
private void OnRunStarting( object sender, TestEventArgs e )
{
suiteName.Text = e.Test.ShortName;
runButton.Enabled = false;
stopButton.Enabled = true;
ClearTabs();
}
/// <summary>
/// A test run has finished, so display the results
/// and re-enable the run button.
/// </summary>
private void InvokeRunFinished( object sender, TestEventArgs e )
{
Invoke( new TestEventHandler( OnRunFinished ), new object[] { e } );
}
private void OnRunFinished( object sender, TestEventArgs e )
{
stopButton.Enabled = false;
runButton.Enabled = false;
if ( e.Exception != null )
{
if ( ! ( e.Exception is System.Threading.ThreadAbortException ) )
UserMessage.DisplayFailure( e.Exception, "NUnit Test Run Failed" );
}
runButton.Enabled = true;
}
private void OnTestFinished(object sender, TestEventArgs args)
{
TestCaseResult result = (TestCaseResult) args.Result;
if(result.Executed)
{
if(result.IsFailure)
{
TestResultItem item = new TestResultItem(result);
string resultString = String.Format("{0}:{1}", result.Name, result.Message);
detailList.BeginUpdate();
detailList.Items.Insert(detailList.Items.Count, item);
detailList.EndUpdate();
}
}
else
{
notRunTree.Add( result );
}
}
private void OnSuiteFinished(object sender, TestEventArgs args)
{
TestSuiteResult suiteResult = (TestSuiteResult) args.Result;
if(!suiteResult.Executed)
notRunTree.Add( suiteResult );
}
private void OnTestException(object sender, TestEventArgs args)
{
string msg = string.Format(
"An unhandled exception was detected. Since it was most likely thrown on a separate thread, it may or may not have been caused by the current test.\r\r{0}",
args.Exception.ToString() );
UserMessage.DisplayFailure( msg, "Unhandled Exception" );
}
#endregion
#region Helper methods for modifying the UI display
/// <summary>
/// Clear info out of our four tabs and stack trace
/// </summary>
private void ClearTabs()
{
detailList.Items.Clear();
detailList.ContextMenu = null;
toolTip.SetToolTip( detailList, null );
notRunTree.Nodes.Clear();
stdErrTab.Clear();
stdOutTab.Clear();
stackTrace.Text = "";
}
/// <summary>
/// Set the title bar based on the loaded file or project
/// </summary>
/// <param name="fileName"></param>
private void SetTitleBar( string fileName )
{
this.Text = fileName == null
? "NUnit"
: string.Format( "{0} - NUnit", Path.GetFileName( fileName ) );
}
#endregion
#region DetailList Events
// Note: These items should all be moved to a separate user control
/// <summary>
/// When one of the detail failure items is selected, display
/// the stack trace and set up the tool tip for that item.
/// </summary>
private void detailList_SelectedIndexChanged(object sender, System.EventArgs e)
{
TestResultItem resultItem = (TestResultItem)detailList.SelectedItem;
//string stackTrace = resultItem.StackTrace;
stackTrace.Text = resultItem.StackTrace;
// toolTip.SetToolTip(detailList,resultItem.GetToolTipMessage());
detailList.ContextMenu = detailListContextMenu;
}
private void detailList_MeasureItem(object sender, System.Windows.Forms.MeasureItemEventArgs e)
{
TestResultItem item = (TestResultItem) detailList.Items[e.Index];
string s = item.ToString();
SizeF size = e.Graphics.MeasureString(item.GetMessage(), detailList.Font);
e.ItemHeight = (int)size.Height;
e.ItemWidth = (int)size.Width;
}
private void detailList_DrawItem(object sender, System.Windows.Forms.DrawItemEventArgs e)
{
if (e.Index >= 0)
{
e.DrawBackground();
TestResultItem item = (TestResultItem) detailList.Items[e.Index];
bool selected = ((e.State & DrawItemState.Selected) == DrawItemState.Selected) ? true : false;
Brush brush = selected ? Brushes.White : Brushes.Black;
e.Graphics.DrawString(item.GetMessage(),detailList.Font, brush, e.Bounds);
}
}
private void copyDetailMenuItem_Click(object sender, System.EventArgs e)
{
if ( detailList.SelectedItem != null )
Clipboard.SetDataObject( detailList.SelectedItem.ToString() );
}
private void detailList_MouseHover(object sender, System.EventArgs e)
{
if ( tipWindow != null ) tipWindow.Close();
if ( hoverIndex >= 0 && hoverIndex < detailList.Items.Count )
{
Rectangle itemRect = detailList.GetItemRectangle( hoverIndex );
string text = detailList.Items[hoverIndex].ToString();
tipWindow = new TipWindow( detailList, hoverIndex );
tipWindow.ItemBounds = itemRect;
tipWindow.TipText = text;
tipWindow.Expansion = TipWindow.ExpansionStyle.Both;
tipWindow.Overlay = true;
tipWindow.WantClicks = true;
tipWindow.Closed += new EventHandler( tipWindow_Closed );
tipWindow.Show();
}
}
private void tipWindow_Closed( object sender, System.EventArgs e )
{
tipWindow = null;
}
private void detailList_MouseLeave(object sender, System.EventArgs e)
{
hoverIndex = -1;
}
private void detailList_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
{
hoverIndex = detailList.IndexFromPoint( e.X, e.Y );
}
#endregion
private void testTree_SelectedTestsChanged(object sender, SelectedTestsChangedEventArgs e)
{
if (!IsTestRunning)
{
suiteName.Text = e.TestName;
statusBar.Initialize(e.TestCount);
}
}
private void helpMenuItem_Click(object sender, System.EventArgs e)
{
FileInfo exe = new FileInfo( Assembly.GetExecutingAssembly().Location );
// In normal install, exe is in bin directory, so we get parent
DirectoryInfo dir = exe.Directory.Parent;
// If running from bin\Release or bin\Debug, go down two more
if ( dir.Name == "bin" ) dir = dir.Parent.Parent;
string helpUrl = ConfigurationSettings.AppSettings["helpUrl"];
if ( helpUrl == null )
{
UriBuilder uri = new UriBuilder();
uri.Scheme = "file";
uri.Host = "localhost";
uri.Path = Path.Combine( dir.FullName, @"doc/index.html" );
helpUrl = uri.ToString();
}
System.Diagnostics.Process.Start( helpUrl );
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -