📄 nunitproject.cs
字号:
#region Copyright (c) 2002-2003, James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole, Philip A. Craig
/************************************************************************************
'
' Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
' Copyright 2000-2002 Philip A. Craig
'
' This software is provided 'as-is', without any express or implied warranty. In no
' event will the authors be held liable for any damages arising from the use of this
' software.
'
' Permission is granted to anyone to use this software for any purpose, including
' commercial applications, and to alter it and redistribute it freely, subject to the
' following restrictions:
'
' 1. The origin of this software must not be misrepresented; you must not claim that
' you wrote the original software. If you use this software in a product, an
' acknowledgment (see the following) in the product documentation is required.
'
' Portions Copyright 2002-2003 James W. Newkirk, Michael C. Two, Alexei A. Vorontsov, Charlie Poole
' or Copyright 2000-2002 Philip A. Craig
'
' 2. Altered source versions must be plainly marked as such, and must not be
' misrepresented as being the original software.
'
' 3. This notice may not be removed or altered from any source distribution.
'
'***********************************************************************************/
#endregion
using System;
using System.Collections;
using System.Xml;
using System.Xml.Schema;
using System.IO;
using System.Threading;
using NUnit.Core;
namespace NUnit.Util
{
/// <summary>
/// Types of changes that may occur to a config
/// </summary>
public enum ProjectChangeType
{
ActiveConfig,
AddConfig,
RemoveConfig,
UpdateConfig,
Other
}
/// <summary>
/// Arguments for a project event
/// </summary>
public class ProjectEventArgs : EventArgs
{
public ProjectChangeType type;
public string configName;
public ProjectEventArgs( ProjectChangeType type, string configName )
{
this.type = type;
this.configName = configName;
}
}
/// <summary>
/// Delegate to be used to handle project events
/// </summary>
public delegate void ProjectEventHandler( object sender, ProjectEventArgs e );
/// <summary>
/// Class that represents an NUnit test project
/// </summary>
public class NUnitProject
{
#region Static and instance variables
/// <summary>
/// Used to generate default names for projects
/// </summary>
private static int projectSeed = 0;
/// <summary>
/// The extension used for test projects
/// </summary>
private static readonly string nunitExtension = ".nunit";
/// <summary>
/// Path to the file storing this project
/// </summary>
protected string projectPath;
/// <summary>
/// Whether the project is dirty
/// </summary>
protected bool isDirty = false;
/// <summary>
/// Collection of configs for the project
/// </summary>
protected ProjectConfigCollection configs;
/// <summary>
/// The currently active configuration
/// </summary>
private ProjectConfig activeConfig;
/// <summary>
/// Flag indicating that this project is a
/// temporary wrapper for an assembly.
/// </summary>
private bool isAssemblyWrapper = false;
#endregion
#region Constructor
public NUnitProject( string projectPath )
{
this.projectPath = Path.GetFullPath( projectPath );
configs = new ProjectConfigCollection( this );
}
#endregion
#region Static Methods
// True if it's one of our project types
public static bool IsProjectFile( string path )
{
return Path.GetExtension( path ) == nunitExtension;
}
// True if it's ours or one we can load
public static bool CanLoadAsProject( string path )
{
return IsProjectFile( path ) ||
VSProject.IsProjectFile( path ) ||
VSProject.IsSolutionFile( path );
}
public static string GenerateProjectName()
{
return string.Format( "Project{0}", ++projectSeed );
}
public static NUnitProject EmptyProject()
{
return new NUnitProject( GenerateProjectName() );
}
public static NUnitProject NewProject()
{
NUnitProject project = EmptyProject();
project.Configs.Add( "Debug" );
project.Configs.Add( "Release" );
project.IsDirty = false;
return project;
}
/// <summary>
/// Return a test project by either loading it from
/// the supplied path, creating one from a VS file
/// or wrapping an assembly.
/// </summary>
public static NUnitProject LoadProject( string path )
{
if ( NUnitProject.IsProjectFile( path ) )
{
NUnitProject project = new NUnitProject( path );
project.Load();
return project;
}
else if ( VSProject.IsProjectFile( path ) )
return NUnitProject.FromVSProject( path );
else if ( VSProject.IsSolutionFile( path ) )
return NUnitProject.FromVSSolution( path );
else
return NUnitProject.FromAssembly( path );
}
/// <summary>
/// Creates a project to wrap a list of assemblies
/// </summary>
public static NUnitProject FromAssemblies( string[] assemblies )
{
// if only one assembly is passed in then the configuration file
// should follow the name of the assembly. This will only happen
// if the LoadAssembly method is called. Currently the console ui
// does not differentiate between having one or multiple assemblies
// passed in.
if ( assemblies.Length == 1)
return NUnitProject.FromAssembly(assemblies[0]);
NUnitProject project = NUnitProject.EmptyProject();
ProjectConfig config = new ProjectConfig( "Default" );
foreach( string assembly in assemblies )
{
string fullPath = Path.GetFullPath( assembly );
if ( !File.Exists( fullPath ) )
throw new FileNotFoundException( string.Format( "Assembly not found: {0}", fullPath ) );
config.Assemblies.Add( fullPath );
}
project.Configs.Add( config );
// TODO: Deduce application base, and provide a
// better value for loadpath and project path
// analagous to how new projects are handled
string basePath = Path.GetDirectoryName( Path.GetFullPath( assemblies[0] ) );
project.projectPath = Path.Combine( basePath, project.Name + ".nunit" );
project.IsDirty = true;
return project;
}
/// <summary>
/// Creates a project to wrap an assembly
/// </summary>
public static NUnitProject FromAssembly( string assemblyPath )
{
if ( !File.Exists( assemblyPath ) )
throw new FileNotFoundException( string.Format( "Assembly not found: {0}", assemblyPath ) );
string fullPath = Path.GetFullPath( assemblyPath );
NUnitProject project = new NUnitProject( fullPath );
ProjectConfig config = new ProjectConfig( "Default" );
config.Assemblies.Add( fullPath );
project.Configs.Add( config );
project.isAssemblyWrapper = true;
project.IsDirty = false;
return project;
}
public static NUnitProject FromVSProject( string vsProjectPath )
{
NUnitProject project = new NUnitProject( Path.GetFullPath( vsProjectPath ) );
VSProject vsProject = new VSProject( vsProjectPath );
project.Add( vsProject );
project.isDirty = false;
return project;
}
public static NUnitProject FromVSSolution( string solutionPath )
{
NUnitProject project = new NUnitProject( Path.GetFullPath( solutionPath ) );
string solutionDirectory = Path.GetDirectoryName( solutionPath );
StreamReader reader = new StreamReader( solutionPath );
char[] delims = { '=', ',' };
char[] trimchars = { ' ', '"' };
string line = reader.ReadLine();
while ( line != null )
{
if ( line.StartsWith( "Project" ) )
{
string[] parts = line.Split( delims );
string vsProjectPath = Path.Combine( solutionDirectory, parts[2].Trim(trimchars) );
if ( VSProject.IsProjectFile( vsProjectPath ) )
project.Add( new VSProject( vsProjectPath ) );
}
line = reader.ReadLine();
}
project.isDirty = false;
return project;
}
/// <summary>
/// Figure out the proper name to be used when saving a file.
/// </summary>
public static string ProjectPathFromFile( string path )
{
string fileName = Path.GetFileNameWithoutExtension( path ) + nunitExtension;
return Path.Combine( Path.GetDirectoryName( path ), fileName );
}
#endregion
#region Properties and Events
public static int ProjectSeed
{
get { return projectSeed; }
set { projectSeed = value; }
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -