2010-03-17 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / nunit24 / NUnitCore / core / TestSuiteBuilder.cs
1 // ****************************************************************\r
2 // This is free software licensed under the NUnit license. You\r
3 // may obtain a copy of the license as well as information regarding\r
4 // copyright ownership at http://nunit.org/?p=license&r=2.4.\r
5 // ****************************************************************\r
6 \r
7 namespace NUnit.Core\r
8 {\r
9         using NUnit.Core.Builders;\r
10         using System.Collections;\r
11         using System.Reflection;\r
12 \r
13         /// <summary>\r
14         /// This is the master suite builder for NUnit. It builds a test suite from\r
15         /// one or more assemblies using a list of internal and external suite builders \r
16         /// to create fixtures from the qualified types in each assembly. It implements\r
17         /// the ISuiteBuilder interface itself, allowing it to be used by other classes\r
18         /// for queries and suite construction.\r
19         /// </summary>D:\Dev\NUnit\nunit20\src\NUnitFramework\core\TestBuilderAttribute.cs\r
20         public class TestSuiteBuilder\r
21         {\r
22                 #region Instance Variables\r
23 \r
24                 private ArrayList builders = new ArrayList();\r
25 \r
26                 #endregion\r
27 \r
28                 #region Properties\r
29                 public IList Assemblies\r
30                 {\r
31                         get \r
32                         {\r
33                                 ArrayList assemblies = new ArrayList();\r
34                                 foreach( TestAssemblyBuilder builder in builders )\r
35                                         assemblies.Add( builder.Assembly );\r
36                                 return assemblies; \r
37                         }\r
38                 }\r
39 \r
40                 public IList AssemblyInfo\r
41                 {\r
42                         get\r
43                         {\r
44                                 ArrayList info = new ArrayList();\r
45                                 foreach( TestAssemblyBuilder builder in this.builders )\r
46                                         info.Add( builder.AssemblyInfo );\r
47 \r
48                                 return info;\r
49                         }\r
50                 }\r
51                 #endregion\r
52 \r
53                 #region Build Methods\r
54                 /// <summary>\r
55                 /// Build a suite based on a TestPackage\r
56                 /// </summary>\r
57                 /// <param name="package">The TestPackage</param>\r
58                 /// <returns>A TestSuite</returns>\r
59                 public TestSuite Build( TestPackage package )\r
60                 {\r
61                         bool autoNamespaceSuites = package.GetSetting( "AutoNamespaceSuites", true );\r
62                         bool mergeAssemblies = package.GetSetting( "MergeAssemblies", false );\r
63 \r
64                         if ( package.IsSingleAssembly )\r
65                                 return BuildSingleAssembly( package );\r
66                         string targetAssemblyName = null;\r
67                         if( package.TestName != null && package.Assemblies.Contains( package.TestName ) )\r
68                         {\r
69                                 targetAssemblyName = package.TestName;\r
70                                 package.TestName = null;\r
71                         }\r
72                         \r
73                         TestSuite rootSuite = new TestSuite( package.FullName );\r
74                         NamespaceTreeBuilder namespaceTree = \r
75                                 new NamespaceTreeBuilder( rootSuite );\r
76 \r
77                         builders.Clear();\r
78                         foreach(string assemblyName in package.Assemblies)\r
79                         {\r
80                                 if ( targetAssemblyName == null || targetAssemblyName == assemblyName )\r
81                                 {\r
82                                         TestAssemblyBuilder builder = new TestAssemblyBuilder();\r
83                                         builders.Add( builder );\r
84 \r
85                                         Test testAssembly =  builder.Build( assemblyName, package.TestName, autoNamespaceSuites && !mergeAssemblies );\r
86 \r
87                                         if ( testAssembly != null )\r
88                                         {\r
89                                                 if (!mergeAssemblies)\r
90                                                 {\r
91                                                         rootSuite.Add(testAssembly);\r
92                                                 }\r
93                                                 else if (autoNamespaceSuites)\r
94                                                 {\r
95                                                         namespaceTree.Add(testAssembly.Tests);\r
96                                                         rootSuite = namespaceTree.RootSuite;\r
97                                                 }\r
98                                                 else\r
99                                                 {\r
100                                                         foreach (Test test in testAssembly.Tests)\r
101                                                                 rootSuite.Add(test);\r
102                                                 }\r
103                                         }\r
104                                 }\r
105                         }\r
106 \r
107                         if ( rootSuite.Tests.Count == 0 )\r
108                                 return null;\r
109 \r
110                         return rootSuite;\r
111                 }\r
112 \r
113                 private TestSuite BuildSingleAssembly( TestPackage package )\r
114                 {\r
115                         TestAssemblyBuilder builder = new TestAssemblyBuilder();\r
116                         builders.Clear();\r
117                         builders.Add( builder );\r
118 \r
119                         return (TestSuite)builder.Build( \r
120                                 package.FullName, \r
121                                 package.TestName, package.GetSetting( "AutoNamespaceSuites", true ) );\r
122                 }\r
123                 #endregion\r
124         }\r
125 }\r