2010-03-17 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mcs / nunit24 / NUnitCore / core / CoreExtensions.save.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 using System;\r
8 using System.IO;\r
9 using System.Collections;\r
10 using System.Reflection;\r
11 using System.Diagnostics;\r
12 using NUnit.Core.Extensibility;\r
13 \r
14 namespace NUnit.Core\r
15 {\r
16         /// <summary>\r
17         /// CoreExtensions is a singleton class that groups together all \r
18         /// the extension points that are supported in the test domain.\r
19         /// It also provides access to the test builders and decorators\r
20         /// by other parts of the NUnit core.\r
21         /// </summary>\r
22         public class CoreExtensions : ExtensionHost, IService\r
23         {\r
24                 #region Instance Fields\r
25                 private IAddinRegistry addinRegistry;\r
26                 private bool initialized;\r
27 \r
28                 private SuiteBuilderCollection suiteBuilders;\r
29                 private TestCaseBuilderCollection testBuilders;\r
30                 private TestDecoratorCollection testDecorators;\r
31                 private EventListenerCollection listeners;\r
32                 #endregion\r
33 \r
34                 #region CoreExtensions Singleton\r
35                 private static CoreExtensions host;\r
36                 public static CoreExtensions Host\r
37                 {\r
38                         get\r
39                         {\r
40                                 if (host == null)\r
41                                 {\r
42                                         host = new CoreExtensions();\r
43 //                                      host.InitializeService();\r
44                                 }\r
45 \r
46                                 return host;\r
47                         }\r
48                 }\r
49                 #endregion\r
50 \r
51                 #region Constructors\r
52                 public CoreExtensions() \r
53                 {\r
54                         this.suiteBuilders = new SuiteBuilderCollection();\r
55                         this.testBuilders = new TestCaseBuilderCollection();\r
56                         this.testDecorators = new TestDecoratorCollection();\r
57                         this.listeners = new EventListenerCollection();\r
58 \r
59                         this.extensions = new IExtensionPoint[]\r
60                                 { suiteBuilders, testBuilders, testDecorators };\r
61                         this.supportedTypes = ExtensionType.Core;\r
62                 }\r
63                 #endregion\r
64 \r
65                 #region Properties\r
66 \r
67                 public bool Initialized\r
68                 {\r
69                         get { return initialized; }\r
70                 }\r
71 \r
72                 /// <summary>\r
73                 /// Our AddinRegistry may be set from outside or passed into the domain\r
74                 /// </summary>\r
75                 public IAddinRegistry AddinRegistry\r
76                 {\r
77                         get \r
78                         {\r
79                                 if ( addinRegistry == null )\r
80                                         addinRegistry = AppDomain.CurrentDomain.GetData( "AddinRegistry" ) as IAddinRegistry;\r
81 \r
82                                 return addinRegistry; \r
83                         }\r
84                         set { addinRegistry = value; }\r
85                 }\r
86 \r
87                 public ISuiteBuilder SuiteBuilders\r
88                 {\r
89                         get { return suiteBuilders; }\r
90                 }\r
91 \r
92                 public TestCaseBuilderCollection TestBuilders\r
93                 {\r
94                         get { return testBuilders; }\r
95                 }\r
96 \r
97                 public ITestDecorator TestDecorators\r
98                 {\r
99                         get { return testDecorators; }\r
100                 }\r
101 \r
102                 public FrameworkRegistry TestFrameworks\r
103                 {\r
104                         get { return frameworks; }\r
105                 }\r
106                 #endregion\r
107 \r
108                 #region Public Methods  \r
109                 public void InstallBuiltins()\r
110                 {\r
111                         //Trace.WriteLine( "Installing Builtins" );\r
112 \r
113                         // Define NUnit Framework\r
114                         FrameworkRegistry.Register( "NUnit", "nunit.framework" );\r
115 \r
116                         // Install builtin SuiteBuilders - Note that the\r
117                         // NUnitTestCaseBuilder is installed whenever\r
118                         // an NUnitTestFixture is being populated and\r
119                         // removed afterward.\r
120                         suiteBuilders.Install( new Builders.NUnitTestFixtureBuilder() );\r
121                         suiteBuilders.Install( new Builders.SetUpFixtureBuilder() );\r
122 \r
123             //testDecorators.InstallFinal(new Builders.MultiCultureDecorator());\r
124                 }\r
125 \r
126                 public void InstallAddins()\r
127                 {\r
128                         //Trace.WriteLine( "Installing Addins" );\r
129 \r
130                         if( AddinRegistry != null )\r
131                         {\r
132                                 foreach (Addin addin in AddinRegistry.Addins)\r
133                                 {\r
134                                         if ( (this.ExtensionTypes & addin.ExtensionType) != 0 )\r
135                                         {\r
136                                                 try\r
137                                                 {\r
138                                                         Type type = Type.GetType(addin.TypeName);\r
139                                                         if ( type == null )\r
140                                                                 AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, "Could not locate type" );\r
141                                                         else if ( !InstallAddin( type ) )\r
142                                                                 AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, "Install returned false" );\r
143                                                         else\r
144                                                                 AddinRegistry.SetStatus( addin.Name, AddinStatus.Loaded, null );\r
145                                                 }\r
146                                                 catch( Exception ex )\r
147                                                 {\r
148                                                         AddinRegistry.SetStatus( addin.Name, AddinStatus.Error, ex.Message );\r
149                                                 }\r
150                                         }\r
151                                 }\r
152                         }\r
153                 }\r
154 \r
155                 public void InstallAdhocExtensions( Assembly assembly )\r
156                 {\r
157                         foreach ( Type type in assembly.GetExportedTypes() )\r
158                         {\r
159                                 if ( type.GetCustomAttributes(typeof(NUnitAddinAttribute), false).Length == 1 )\r
160                                         InstallAddin( type );\r
161                         }\r
162                 }\r
163                 #endregion\r
164 \r
165                 #region Helper Methods\r
166                 private bool InstallAddin( Type type )\r
167                 {\r
168                         ConstructorInfo ctor = type.GetConstructor(Type.EmptyTypes);\r
169                         object obj = ctor.Invoke( new object[0] );\r
170                         IAddin theAddin = (IAddin)obj;\r
171 \r
172                         return theAddin.Install(this);\r
173                 }\r
174                 #endregion\r
175 \r
176                 #region Type Safe Install Helpers\r
177         //internal void Install( ISuiteBuilder builder )\r
178         //{\r
179         //    suiteBuilders.Install( builder );\r
180         //}\r
181 \r
182         //internal void Install( ITestCaseBuilder builder )\r
183         //{\r
184         //    testBuilders.Install( builder );\r
185         //}\r
186 \r
187         //internal void Install( ITestDecorator decorator )\r
188         //{\r
189         //    testDecorators.Install( decorator );\r
190         //}\r
191 \r
192         //internal void Install( EventListener listener )\r
193         //{\r
194         //    listeners.Install( listener );\r
195         //}\r
196                 #endregion\r
197 \r
198                 #region IService Members\r
199 \r
200                 public void UnloadService()\r
201                 {\r
202                         // TODO:  Add CoreExtensions.UnloadService implementation\r
203                 }\r
204 \r
205                 public void InitializeService()\r
206                 {\r
207                         InstallBuiltins();\r
208                         InstallAddins();\r
209 \r
210                         initialized = true;\r
211                 }\r
212 \r
213                 #endregion\r
214         }\r
215 }\r