tracks/csharp/generators/Exercise.cs in trackler-2.2.1.12 vs tracks/csharp/generators/Exercise.cs in trackler-2.2.1.13

- old
+ new

@@ -1,23 +1,98 @@ -using Generators.Input; +using System.Collections.Generic; +using System.Linq; +using Generators.Input; using Generators.Output; namespace Generators { public abstract class Exercise { - protected Exercise() + private static readonly ExerciseWriter ExerciseWriter = new ExerciseWriter(); + + public string Name => GetType().ToExerciseName(); + + protected CanonicalData CanonicalData { get; private set; } + + public void Regenerate(CanonicalData canonicalData) { - Name = GetType().ToExerciseName(); - CanonicalData = CanonicalDataParser.Parse(Name); + CanonicalData = canonicalData; + UpdateCanonicalData(CanonicalData); + + ExerciseWriter.WriteToFile(this); } - public string Name { get; } - public CanonicalData CanonicalData { get; } + protected virtual void UpdateCanonicalData(CanonicalData canonicalData) + { + } - public void Generate() => TestClassFile.Write(this, Render()); + public virtual string Render() => CreateTestClass().Render(); - protected virtual string Render() => TestClassRenderer.Render(CreateTestClass()); + protected virtual TestClass CreateTestClass() => new TestClass + { + ClassName = Name.ToTestClassName(), + Methods = RenderTestMethods(), + CanonicalDataVersion = CanonicalData.Version, + UsingNamespaces = GetUsingNamespaces() + }; - protected virtual TestClass CreateTestClass() => TestClassGenerator.Create(this); + 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); } -} \ No newline at end of file +}