Skip to content

Commit 0ff97b1

Browse files
committed
Using code blocks for multi-line conditional tests
1 parent 4a6d91e commit 0ff97b1

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

ReadableExpressions.UnitTests/WhenTranslatingConditionals.cs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,42 @@ public void ShouldTranslateAMultipleLineIfStatement()
9797
Assert.AreEqual(EXPECTED.TrimStart(), translated);
9898
}
9999

100+
[TestMethod]
101+
public void ShouldTranslateAMultipleLineIfStatementTest()
102+
{
103+
var intVariable = Expression.Variable(typeof(int), "i");
104+
var one = Expression.Constant(1);
105+
var intVariableLessThanOne = Expression.LessThan(intVariable, one);
106+
var returnLabel = Expression.Label(typeof(bool), "Return");
107+
var returnTrue = Expression.Return(returnLabel, Expression.Constant(true));
108+
var ifLessThanOneReturnTrue = Expression.IfThen(intVariableLessThanOne, returnTrue);
109+
var five = Expression.Constant(5);
110+
var intVariableMoreThanFive = Expression.GreaterThan(intVariable, five);
111+
var returnMoreThanFive = Expression.Label(returnLabel, intVariableMoreThanFive);
112+
var testBlock = Expression.Block(ifLessThanOneReturnTrue, returnMoreThanFive);
113+
114+
Expression<Action> writeHello = () => Console.WriteLine("Hello");
115+
var writeVariable = Expression.Variable(writeHello.Type, "write");
116+
var assignWrite = Expression.Assign(writeVariable, writeHello);
117+
var ifTestPassesThenWrite = Expression.IfThen(testBlock, assignWrite);
118+
119+
var translated = ifTestPassesThenWrite.ToReadableString();
120+
121+
const string EXPECTED = @"
122+
if ({
123+
if (i < 1)
124+
{
125+
return true;
126+
}
127+
128+
return i > 5;
129+
})
130+
{
131+
write = () => Console.WriteLine(""Hello"");
132+
}";
133+
Assert.AreEqual(EXPECTED.TrimStart(), translated);
134+
}
135+
100136
[TestMethod]
101137
public void ShouldTranslateAnIfElseStatement()
102138
{

ReadableExpressions/StringExtensions.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,7 @@ private static bool KeepSurroundingParentheses(Expression expression)
106106
switch (expression.NodeType)
107107
{
108108
case ExpressionType.Conditional:
109+
case ExpressionType.Lambda:
109110
return true;
110111

111112
case ExpressionType.Call:
@@ -117,9 +118,6 @@ private static bool KeepSurroundingParentheses(Expression expression)
117118
}
118119

119120
return (expression.NodeType == ExpressionType.Convert);
120-
121-
case ExpressionType.Lambda:
122-
return ((LambdaExpression)expression).Parameters.Count > 1;
123121
}
124122

125123
return false;

ReadableExpressions/Translators/ConditionalExpressionTranslator.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,12 @@ public override string Translate(Expression expression, TranslationContext conte
4343

4444
private static string GetTest(ConditionalExpression conditional, TranslationContext context)
4545
{
46-
var test = context.Translate(conditional.Test);
46+
var test = context.TranslateAsCodeBlock(conditional.Test);
47+
48+
if (test.IsMultiLine())
49+
{
50+
test = test.Indented().TrimStart();
51+
}
4752

4853
return test.WithSurroundingParentheses(checkExisting: true);
4954
}

0 commit comments

Comments
 (0)