@@ -19,6 +19,9 @@ namespace React.Tests.Core
1919{
2020 public class JavaScriptEngineFactoryTest
2121 {
22+ private static object _engineSwitcherSynchronizer = new object ( ) ;
23+
24+
2225 private JavaScriptEngineFactory CreateBasicFactory ( )
2326 {
2427 var config = new Mock < IReactSiteConfiguration > ( ) ;
@@ -44,11 +47,17 @@ Func<IJsEngine> innerEngineFactory
4447 engineFactory . Setup ( x => x . CreateEngine ( ) ) . Returns ( innerEngineFactory ) ;
4548
4649 // JsEngineSwitcher is a singleton :(
47- var engineFactories = JsEngineSwitcher . Instance . EngineFactories ;
48- engineFactories . Clear ( ) ;
49- engineFactories . Add ( engineFactory . Object ) ;
50-
51- return new JavaScriptEngineFactory ( JsEngineSwitcher . Instance , config . Object , fileSystem . Object ) ;
50+ lock ( _engineSwitcherSynchronizer )
51+ {
52+ var engineSwitcher = JsEngineSwitcher . Instance ;
53+ engineSwitcher . DefaultEngineName = string . Empty ;
54+
55+ var engineFactories = engineSwitcher . EngineFactories ;
56+ engineFactories . Clear ( ) ;
57+ engineFactories . Add ( engineFactory . Object ) ;
58+
59+ return new JavaScriptEngineFactory ( engineSwitcher , config . Object , fileSystem . Object ) ;
60+ }
5261 }
5362
5463 [ Fact ]
@@ -176,5 +185,116 @@ public void ShouldCatchErrorsWhileLoadingScripts()
176185 var ex = Assert . Throws < ReactScriptLoadException > ( ( ) => factory . GetEngineForCurrentThread ( ) ) ;
177186 Assert . Equal ( "Error while loading \" foo.js\" : Fail\r \n Line: 42\r \n Column: 911" , ex . Message ) ;
178187 }
188+
189+ [ Fact ]
190+ public void ShouldReturnDefaultEngine ( )
191+ {
192+ const string someEngineName = "SomeEngine" ;
193+ const string defaultEngineName = "DefaultEngine" ;
194+ const string someOtherEngineName = "SomeOtherEngine" ;
195+
196+ var someEngineFactory = new Mock < IJsEngineFactory > ( ) ;
197+ someEngineFactory . Setup ( x => x . EngineName ) . Returns ( someEngineName ) ;
198+ someEngineFactory . Setup ( x => x . CreateEngine ( ) ) . Returns ( ( ) =>
199+ {
200+ var someEngine = new Mock < IJsEngine > ( ) ;
201+ someEngine . Setup ( x => x . Name ) . Returns ( someEngineName ) ;
202+ return someEngine . Object ;
203+ } ) ;
204+
205+ var defaultEngineFactory = new Mock < IJsEngineFactory > ( ) ;
206+ defaultEngineFactory . Setup ( x => x . EngineName ) . Returns ( defaultEngineName ) ;
207+ defaultEngineFactory . Setup ( x => x . CreateEngine ( ) ) . Returns ( ( ) =>
208+ {
209+ var defaultEngine = new Mock < IJsEngine > ( ) ;
210+ defaultEngine . Setup ( x => x . Name ) . Returns ( defaultEngineName ) ;
211+ return defaultEngine . Object ;
212+ } ) ;
213+
214+ var someOtherEngineFactory = new Mock < IJsEngineFactory > ( ) ;
215+ someOtherEngineFactory . Setup ( x => x . EngineName ) . Returns ( someOtherEngineName ) ;
216+ someOtherEngineFactory . Setup ( x => x . CreateEngine ( ) ) . Returns ( ( ) =>
217+ {
218+ var someOtherEngine = new Mock < IJsEngine > ( ) ;
219+ someOtherEngine . Setup ( x => x . Name ) . Returns ( someOtherEngineName ) ;
220+ return someOtherEngine . Object ;
221+ } ) ;
222+
223+ var config = new Mock < IReactSiteConfiguration > ( ) ;
224+ config . Setup ( x => x . ScriptsWithoutTransform ) . Returns ( new List < string > ( ) ) ;
225+ config . Setup ( x => x . LoadReact ) . Returns ( true ) ;
226+
227+ var fileSystem = new Mock < IFileSystem > ( ) ;
228+
229+ JavaScriptEngineFactory factory ;
230+
231+ // JsEngineSwitcher is a singleton :(
232+ lock ( _engineSwitcherSynchronizer )
233+ {
234+ var engineSwitcher = JsEngineSwitcher . Instance ;
235+ engineSwitcher . DefaultEngineName = defaultEngineName ;
236+
237+ var engineFactories = engineSwitcher . EngineFactories ;
238+ engineFactories . Clear ( ) ;
239+ engineFactories . Add ( someEngineFactory . Object ) ;
240+ engineFactories . Add ( defaultEngineFactory . Object ) ;
241+ engineFactories . Add ( someOtherEngineFactory . Object ) ;
242+
243+ factory = new JavaScriptEngineFactory ( engineSwitcher , config . Object , fileSystem . Object ) ;
244+ }
245+
246+ var engine = factory . GetEngineForCurrentThread ( ) ;
247+
248+ Assert . Equal ( defaultEngineName , engine . Name ) ;
249+ }
250+
251+ [ Fact ]
252+ public void ShouldThrowIfDefaultEngineFactoryNotFound ( )
253+ {
254+ const string someEngineName = "SomeEngine" ;
255+ const string defaultEngineName = "DefaultEngine" ;
256+ const string someOtherEngineName = "SomeOtherEngine" ;
257+
258+ var someEngineFactory = new Mock < IJsEngineFactory > ( ) ;
259+ someEngineFactory . Setup ( x => x . EngineName ) . Returns ( someEngineName ) ;
260+ someEngineFactory . Setup ( x => x . CreateEngine ( ) ) . Returns ( ( ) =>
261+ {
262+ var someEngine = new Mock < IJsEngine > ( ) ;
263+ someEngine . Setup ( x => x . Name ) . Returns ( someEngineName ) ;
264+ return someEngine . Object ;
265+ } ) ;
266+
267+ var someOtherEngineFactory = new Mock < IJsEngineFactory > ( ) ;
268+ someOtherEngineFactory . Setup ( x => x . EngineName ) . Returns ( someOtherEngineName ) ;
269+ someOtherEngineFactory . Setup ( x => x . CreateEngine ( ) ) . Returns ( ( ) =>
270+ {
271+ var someOtherEngine = new Mock < IJsEngine > ( ) ;
272+ someOtherEngine . Setup ( x => x . Name ) . Returns ( someOtherEngineName ) ;
273+ return someOtherEngine . Object ;
274+ } ) ;
275+
276+ var config = new Mock < IReactSiteConfiguration > ( ) ;
277+ config . Setup ( x => x . ScriptsWithoutTransform ) . Returns ( new List < string > ( ) ) ;
278+ config . Setup ( x => x . LoadReact ) . Returns ( true ) ;
279+
280+ var fileSystem = new Mock < IFileSystem > ( ) ;
281+
282+ // JsEngineSwitcher is a singleton :(
283+ lock ( _engineSwitcherSynchronizer )
284+ {
285+ var engineSwitcher = JsEngineSwitcher . Instance ;
286+ engineSwitcher . DefaultEngineName = defaultEngineName ;
287+
288+ var engineFactories = engineSwitcher . EngineFactories ;
289+ engineFactories . Clear ( ) ;
290+ engineFactories . Add ( someEngineFactory . Object ) ;
291+ engineFactories . Add ( someOtherEngineFactory . Object ) ;
292+
293+ Assert . Throws < ReactEngineNotFoundException > ( ( ) =>
294+ {
295+ var factory = new JavaScriptEngineFactory ( engineSwitcher , config . Object , fileSystem . Object ) ;
296+ } ) ;
297+ }
298+ }
179299 }
180300}
0 commit comments