Skip to content

Commit bb4f4d1

Browse files
committed
ScriptExecutor tests refactoring
1 parent e4a8338 commit bb4f4d1

4 files changed

Lines changed: 78 additions & 107 deletions

File tree

test/ScriptCs.Core.Tests/ScriptCs.Core.Tests.csproj

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,16 +26,30 @@
2626
<SpecificVersion>False</SpecificVersion>
2727
<HintPath>..\..\packages\Nuget.Core.2.2.0\lib\net40-Client\NuGet.Core.dll</HintPath>
2828
</Reference>
29+
<Reference Include="Ploeh.AutoFixture">
30+
<HintPath>..\..\packages\AutoFixture.3.6.5\lib\net40\Ploeh.AutoFixture.dll</HintPath>
31+
</Reference>
32+
<Reference Include="Ploeh.AutoFixture.AutoMoq">
33+
<HintPath>..\..\packages\AutoFixture.AutoMoq.3.6.5\lib\net40\Ploeh.AutoFixture.AutoMoq.dll</HintPath>
34+
</Reference>
35+
<Reference Include="Ploeh.AutoFixture.Xunit">
36+
<HintPath>..\..\packages\AutoFixture.Xunit.3.6.5\lib\net40\Ploeh.AutoFixture.Xunit.dll</HintPath>
37+
</Reference>
2938
<Reference Include="Roslyn.Compilers, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35, processorArchitecture=MSIL" />
30-
<Reference Include="Should">
31-
<HintPath>..\..\packages\Should.1.1.12.0\lib\Should.dll</HintPath>
39+
<Reference Include="Should, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
40+
<SpecificVersion>False</SpecificVersion>
41+
<HintPath>..\..\packages\Should.1.1.20\lib\Should.dll</HintPath>
3242
</Reference>
3343
<Reference Include="System" />
3444
<Reference Include="System.Core" />
3545
<Reference Include="Microsoft.CSharp" />
3646
<Reference Include="xunit">
3747
<HintPath>..\..\packages\xunit.1.9.1\lib\net20\xunit.dll</HintPath>
3848
</Reference>
49+
<Reference Include="xunit.extensions, Version=1.9.1.1600, Culture=neutral, PublicKeyToken=8d05b1bb7a6fdb6c, processorArchitecture=MSIL">
50+
<SpecificVersion>False</SpecificVersion>
51+
<HintPath>..\..\packages\xunit.extensions.1.9.1\lib\net20\xunit.extensions.dll</HintPath>
52+
</Reference>
3953
</ItemGroup>
4054
<ItemGroup>
4155
<Compile Include="..\..\common\CommonAssemblyInfo.cs">
@@ -44,6 +58,9 @@
4458
<Compile Include="..\..\common\CommonVersionInfo.cs">
4559
<Link>Properties\CommonVersionInfo.cs</Link>
4660
</Compile>
61+
<Compile Include="..\ScriptCs.Tests\ScriptCsAutoDataAttribute.cs">
62+
<Link>ScriptCsAutoDataAttribute.cs</Link>
63+
</Compile>
4764
<Compile Include="AssemblyResolverTests.cs" />
4865
<Compile Include="ScriptRuntimeTests.cs" />
4966
<Compile Include="FileSystemTests.cs" />
@@ -68,6 +85,7 @@
6885
</ProjectReference>
6986
</ItemGroup>
7087
<ItemGroup>
88+
<None Include="app.config" />
7189
<None Include="packages.config" />
7290
</ItemGroup>
7391
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

test/ScriptCs.Core.Tests/ScriptExecutorTests.cs

Lines changed: 34 additions & 104 deletions
Original file line numberDiff line numberDiff line change
@@ -2,49 +2,24 @@
22
using System.Collections.Generic;
33
using System.IO;
44
using System.Linq;
5-
using Common.Logging;
65
using Moq;
6+
using Ploeh.AutoFixture.Xunit;
77
using ScriptCs.Contracts;
88
using Should;
99
using Xunit;
10+
using Xunit.Extensions;
1011

1112
namespace 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

Comments
 (0)