Skip to content

Commit 878434e

Browse files
committed
Test coverage for multiple line checked maths operations / Analyzing all expression types before translating
1 parent 44adfa4 commit 878434e

File tree

3 files changed

+44
-33
lines changed

3 files changed

+44
-33
lines changed

ReadableExpressions.UnitTests/WhenTranslatingMathsOperations.cs

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -96,20 +96,38 @@ public void ShouldTranslateAMultiplicationExpression()
9696
[TestMethod]
9797
public void ShouldTranslateACheckedMultiplicationExpression()
9898
{
99-
var intParameter1 = Expression.Parameter(typeof(int), "a");
100-
var intParameter2 = Expression.Parameter(typeof(int), "b");
101-
var checkedMultiplication = Expression.MultiplyChecked(intParameter1, intParameter2);
99+
Expression<Action> consoleRead = () => Console.Read();
102100

103-
var checkedMultiplicationLambda = Expression.Lambda<Func<int, int, int>>(
104-
checkedMultiplication,
105-
intParameter1,
106-
intParameter2);
101+
var variableOne = Expression.Variable(typeof(int), "one");
102+
var variableTwo = Expression.Variable(typeof(int), "two");
103+
104+
var variableOneAssignment = Expression.Assign(variableOne, consoleRead.Body);
105+
var variableTwoAssignment = Expression.Assign(variableTwo, consoleRead.Body);
107106

108-
//Expression<Func<int, int, int>> ass = (a, b) => checked(a * b);
107+
var variableOnePlusTwo = Expression.Add(variableOne, variableTwo);
109108

110-
var translated = checkedMultiplicationLambda.ToReadableString();
109+
var valueOneBlock = Expression.Block(
110+
new[] { variableOne, variableTwo },
111+
variableOneAssignment,
112+
variableTwoAssignment,
113+
variableOnePlusTwo);
114+
115+
var intVariable = Expression.Parameter(typeof(int), "i");
116+
var checkedMultiplication = Expression.MultiplyChecked(valueOneBlock, intVariable);
117+
118+
var translated = checkedMultiplication.ToReadableString();
119+
120+
const string EXPECTED = @"
121+
checked
122+
{
123+
{
124+
var one = Console.Read();
125+
var two = Console.Read();
126+
return (one + two);
127+
} * i
128+
}";
111129

112-
Assert.AreEqual("(a, b) => checked(a * b)", translated);
130+
Assert.AreEqual(EXPECTED.TrimStart(), translated);
113131
}
114132

115133
[TestMethod]

ReadableExpressions/TranslationContext.cs

Lines changed: 1 addition & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -73,21 +73,7 @@ public static ExpressionAnalysisVisitor Analyse(Expression expression)
7373

7474
var coreExpression = GetCoreExpression(expression);
7575

76-
if (coreExpression.IsAssignment())
77-
{
78-
analyzer.Visit(coreExpression);
79-
return analyzer;
80-
}
81-
82-
switch (coreExpression.NodeType)
83-
{
84-
case ExpressionType.Block:
85-
case ExpressionType.Call:
86-
case ExpressionType.Conditional:
87-
analyzer.Visit(coreExpression);
88-
break;
89-
}
90-
76+
analyzer.Visit(coreExpression);
9177
return analyzer;
9278
}
9379

ReadableExpressions/Translators/BinaryExpressionTranslator.cs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -67,24 +67,31 @@ public override string Translate(Expression expression, TranslationContext conte
6767
: Translate(binary, context);
6868
}
6969

70-
private static string Translate(BinaryExpression binary, TranslationContext context)
70+
private string Translate(BinaryExpression binary, TranslationContext context)
7171
{
72-
var left = GetTranslation(binary.Left, context);
72+
var left = TranslateOperand(binary.Left, context);
7373
var @operator = _operatorsByNodeType[binary.NodeType];
74-
var right = GetTranslation(binary.Right, context);
74+
var right = TranslateOperand(binary.Right, context);
7575

7676
var operation = $"{left} {@operator} {right}";
7777

7878
return AdjustForCheckedOperatorIfAppropriate(binary.NodeType, operation);
7979
}
8080

81-
private static string GetTranslation(Expression expression, TranslationContext context)
81+
private string TranslateOperand(Expression expression, TranslationContext context)
8282
{
83+
var operand = GetTranslatedExpressionBody(expression, context);
84+
85+
if (!operand.IsASingleStatement)
86+
{
87+
return operand.WithCurlyBraces();
88+
}
89+
8390
var translation = context.GetTranslation(expression);
8491

8592
if (expression.IsAssignment() && !translation.HasSurroundingParentheses())
8693
{
87-
translation = translation.WithSurroundingParentheses();
94+
return translation.WithSurroundingParentheses();
8895
}
8996

9097
return translation;
@@ -104,14 +111,14 @@ private static string AdjustForCheckedOperatorIfAppropriate(
104111
return $@"
105112
checked
106113
{{
107-
{operation.Indent()}
114+
{operation.TrimStart().Indent()}
108115
}}".TrimStart();
109116
}
110117

111118
return $"checked({operation})";
112119
}
113120

114-
private static string TranslateAddition(BinaryExpression binary, TranslationContext context)
121+
private string TranslateAddition(BinaryExpression binary, TranslationContext context)
115122
{
116123
if ((binary.Left.Type != typeof(string)) && (binary.Right.Type != typeof(string)))
117124
{
@@ -157,7 +164,7 @@ private static bool IsBooleanConstant(Expression expression)
157164
private string Translate(StandaloneBoolean standalone, TranslationContext context)
158165
{
159166
return standalone.IsComparisonToTrue
160-
? GetTranslation(standalone.Boolean, context)
167+
? TranslateOperand(standalone.Boolean, context)
161168
: _negationTranslator.TranslateNot(standalone.Boolean, context);
162169
}
163170

0 commit comments

Comments
 (0)