Skip to content

Commit b9f9472

Browse files
committed
First tests and implementation for parameters default value OK
1 parent 7adfb28 commit b9f9472

File tree

3 files changed

+63
-20
lines changed

3 files changed

+63
-20
lines changed

CodingSeb.ExpressionEvaluator.Tests/ExpressionEvaluatorTests.cs

Lines changed: 48 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -2158,7 +2158,7 @@ void Evaluator_PreEvaluateVariable(object sender, VariablePreEvaluationEventArg
21582158

21592159
#region Method with params parameter
21602160

2161-
ExpressionEvaluator evaluatorForParamsTests()
2161+
ExpressionEvaluator evaluatorForMethodArgs()
21622162
{
21632163
ExpressionEvaluator ee = new ExpressionEvaluator(new Dictionary<string, object>()
21642164
{
@@ -2169,110 +2169,138 @@ ExpressionEvaluator evaluatorForParamsTests()
21692169
return ee;
21702170
}
21712171

2172-
yield return new TestCaseData(evaluatorForParamsTests()
2172+
yield return new TestCaseData(evaluatorForMethodArgs()
21732173
, "paramsObj.SumOf(1, 2)"
21742174
, null)
21752175
.Returns(3)
21762176
.SetCategory("ParamsKeywordMethod");
21772177

2178-
yield return new TestCaseData(evaluatorForParamsTests()
2178+
yield return new TestCaseData(evaluatorForMethodArgs()
21792179
, "paramsObj.SumOf(1, 2, 3)"
21802180
, null)
21812181
.Returns(6)
21822182
.SetCategory("ParamsKeywordMethod");
21832183

2184-
yield return new TestCaseData(evaluatorForParamsTests()
2184+
yield return new TestCaseData(evaluatorForMethodArgs()
21852185
, "paramsObj.SumOf(1,2,3,4)"
21862186
, null)
21872187
.Returns(10)
21882188
.SetCategory("ParamsKeywordMethod");
21892189

2190-
yield return new TestCaseData(evaluatorForParamsTests()
2190+
yield return new TestCaseData(evaluatorForMethodArgs()
21912191
, "paramsObj.SumOf2()"
21922192
, null)
21932193
.Returns(0)
21942194
.SetCategory("ParamsKeywordMethod");
21952195

2196-
yield return new TestCaseData(evaluatorForParamsTests()
2196+
yield return new TestCaseData(evaluatorForMethodArgs()
21972197
, "paramsObj.SumOf2(1)"
21982198
, null)
21992199
.Returns(1)
22002200
.SetCategory("ParamsKeywordMethod");
22012201

2202-
yield return new TestCaseData(evaluatorForParamsTests()
2202+
yield return new TestCaseData(evaluatorForMethodArgs()
22032203
, "paramsObj.SumOf2(1,2,3,4)"
22042204
, null)
22052205
.Returns(10)
22062206
.SetCategory("ParamsKeywordMethod");
22072207

2208-
yield return new TestCaseData(evaluatorForParamsTests()
2208+
yield return new TestCaseData(evaluatorForMethodArgs()
22092209
, "string.Join(\",\", 2, 3.5, \"Hello\", true)"
22102210
, null)
22112211
.Returns("2,3.5,Hello,True")
22122212
.SetCategory("ParamsKeywordMethod");
22132213

2214-
yield return new TestCaseData(evaluatorForParamsTests()
2214+
yield return new TestCaseData(evaluatorForMethodArgs()
22152215
, "string.Join(\",\", 2, 3.5, null, \"Hello\", true)"
22162216
, null)
22172217
.Returns("2,3.5,,Hello,True")
22182218
.SetCategory("ParamsKeywordMethod");
22192219

2220-
yield return new TestCaseData(evaluatorForParamsTests()
2220+
yield return new TestCaseData(evaluatorForMethodArgs()
22212221
, "\",\".UseAsSepForJoin(2, 3.5, \"Hello\", true)"
22222222
, null)
22232223
.Returns("2,3.5,Hello,True")
22242224
.SetCategory("ParamsKeywordMethod");
22252225

2226-
yield return new TestCaseData(evaluatorForParamsTests()
2226+
yield return new TestCaseData(evaluatorForMethodArgs()
22272227
, "\",\".UseAsSepForJoin(2, 3.5, null, \"Hello\", true)"
22282228
, null)
22292229
.Returns("2,3.5,,Hello,True")
22302230
.SetCategory("ParamsKeywordMethod");
22312231

2232-
yield return new TestCaseData(evaluatorForParamsTests()
2232+
yield return new TestCaseData(evaluatorForMethodArgs()
22332233
, "paramsObj.Join(out x, \",\", 2, 3.5, \"Hello\", true) ?? x"
22342234
, null)
22352235
.Returns("2,3.5,Hello,True")
22362236
.SetCategory("ParamsKeywordMethod");
22372237

2238-
yield return new TestCaseData(evaluatorForParamsTests()
2238+
yield return new TestCaseData(evaluatorForMethodArgs()
22392239
, "paramsObj.Join(out x, \",\", 2, 3.5, null, \"Hello\", true) ?? x"
22402240
, null)
22412241
.Returns("2,3.5,,Hello,True")
22422242
.SetCategory("ParamsKeywordMethod");
22432243

2244-
yield return new TestCaseData(evaluatorForParamsTests()
2244+
yield return new TestCaseData(evaluatorForMethodArgs()
22452245
, "\",\".UseAsSepForJoin(ref string x, 2, 3.5, \"Hello\", true) ?? x"
22462246
, null)
22472247
.Returns("2,3.5,Hello,True")
22482248
.SetCategory("ParamsKeywordMethod");
22492249

2250-
yield return new TestCaseData(evaluatorForParamsTests()
2250+
yield return new TestCaseData(evaluatorForMethodArgs()
22512251
, "\",\".UseAsSepForJoin(ref x, 2, 3.5, null, \"Hello\", true) ?? x"
22522252
, null)
22532253
.Returns("2,3.5,,Hello,True")
22542254
.SetCategory("ParamsKeywordMethod");
22552255

2256-
yield return new TestCaseData(evaluatorForParamsTests()
2256+
yield return new TestCaseData(evaluatorForMethodArgs()
22572257
, "paramsObj.ReturnTrue(2)"
22582258
, null)
22592259
.Returns(true)
22602260
.SetCategory("ParamsKeywordMethod");
2261-
2262-
yield return new TestCaseData(evaluatorForParamsTests()
2261+
2262+
yield return new TestCaseData(evaluatorForMethodArgs()
22632263
, "paramsObj.ReturnTrue(2, \"Hello\")"
22642264
, null)
22652265
.Returns(true)
22662266
.SetCategory("ParamsKeywordMethod");
2267-
2268-
yield return new TestCaseData(evaluatorForParamsTests()
2267+
2268+
yield return new TestCaseData(evaluatorForMethodArgs()
22692269
, "paramsObj.ReturnTrue(2, \"Hello\", \"Test\")"
22702270
, null)
22712271
.Returns(true)
22722272
.SetCategory("ParamsKeywordMethod");
22732273

22742274
#endregion
22752275

2276+
#region Method parameters with default value
2277+
2278+
yield return new TestCaseData(evaluatorForMethodArgs()
2279+
, "paramsObj.GetTheDefaultValue()"
2280+
, null)
2281+
.Returns(10)
2282+
.SetCategory("ParamsKeywordMethod");
2283+
2284+
yield return new TestCaseData(evaluatorForMethodArgs()
2285+
, "paramsObj.GetTheDefaultValue(15)"
2286+
, null)
2287+
.Returns(15)
2288+
.SetCategory("ParamsKeywordMethod");
2289+
2290+
yield return new TestCaseData(evaluatorForMethodArgs()
2291+
, "paramsObj.GetTheDefaultValue(\"default value is \")"
2292+
, null)
2293+
.Returns("default value is 20")
2294+
.SetCategory("ParamsKeywordMethod");
2295+
2296+
yield return new TestCaseData(evaluatorForMethodArgs()
2297+
, "paramsObj.GetTheDefaultValue(\"given value is \", 25)"
2298+
, null)
2299+
.Returns("given value is 25")
2300+
.SetCategory("ParamsKeywordMethod");
2301+
2302+
#endregion
2303+
22762304
#region Bug resolution
22772305

22782306
yield return new TestCaseData(new ExpressionEvaluator()

CodingSeb.ExpressionEvaluator.Tests/TestsUtils/MethodArgKeywordClass.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,16 @@ public bool ReturnTrue(double dValue, params string[] values)
3333
{
3434
return true;
3535
}
36+
37+
public int GetTheDefaultValue(int defaultValue = 10)
38+
{
39+
return defaultValue;
40+
}
41+
42+
public string GetTheDefaultValue(string text, int defaultValue = 20)
43+
{
44+
return text + defaultValue.ToString();
45+
}
3646
}
3747

3848
public static class MethodArgKeywordClassExtension

CodingSeb.ExpressionEvaluator/ExpressionEvaluator.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3172,6 +3172,7 @@ bool parameterValidate(ParameterInfo p) => p.Position >= modifiedArgs.Count
31723172

31733173
bool methodByNameFilter(MethodInfo m) => m.Name.Equals(func, StringComparisonForCasing)
31743174
&& (m.GetParameters().Length == modifiedArgs.Count
3175+
|| (m.GetParameters().Length > modifiedArgs.Count && m.GetParameters().Take(modifiedArgs.Count).All(p => modifiedArgs[p.Position] == null || IsCastable(modifiedArgs[p.Position].GetType(), p.ParameterType)) && m.GetParameters().Skip(modifiedArgs.Count).All(p => p.HasDefaultValue))
31753176
|| (m.GetParameters().Last().IsDefined(typeof(ParamArrayAttribute), false)
31763177
&& m.GetParameters().All(parameterValidate)));
31773178

@@ -3249,6 +3250,10 @@ protected virtual MethodInfo TryToCastMethodParametersToMakeItCallable(MethodInf
32493250
{
32503251
modifiedArgs.Add(Activator.CreateInstance(methodInfoToCast.GetParameters().Last().ParameterType, new object[] { 0 }));
32513252
}
3253+
else if(methodInfoToCast.GetParameters().Length > modifiedArgs.Count)
3254+
{
3255+
modifiedArgs.AddRange(methodInfoToCast.GetParameters().Skip(modifiedArgs.Count).Select(p => p.DefaultValue));
3256+
}
32523257

32533258
for (int a = 0; a < modifiedArgs.Count && parametersCastOK; a++)
32543259
{

0 commit comments

Comments
 (0)