@@ -19,6 +19,9 @@ namespace React.Tests.Core
19
19
{
20
20
public class JavaScriptEngineFactoryTest
21
21
{
22
+ private static object _engineSwitcherSynchronizer = new object ( ) ;
23
+
24
+
22
25
private JavaScriptEngineFactory CreateBasicFactory ( )
23
26
{
24
27
var config = new Mock < IReactSiteConfiguration > ( ) ;
@@ -44,11 +47,17 @@ Func<IJsEngine> innerEngineFactory
44
47
engineFactory . Setup ( x => x . CreateEngine ( ) ) . Returns ( innerEngineFactory ) ;
45
48
46
49
// 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
+ }
52
61
}
53
62
54
63
[ Fact ]
@@ -176,5 +185,116 @@ public void ShouldCatchErrorsWhileLoadingScripts()
176
185
var ex = Assert . Throws < ReactScriptLoadException > ( ( ) => factory . GetEngineForCurrentThread ( ) ) ;
177
186
Assert . Equal ( "Error while loading \" foo.js\" : Fail\r \n Line: 42\r \n Column: 911" , ex . Message ) ;
178
187
}
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
+ }
179
299
}
180
300
}
0 commit comments