forked from exercism/csharp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathExercise.cs
More file actions
98 lines (75 loc) · 3.82 KB
/
Copy pathExercise.cs
File metadata and controls
98 lines (75 loc) · 3.82 KB
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
93
94
95
96
97
98
using System.Collections.Generic;
using System.Linq;
using Generators.Input;
using Generators.Output;
namespace Generators
{
public abstract class Exercise
{
private static readonly ExerciseWriter ExerciseWriter = new ExerciseWriter();
public string Name => GetType().ToExerciseName();
protected CanonicalData CanonicalData { get; private set; }
public void Regenerate(CanonicalData canonicalData)
{
CanonicalData = canonicalData;
UpdateCanonicalData(CanonicalData);
ExerciseWriter.WriteToFile(this);
}
protected virtual void UpdateCanonicalData(CanonicalData canonicalData)
{
}
public virtual string Render() => CreateTestClass().Render();
protected virtual TestClass CreateTestClass() => new TestClass
{
ClassName = Name.ToTestClassName(),
Methods = RenderTestMethods(),
CanonicalDataVersion = CanonicalData.Version,
UsingNamespaces = GetUsingNamespaces()
};
protected virtual HashSet<string> GetUsingNamespaces()
{
var usingNamespaces = new HashSet<string> { "Xunit" };
foreach (var canonicalDataCase in CanonicalData.Cases.Where(canonicalDataCase => canonicalDataCase.ExceptionThrown != null))
usingNamespaces.Add(canonicalDataCase.ExceptionThrown.Namespace);
return usingNamespaces;
}
protected virtual string[] RenderTestMethods() => CanonicalData.Cases.Select(RenderTestMethod).ToArray();
protected virtual string RenderTestMethod(CanonicalDataCase canonicalDataCase, int index) => CreateTestMethod(canonicalDataCase, index).Render();
protected virtual TestMethod CreateTestMethod(CanonicalDataCase canonicalDataCase, int index) => new TestMethod
{
Skip = index > 0,
Name = canonicalDataCase.Description.ToTestMethodName(),
Body = RenderTestMethodBody(canonicalDataCase)
};
protected virtual string RenderTestMethodBody(CanonicalDataCase canonicalDataCase)
{
var testMethodBody = CreateTestMethodBody(canonicalDataCase);
testMethodBody.Arrange = RenderTestMethodBodyArrange(testMethodBody);
testMethodBody.Act = RenderTestMethodBodyAct(testMethodBody);
testMethodBody.Assert = RenderTestMethodBodyAssert(testMethodBody);
return testMethodBody.Render();
}
protected virtual TestMethodBody CreateTestMethodBody(CanonicalDataCase canonicalDataCase)
{
if (canonicalDataCase.ExceptionThrown != null)
{
return new TestMethodBodyWithExceptionCheck(canonicalDataCase, CanonicalData);
}
if (canonicalDataCase.Expected is bool)
{
return new TestMethodBodyWithBooleanCheck(canonicalDataCase, CanonicalData);
}
if (canonicalDataCase.Expected is null)
{
return new TestMethodBodyWithNullCheck(canonicalDataCase, CanonicalData);
}
return new TestMethodBodyWithEqualityCheck(canonicalDataCase, CanonicalData);
}
protected virtual string RenderTestMethodBodyArrange(TestMethodBody testMethodBody)
=> TemplateRenderer.RenderPartial(testMethodBody.ArrangeTemplateName, testMethodBody.ArrangeTemplateParameters);
protected virtual string RenderTestMethodBodyAct(TestMethodBody testMethodBody)
=> TemplateRenderer.RenderPartial(testMethodBody.ActTemplateName, testMethodBody.ActTemplateParameters);
protected virtual string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
=> TemplateRenderer.RenderPartial(testMethodBody.AssertTemplateName, testMethodBody.AssertTemplateParameters);
}
}