-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathCodeSourceCommandFactoryTests.cs
92 lines (84 loc) · 4.13 KB
/
CodeSourceCommandFactoryTests.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
namespace CSharpInteractive.Tests;
using System.Diagnostics.CodeAnalysis;
using Core;
using Environment = System.Environment;
[SuppressMessage("Performance", "CA1861:Avoid constant arrays as arguments")]
[SuppressMessage("ReSharper", "GenericEnumeratorNotDisposed")]
[SuppressMessage("Usage", "xUnit1042:The member referenced by the MemberData attribute returns untyped data rows")]
public class CodeSourceCommandFactoryTests
{
private const string SourceName = "Abc";
private static readonly ScriptCommand ScriptCommand11 = new(SourceName, "code11");
private static readonly ScriptCommand ScriptCommand12 = new(SourceName, "code12");
private static readonly ScriptCommand ScriptCommand2 = new(SourceName, "code2");
private static readonly ScriptCommand ScriptCommand3 = new(SourceName, "#code3");
private static readonly ScriptCommand ScriptCommand4 = new(SourceName, "code1 + code2");
private readonly Mock<ILog<CodeSourceCommandFactory>> _log;
private readonly Mock<ICommandFactory<string>> _replCommandFactory1;
private readonly Mock<ICommandFactory<string>> _replCommandFactory2;
private readonly Mock<ICommandFactory<ScriptCommand>> _scriptCommandFactory;
private readonly Mock<ICodeSource> _codeSource;
public CodeSourceCommandFactoryTests()
{
_log = new Mock<ILog<CodeSourceCommandFactory>>();
_replCommandFactory1 = new Mock<ICommandFactory<string>>();
_replCommandFactory1.Setup(i => i.Create(It.IsAny<string>())).Returns([]);
_replCommandFactory1.SetupGet(i => i.Order).Returns(1);
_replCommandFactory2 = new Mock<ICommandFactory<string>>();
_replCommandFactory2.Setup(i => i.Create("#help")).Returns([HelpCommand.Shared]);
_replCommandFactory2.SetupGet(i => i.Order).Returns(2);
_scriptCommandFactory = new Mock<ICommandFactory<ScriptCommand>>();
_scriptCommandFactory.Setup(i => i.Create(new ScriptCommand(SourceName, "code1" + Environment.NewLine, false))).Returns([ScriptCommand11, ScriptCommand12]);
_scriptCommandFactory.Setup(i => i.Create(new ScriptCommand(SourceName, "code2" + Environment.NewLine, false))).Returns([ScriptCommand2]);
_scriptCommandFactory.Setup(i => i.Create(new ScriptCommand(SourceName, "#code3" + Environment.NewLine, false))).Returns([ScriptCommand3]);
_scriptCommandFactory.Setup(i => i.Create(new ScriptCommand(SourceName, "code1" + Environment.NewLine + "code2" + Environment.NewLine, false))).Returns([ScriptCommand4]);
_codeSource = new Mock<ICodeSource>();
}
[Theory]
[MemberData(nameof(Data))]
internal void ShouldCreateCodeSource(IEnumerable<string> lines, ICommand[] expectedCommands)
{
// Given
_codeSource.SetupGet(i => i.Name).Returns(SourceName);
// ReSharper disable once NotDisposedResourceIsReturned
_codeSource.Setup(i => i.GetEnumerator()).Returns(lines.GetEnumerator());
var factory = CreateInstance();
// When
var actualCommands = factory.Create(_codeSource.Object).ToArray();
// Then
actualCommands.ShouldBe(expectedCommands);
}
public static IEnumerable<object?[]> Data => new List<object?[]>
{
new object[]
{
new[] {"code1", "#help", "code2"},
new[] {ScriptCommand11, ScriptCommand12, HelpCommand.Shared, ScriptCommand2}
},
new object[]
{
new[] {"#code3", "#help", "code2"},
new[] {ScriptCommand3, HelpCommand.Shared, ScriptCommand2}
},
new object[]
{
new[] {"code1", "#help", "code2"},
new[] {ScriptCommand11, ScriptCommand12, HelpCommand.Shared, ScriptCommand2}
},
new object[]
{
new[] {"code1", "code2"},
new[] {ScriptCommand4}
},
new object[]
{
new[] {"code1", null, "code2"},
new[] {ScriptCommand11, ScriptCommand12, ScriptCommand2}
}
};
private CodeSourceCommandFactory CreateInstance() =>
new(
_log.Object,
[_replCommandFactory2.Object, _replCommandFactory1.Object],
_scriptCommandFactory.Object);
}