22using System . Collections . Generic ;
33using System . IO ;
44using System . Linq ;
5- using Common . Logging ;
65using Moq ;
6+ using Ploeh . AutoFixture . Xunit ;
77using ScriptCs . Contracts ;
88using Should ;
99using Xunit ;
10+ using Xunit . Extensions ;
1011
1112namespace ScriptCs . Tests
1213{
1314 public class ScriptExecutorTests
1415 {
15- public static ScriptExecutor CreateScriptExecutor (
16- Mock < IFileSystem > fileSystem = null ,
17- Mock < IFilePreProcessor > fileProcessor = null ,
18- Mock < IScriptEngine > scriptEngine = null )
19- {
20- if ( fileSystem == null )
21- {
22- fileSystem = new Mock < IFileSystem > ( ) ;
23- fileSystem . Setup ( fs => fs . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( @"C:\" ) ;
24- }
25-
26- fileProcessor = fileProcessor ?? new Mock < IFilePreProcessor > ( ) ;
27-
28- if ( scriptEngine == null )
29- {
30- scriptEngine = new Mock < IScriptEngine > ( ) ;
31- scriptEngine . SetupProperty ( e => e . BaseDirectory ) ;
32- }
33-
34- var logger = new Mock < ILog > ( ) ;
35-
36- return new ScriptExecutor ( fileSystem . Object , fileProcessor . Object , scriptEngine . Object , logger . Object ) ;
37- }
38-
3916 public class TheInitializeMethod
4017 {
41- [ Fact ]
42- public void ShouldSetEngineBaseDirectoryBasedOnCurrentDirectoryAndBinFolder ( )
18+ [ Theory , ScriptCsAutoData ]
19+ public void ShouldSetEngineBaseDirectoryBasedOnCurrentDirectoryAndBinFolder ( [ Frozen ] Mock < IScriptEngine > scriptEngine , [ Frozen ] Mock < IFileSystem > fileSystem ,
20+ [ Frozen ] Mock < IFilePreProcessor > preProcessor , ScriptExecutor scriptExecutor )
4321 {
4422 // arrange
45- var scriptEngine = new Mock < IScriptEngine > ( ) ;
46- var fileSystem = new Mock < IFileSystem > ( ) ;
47- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
4823 preProcessor . Setup ( x => x . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult ( ) ) ;
4924
5025 var currentDirectory = @"C:\" ;
@@ -53,8 +28,6 @@ public void ShouldSetEngineBaseDirectoryBasedOnCurrentDirectoryAndBinFolder()
5328
5429 scriptEngine . SetupProperty ( e => e . BaseDirectory ) ;
5530
56- var scriptExecutor = CreateScriptExecutor ( fileSystem , preProcessor , scriptEngine ) ;
57-
5831 var paths = new string [ 0 ] ;
5932 IEnumerable < IScriptPack > recipes = Enumerable . Empty < IScriptPack > ( ) ;
6033
@@ -66,24 +39,20 @@ public void ShouldSetEngineBaseDirectoryBasedOnCurrentDirectoryAndBinFolder()
6639 expectedBaseDirectory . ShouldEqual ( scriptEngine . Object . BaseDirectory ) ;
6740 }
6841
69- [ Fact ]
70- public void ShouldInitializeScriptPacks ( )
42+ [ Theory , ScriptCsAutoData ]
43+ public void ShouldInitializeScriptPacks ( [ Frozen ] Mock < IFilePreProcessor > preProcessor , [ Frozen ] Mock < IFileSystem > fileSystem ,
44+ [ Frozen ] Mock < IScriptPack > scriptPack1 , ScriptExecutor scriptExecutor )
7145 {
72- var fileSystem = new Mock < IFileSystem > ( ) ;
7346 fileSystem . Setup ( f => f . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( @"c:\my_script" ) ;
7447 fileSystem . Setup ( f => f . CurrentDirectory ) . Returns ( @"c:\my_script" ) ;
7548
76- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
7749 preProcessor . Setup ( p => p . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult { Code = "var a = 0;" } ) ;
7850
79- var executor = CreateScriptExecutor ( fileSystem : fileSystem , fileProcessor : preProcessor ) ;
80-
81- var scriptPack1 = new Mock < IScriptPack > ( ) ;
8251 scriptPack1 . Setup ( p => p . Initialize ( It . IsAny < IScriptPackSession > ( ) ) ) ;
8352 scriptPack1 . Setup ( p => p . GetContext ( ) ) . Returns ( Mock . Of < IScriptPackContext > ( ) ) ;
8453
8554 // act
86- executor . Initialize ( Enumerable . Empty < string > ( ) , new [ ] { scriptPack1 . Object } ) ;
55+ scriptExecutor . Initialize ( Enumerable . Empty < string > ( ) , new [ ] { scriptPack1 . Object } ) ;
8756
8857 // assert
8958 scriptPack1 . Verify ( p => p . Initialize ( It . IsAny < IScriptPackSession > ( ) ) ) ;
@@ -92,19 +61,15 @@ public void ShouldInitializeScriptPacks()
9261
9362 public class TheTerminateMethod
9463 {
95- [ Fact ]
96- public void ShouldTerminateScriptPacksWhenTerminateIsCalled ( )
64+ [ Theory , ScriptCsAutoData ]
65+ public void ShouldTerminateScriptPacksWhenTerminateIsCalled ( [ Frozen ] Mock < IFilePreProcessor > preProcessor , [ Frozen ] Mock < IFileSystem > fileSystem ,
66+ [ Frozen ] Mock < IScriptPack > scriptPack1 , ScriptExecutor executor )
9767 {
98- var fileSystem = new Mock < IFileSystem > ( ) ;
9968 fileSystem . Setup ( f => f . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( @"c:\my_script" ) ;
10069 fileSystem . Setup ( f => f . CurrentDirectory ) . Returns ( @"c:\my_script" ) ;
10170
102- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
10371 preProcessor . Setup ( p => p . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult { Code = "var a = 0;" } ) ;
10472
105- var executor = CreateScriptExecutor ( fileSystem : fileSystem , fileProcessor : preProcessor ) ;
106-
107- var scriptPack1 = new Mock < IScriptPack > ( ) ;
10873 scriptPack1 . Setup ( p => p . Initialize ( It . IsAny < IScriptPackSession > ( ) ) ) ;
10974 scriptPack1 . Setup ( p => p . GetContext ( ) ) . Returns ( Mock . Of < IScriptPackContext > ( ) ) ;
11075 scriptPack1 . Setup ( p => p . Terminate ( ) ) ;
@@ -121,59 +86,43 @@ public void ShouldTerminateScriptPacksWhenTerminateIsCalled()
12186
12287 public class TheExecuteMethod
12388 {
124- [ Fact ]
125- public void ConstructsAbsolutePathBeforePreProcessingFile ( )
89+ [ Theory , ScriptCsAutoData ]
90+ public void ConstructsAbsolutePathBeforePreProcessingFile ( [ Frozen ] Mock < IFilePreProcessor > preProcessor , [ Frozen ] Mock < IFileSystem > fileSystem , ScriptExecutor executor )
12691 {
127- var fileSystem = new Mock < IFileSystem > ( ) ;
12892 fileSystem . Setup ( f => f . CurrentDirectory ) . Returns ( @"c:\my_script" ) ;
12993 fileSystem . Setup ( f => f . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( @"c:\my_script" ) ;
13094
131- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
13295 preProcessor . Setup ( p => p . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult { Code = "var a = 0;" } ) ;
13396
134- var executor = CreateScriptExecutor ( fileSystem : fileSystem , fileProcessor : preProcessor ) ;
135-
13697 executor . Initialize ( Enumerable . Empty < string > ( ) , Enumerable . Empty < IScriptPack > ( ) ) ;
13798 executor . Execute ( "script.csx" ) ;
13899 preProcessor . Verify ( p => p . ProcessFile ( @"c:\my_script\script.csx" ) ) ;
139100 }
140101
141- [ Fact ]
142- public void DoNotChangePathIfAbsolute ( )
102+ [ Theory , ScriptCsAutoData ]
103+ public void DoNotChangePathIfAbsolute ( [ Frozen ] Mock < IFilePreProcessor > preProcessor , [ Frozen ] Mock < IFileSystem > fileSystem , ScriptExecutor executor )
143104 {
144- var fileSystem = new Mock < IFileSystem > ( ) ;
145105 fileSystem . Setup ( f => f . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( @"c:\my_script" ) ;
146106 fileSystem . Setup ( f => f . CurrentDirectory ) . Returns ( @"c:\my_script" ) ;
147107
148- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
149108 preProcessor . Setup ( p => p . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult { Code = "var a = 0;" } ) ;
150109
151- var executor = CreateScriptExecutor ( fileSystem : fileSystem , fileProcessor : preProcessor ) ;
152110 executor . Initialize ( Enumerable . Empty < string > ( ) , Enumerable . Empty < IScriptPack > ( ) ) ;
153111 executor . Execute ( "script.csx" ) ;
154112
155113 preProcessor . Verify ( p => p . ProcessFile ( @"c:\my_script\script.csx" ) ) ;
156114 }
157115
158- [ Fact ]
159- public void ShouldExecuteScriptReturnedFromFileProcessorInScriptEngineWhenExecuteIsInvoked ( )
116+ [ Theory , ScriptCsAutoData ]
117+ public void ShouldExecuteScriptReturnedFromFileProcessorInScriptEngineWhenExecuteIsInvoked ( [ Frozen ] Mock < IScriptEngine > scriptEngine , [ Frozen ] Mock < IFileSystem > fileSystem ,
118+ [ Frozen ] Mock < IFilePreProcessor > preProcessor , ScriptExecutor scriptExecutor )
160119 {
161- // arrange
162- var scriptEngine = new Mock < IScriptEngine > ( ) ;
163- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
164- var fileSystem = new Mock < IFileSystem > ( ) ;
165-
166120 string code = Guid . NewGuid ( ) . ToString ( ) ;
167121
168122 var currentDirectory = @"C:\" ;
169123 fileSystem . Setup ( f => f . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( currentDirectory ) ;
170124 fileSystem . Setup ( fs => fs . CurrentDirectory ) . Returns ( currentDirectory ) ;
171125
172- var scriptExecutor = CreateScriptExecutor (
173- fileSystem : fileSystem ,
174- fileProcessor : preProcessor ,
175- scriptEngine : scriptEngine ) ;
176-
177126 var scriptName = "script.csx" ;
178127 var paths = new string [ 0 ] ;
179128 var recipes = Enumerable . Empty < IScriptPack > ( ) ;
@@ -189,21 +138,16 @@ public void ShouldExecuteScriptReturnedFromFileProcessorInScriptEngineWhenExecut
189138 preProcessor . Verify ( fs => fs . ProcessFile ( Path . Combine ( currentDirectory , scriptName ) ) , Times . Once ( ) ) ;
190139
191140 scriptEngine . Verify ( s => s . Execute ( code , It . IsAny < string [ ] > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < ScriptPackSession > ( ) ) , Times . Once ( ) ) ;
192-
193141 }
194142
195- [ Fact ]
196- public void ShouldAddReferenceToEachDestinationFile ( )
143+ [ Theory , ScriptCsAutoData ]
144+ public void ShouldAddReferenceToEachDestinationFile ( [ Frozen ] Mock < IScriptEngine > scriptEngine , [ Frozen ] Mock < IFileSystem > fileSystem ,
145+ [ Frozen ] Mock < IFilePreProcessor > preProcessor , ScriptExecutor scriptExecutor )
197146 {
198147 // arrange
199148 var defaultReferences = ScriptExecutor . DefaultReferences ;
200- var fileSystem = new Mock < IFileSystem > ( ) ;
201- var scriptEngine = new Mock < IScriptEngine > ( ) ;
202- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
203149 preProcessor . Setup ( x => x . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult ( ) ) ;
204150
205- var scriptExecutor = CreateScriptExecutor ( fileSystem , preProcessor , scriptEngine ) ;
206-
207151 var currentDirectory = @"C:\" ;
208152 var destinationFilePath1 = Path . Combine ( currentDirectory , @"bin\fileName1.cs" ) ;
209153 var destinationFilePath2 = Path . Combine ( currentDirectory , @"bin\fileName2.cs" ) ;
@@ -222,7 +166,7 @@ public void ShouldAddReferenceToEachDestinationFile()
222166 scriptEngine . Setup ( e => e . Execute ( It . IsAny < string > ( ) , It . IsAny < string [ ] > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < ScriptPackSession > ( ) ) ) ;
223167
224168 scriptExecutor . AddReference ( "a" ) ;
225- scriptExecutor . AddReferences ( new [ ] { "b" , "c" , "d" } ) ;
169+ scriptExecutor . AddReferences ( new [ ] { "a" , "a" , " b", "c" , "d" } ) ;
226170 scriptExecutor . AddReferenceByType < FactAttribute > ( ) ;
227171 scriptExecutor . AddReferenceByType ( typeof ( TheInitializeMethod ) ) ;
228172 var explicitReferences = new [ ] { "a" , "b" , "c" , "d" , typeof ( FactAttribute ) . Assembly . Location , typeof ( TheInitializeMethod ) . Assembly . Location } ;
@@ -234,18 +178,14 @@ public void ShouldAddReferenceToEachDestinationFile()
234178 scriptEngine . Verify ( e => e . Execute ( It . IsAny < string > ( ) , It . IsAny < string [ ] > ( ) , It . Is < IEnumerable < string > > ( x => x . SequenceEqual ( defaultReferences . Union ( explicitReferences . Union ( destPaths ) ) ) ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < ScriptPackSession > ( ) ) , Times . Once ( ) ) ;
235179 }
236180
237- [ Fact ]
238- public void ShouldAddNamespaces ( )
181+ [ Theory , ScriptCsAutoData ]
182+ public void ShouldAddNamespaces ( [ Frozen ] Mock < IScriptEngine > scriptEngine , [ Frozen ] Mock < IFileSystem > fileSystem ,
183+ [ Frozen ] Mock < IFilePreProcessor > preProcessor , ScriptExecutor scriptExecutor )
239184 {
240185 // arrange
241186 var defaultReferences = ScriptExecutor . DefaultReferences ;
242- var fileSystem = new Mock < IFileSystem > ( ) ;
243- var scriptEngine = new Mock < IScriptEngine > ( ) ;
244- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
245187 preProcessor . Setup ( x => x . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult ( ) ) ;
246188
247- var scriptExecutor = CreateScriptExecutor ( fileSystem , preProcessor , scriptEngine ) ;
248-
249189 var currentDirectory = @"C:\" ;
250190
251191 var scriptName = "script.csx" ;
@@ -256,7 +196,7 @@ public void ShouldAddNamespaces()
256196 scriptEngine . Setup ( e => e . Execute ( It . IsAny < string > ( ) , It . IsAny < string [ ] > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < ScriptPackSession > ( ) ) ) ;
257197
258198 scriptExecutor . AddNamespace ( "a" ) ;
259- scriptExecutor . AddNamespaces ( new [ ] { "b" , "c" , "d" } ) ;
199+ scriptExecutor . AddNamespaces ( new [ ] { "a" , "a" , "b" , "c" , "d" } ) ;
260200 scriptExecutor . AddNamespaceByType < FactAttribute > ( ) ;
261201 scriptExecutor . AddNamespaceByType ( typeof ( TheInitializeMethod ) ) ;
262202 var explicitNamespaces = new [ ] { "a" , "b" , "c" , "d" , typeof ( FactAttribute ) . Namespace , typeof ( TheInitializeMethod ) . Namespace } ;
@@ -268,49 +208,39 @@ public void ShouldAddNamespaces()
268208 scriptEngine . Verify ( e => e . Execute ( It . IsAny < string > ( ) , It . IsAny < string [ ] > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . Is < IEnumerable < string > > ( x=> x . SequenceEqual ( ScriptExecutor . DefaultNamespaces . Union ( explicitNamespaces ) ) ) , It . IsAny < ScriptPackSession > ( ) ) , Times . Once ( ) ) ;
269209 }
270210
271- [ Fact ]
272- public void ExecutorShouldPassDefaultNamespacesToEngine ( )
211+ [ Theory , ScriptCsAutoData ]
212+ public void ExecutorShouldPassDefaultNamespacesToEngine ( [ Frozen ] Mock < IScriptEngine > engine , [ Frozen ] Mock < IFileSystem > fileSystem ,
213+ [ Frozen ] Mock < IFilePreProcessor > preProcessor , ScriptExecutor executor )
273214 {
274215 var expectedNamespaces = ScriptExecutor . DefaultNamespaces ;
275216
276- var fileSystem = new Mock < IFileSystem > ( ) ;
277217 fileSystem . Setup ( f => f . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( @"c:\my_script" ) ;
278218 fileSystem . Setup ( f => f . CurrentDirectory ) . Returns ( @"c:\my_script" ) ;
279219
280- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
281220 preProcessor . Setup ( p => p . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult { Code = "var a = 0;" } ) ;
282221
283- var engine = new Mock < IScriptEngine > ( ) ;
284-
285- var executor = CreateScriptExecutor ( fileSystem : fileSystem , fileProcessor : preProcessor , scriptEngine : engine ) ;
286-
287222 executor . Initialize ( Enumerable . Empty < string > ( ) , Enumerable . Empty < IScriptPack > ( ) ) ;
288223 executor . Execute ( "script.csx" ) ;
289224
290225 engine . Verify ( i => i . Execute ( It . IsAny < string > ( ) , It . IsAny < string [ ] > ( ) , It . IsAny < IEnumerable < string > > ( ) , It . Is < IEnumerable < string > > ( x => ! x . Except ( expectedNamespaces ) . Any ( ) ) , It . IsAny < ScriptPackSession > ( ) ) , Times . Exactly ( 1 ) ) ;
291226 }
292227
293- [ Fact ]
294- public void ExecutorShouldPassDefaultReferencesToEngine ( )
228+ [ Theory , ScriptCsAutoData ]
229+ public void ExecutorShouldPassDefaultReferencesToEngine ( [ Frozen ] Mock < IScriptEngine > engine , [ Frozen ] Mock < IFileSystem > fileSystem ,
230+ [ Frozen ] Mock < IFilePreProcessor > preProcessor , ScriptExecutor executor )
295231 {
296232 var defaultReferences = ScriptExecutor . DefaultReferences ;
297233
298- var fileSystem = new Mock < IFileSystem > ( ) ;
299234 fileSystem . Setup ( f => f . GetWorkingDirectory ( It . IsAny < string > ( ) ) ) . Returns ( @"c:\my_script" ) ;
300235 fileSystem . Setup ( f => f . CurrentDirectory ) . Returns ( @"c:\my_script" ) ;
301236
302- var preProcessor = new Mock < IFilePreProcessor > ( ) ;
303237 preProcessor . Setup ( p => p . ProcessFile ( It . IsAny < string > ( ) ) ) . Returns ( new FilePreProcessorResult { Code = "var a = 0;" } ) ;
304238
305- var engine = new Mock < IScriptEngine > ( ) ;
306-
307- var executor = CreateScriptExecutor ( fileSystem : fileSystem , fileProcessor : preProcessor , scriptEngine : engine ) ;
308-
309239 executor . Initialize ( Enumerable . Empty < string > ( ) , Enumerable . Empty < IScriptPack > ( ) ) ;
310240 executor . Execute ( "script.csx" ) ;
311241
312242 engine . Verify ( i => i . Execute ( It . IsAny < string > ( ) , It . IsAny < string [ ] > ( ) , It . Is < IEnumerable < string > > ( x => ! x . Except ( defaultReferences ) . Any ( ) ) , It . IsAny < IEnumerable < string > > ( ) , It . IsAny < ScriptPackSession > ( ) ) , Times . Exactly ( 1 ) ) ;
313243 }
314244 }
315245 }
316- }
246+ }
0 commit comments