forked from exercism/csharp
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQueenAttack.cs
More file actions
84 lines (70 loc) · 3.09 KB
/
Copy pathQueenAttack.cs
File metadata and controls
84 lines (70 loc) · 3.09 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
using Generators.Input;
using Generators.Output;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
namespace Generators.Exercises
{
public class QueenAttack : Exercise
{
protected override void UpdateCanonicalData(CanonicalData canonicalData)
{
foreach(var canonicalDataCase in canonicalData.Cases)
{
if(canonicalDataCase.Property == "create")
{
SetCreatePropertyData(canonicalDataCase);
}
}
}
protected override string RenderTestMethodBodyAssert(TestMethodBody testMethodBody)
{
if (testMethodBody.CanonicalDataCase.Property == "canAttack")
{
return RenderCanAttackAssert(testMethodBody);
}
if(testMethodBody.UseVariableForTested)
{
return string.Empty;
}
return base.RenderTestMethodBodyAssert(testMethodBody);
}
private static string RenderCanAttackAssert(TestMethodBody testMethodBody)
{
const string template =
@"var whiteQueen = QueenAttack.Create({{whiteQueenX}},{{whiteQueenY}});
var blackQueen = QueenAttack.Create({{blackQueenX}},{{blackQueenY}});
Assert.{% if Expected %}True{% else %}False{% endif %}(QueenAttack.CanAttack(whiteQueen, blackQueen));";
var whiteQueenPositions = GetCoordinatesFromPosition(testMethodBody.CanonicalDataCase.Input["white_queen"]);
var blackQueenPositions = GetCoordinatesFromPosition(testMethodBody.CanonicalDataCase.Input["black_queen"]);
var templateParameters = new
{
whiteQueenX = whiteQueenPositions.Item1,
whiteQueenY = whiteQueenPositions.Item2,
blackQueenX = blackQueenPositions.Item1,
blackQueenY = blackQueenPositions.Item2,
Expected = testMethodBody.CanonicalDataCase.Expected
};
return TemplateRenderer.RenderInline(template, templateParameters);
}
private static Tuple<int, int> GetCoordinatesFromPosition(object rawPosition)
{
var coordinates = ((JObject)rawPosition).ToObject<Dictionary<string, string>>()["position"].Split(',');
var positionX = int.Parse(coordinates[0].TrimStart('('));
var positionY = int.Parse(coordinates[1].TrimEnd(')'));
return Tuple.Create(positionX, positionY);
}
private static void SetCreatePropertyData(CanonicalDataCase canonicalDataCase)
{
var validExpected = (long)canonicalDataCase.Expected >= 0;
canonicalDataCase.ExceptionThrown = validExpected ? null : typeof(ArgumentOutOfRangeException);
canonicalDataCase.UseVariableForTested = validExpected;
var coordinates = GetCoordinatesFromPosition(canonicalDataCase.Input["queen"]);
canonicalDataCase.Input = new Dictionary<string, object>
{
["X"] = coordinates.Item1,
["Y"] = coordinates.Item2
};
}
}
}