Skip to content

Commit 4c72cff

Browse files
bluewingHuangbluewingHuang
authored andcommitted
add more unittest for issue 499
1 parent 9163a83 commit 4c72cff

1 file changed

Lines changed: 139 additions & 5 deletions

File tree

test/FastExpressionCompiler.IssueTests/Issue499_InvalidProgramException_for_Sorting_and_comparison_function.cs

Lines changed: 139 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,10 @@ public void Run(TestRun t)
1717
{
1818
Quicksort_partition_with_nested_loops(t);
1919
Comparison_function_with_goto_labels(t);
20-
ArrayInList_ArrayAcceesError(t);
20+
ArrayInList_NullableInt_ArrayAccessError(t);
21+
ArrayInList_Int_ArrayAccessError(t);
22+
ArrayInList_String_ArrayAccessError(t);
23+
ArrayInList_Struct_ArrayAccess(t);
2124
}
2225

2326
// Reproduces the sorting use-case from https://github.com/dadhi/FastExpressionCompiler/issues/499
@@ -159,7 +162,7 @@ public void Comparison_function_with_goto_labels(TestContext t)
159162
/// ff raise System.InvalidProgramException: Common Language Runtime detected an invalid program.
160163
/// </summary>
161164
/// <param name="t"></param>
162-
public void ArrayInList_ArrayAcceesError(TestContext t)
165+
public void ArrayInList_NullableInt_ArrayAccessError(TestContext t)
163166
{
164167
List<Expression> exps = new List<Expression>();
165168
var dataArrayList = Parameter(typeof(List<int?[]>), "dataArrayList");
@@ -174,24 +177,155 @@ public void ArrayInList_ArrayAcceesError(TestContext t)
174177
exps.Add(Assign(left_ListIndex, Constant(0)));
175178
exps.Add(Assign(left_ArrayIndex, Constant(0)));
176179
exps.Add(Assign(leftVars[0], ArrayAccess(Expression.Property(dataArrayList, "Item", left_ListIndex), left_ArrayIndex)));
180+
LabelTarget endMain = Expression.Label(typeof(int?), "endMain");
181+
exps.Add(Expression.Label(endMain, leftVars[0]));
177182

178183
BlockExpression block = Block(
179184
vars.ToArray(), exps
180185
);
181-
var expr = Lambda<Action<List<int?[]>>>(block, dataArrayList);
186+
var expr = Lambda<Func<List<int?[]>, int?>>(block, dataArrayList);
182187
expr.PrintCSharp();
183188

184189
List<int?[]> data1 = new List<int?[]> { new int?[] { 1 } };
185190
List<int?[]> data2 = new List<int?[]> { new int?[] { 1 } };
186191

192+
var fs = expr.CompileSys();
193+
fs.PrintIL();
194+
t.AreEqual(1, fs(data1));
195+
196+
var ff = expr.CompileFast(ifFastFailedReturnNull: true);
197+
t.IsNotNull(ff);
198+
ff.PrintIL();
199+
t.AreEqual(1, ff(data2));
200+
}
201+
202+
/// <summary>
203+
/// ff raise System.InvalidProgramException: Common Language Runtime detected an invalid program.
204+
/// </summary>
205+
/// <param name="t"></param>
206+
public void ArrayInList_Int_ArrayAccessError(TestContext t)
207+
{
208+
List<Expression> exps = new List<Expression>();
209+
var dataArrayList = Parameter(typeof(List<int[]>), "dataArrayList");
210+
List<ParameterExpression> vars = new List<ParameterExpression>();
211+
var left_ListIndex = Parameter(typeof(int), "left_ListIndex");
212+
var left_ArrayIndex = Parameter(typeof(int), "left_ArrayIndex");
213+
214+
vars.AddRange(new ParameterExpression[] { left_ListIndex, left_ArrayIndex });
215+
var leftVars = new ParameterExpression[1];
216+
leftVars[0] = Parameter(typeof(int), $"left_{0}");
217+
vars.Add(leftVars[0]);
218+
exps.Add(Assign(left_ListIndex, Constant(0)));
219+
exps.Add(Assign(left_ArrayIndex, Constant(0)));
220+
exps.Add(Assign(leftVars[0], ArrayAccess(Expression.Property(dataArrayList, "Item", left_ListIndex), left_ArrayIndex)));
221+
LabelTarget endMain = Expression.Label(typeof(int), "endMain");
222+
exps.Add(Expression.Label(endMain, leftVars[0]));
223+
224+
BlockExpression block = Block(
225+
vars.ToArray(), exps
226+
);
227+
var expr = Lambda<Func<List<int[]>, int>>(block, dataArrayList);
228+
expr.PrintCSharp();
229+
230+
List<int[]> data1 = new List<int[]> { new int[] { 1 } };
231+
List<int[]> data2 = new List<int[]> { new int[] { 1 } };
232+
233+
var fs = expr.CompileSys();
234+
fs.PrintIL();
235+
t.AreEqual(1, fs(data1));
236+
237+
var ff = expr.CompileFast(ifFastFailedReturnNull: true);
238+
t.IsNotNull(ff);
239+
ff.PrintIL();
240+
t.AreEqual(1, ff(data2));
241+
}
242+
243+
244+
/// <summary>
245+
/// ff raise System.InvalidProgramException: Common Language Runtime detected an invalid program.
246+
/// </summary>
247+
/// <param name="t"></param>
248+
public void ArrayInList_String_ArrayAccessError(TestContext t)
249+
{
250+
List<Expression> exps = new List<Expression>();
251+
var dataArrayList = Parameter(typeof(List<string[]>), "dataArrayList");
252+
List<ParameterExpression> vars = new List<ParameterExpression>();
253+
var left_ListIndex = Parameter(typeof(int), "left_ListIndex");
254+
var left_ArrayIndex = Parameter(typeof(int), "left_ArrayIndex");
255+
256+
vars.AddRange(new ParameterExpression[] { left_ListIndex, left_ArrayIndex });
257+
var leftVars = new ParameterExpression[1];
258+
leftVars[0] = Parameter(typeof(string), $"left_{0}");
259+
vars.Add(leftVars[0]);
260+
exps.Add(Assign(left_ListIndex, Constant(0)));
261+
exps.Add(Assign(left_ArrayIndex, Constant(0)));
262+
exps.Add(Assign(leftVars[0], ArrayAccess(Expression.Property(dataArrayList, "Item", left_ListIndex), left_ArrayIndex)));
263+
LabelTarget endMain = Expression.Label(typeof(string), "endMain");
264+
exps.Add(Expression.Label(endMain, leftVars[0]));
265+
266+
BlockExpression block = Block(
267+
vars.ToArray(), exps
268+
);
269+
var expr = Lambda<Func<List<string[]>, string>>(block, dataArrayList);
270+
expr.PrintCSharp();
187271

272+
List<string[]> data1 = new List<string[]> { new string[] { "test1" } };
273+
List<string[]> data2 = new List<string[]> { new string[] { "test2" } };
188274
var fs = expr.CompileSys();
189275
fs.PrintIL();
190-
fs(data1);
276+
t.AreEqual("test1", fs(data1));
191277

192278
var ff = expr.CompileFast(ifFastFailedReturnNull: true);
193279
t.IsNotNull(ff);
194280
ff.PrintIL();
195-
ff(data2);
281+
t.AreEqual("test2", ff(data2));
282+
}
283+
284+
/// <summary>
285+
/// passed before fix issue 499
286+
/// </summary>
287+
/// <param name="t"></param>
288+
public void ArrayInList_Struct_ArrayAccess(TestContext t)
289+
{
290+
List<Expression> exps = new List<Expression>();
291+
var dataArrayList = Parameter(typeof(List<SomeStruct[]>), "dataArrayList");
292+
List<ParameterExpression> vars = new List<ParameterExpression>();
293+
var left_ListIndex = Parameter(typeof(int), "left_ListIndex");
294+
var left_ArrayIndex = Parameter(typeof(int), "left_ArrayIndex");
295+
296+
vars.AddRange(new ParameterExpression[] { left_ListIndex, left_ArrayIndex });
297+
var leftVars = new ParameterExpression[1];
298+
leftVars[0] = Parameter(typeof(int?), $"left_{0}");
299+
vars.Add(leftVars[0]);
300+
exps.Add(Assign(left_ListIndex, Constant(0)));
301+
exps.Add(Assign(left_ArrayIndex, Constant(0)));
302+
exps.Add(Assign(leftVars[0], Property(ArrayAccess(Property(dataArrayList, "Item", left_ListIndex), left_ArrayIndex), "Foo")));
303+
LabelTarget endMain = Expression.Label(typeof(int?), "endMain");
304+
exps.Add(Expression.Label(endMain, leftVars[0]));
305+
306+
BlockExpression block = Block(
307+
vars.ToArray(), exps
308+
);
309+
var expr = Lambda<Func<List<SomeStruct[]>, int?>>(block, dataArrayList);
310+
expr.PrintCSharp();
311+
312+
List<SomeStruct[]> data1 = new List<SomeStruct[]> { new SomeStruct[] { new SomeStruct { Foo = 1 } } };
313+
List<SomeStruct[]> data2 = new List<SomeStruct[]> { new SomeStruct[] { new SomeStruct { Foo = 1 } } };
314+
315+
var fs = expr.CompileSys();
316+
fs.PrintIL();
317+
var resultFs = fs(data1);
318+
t.AreEqual(1, resultFs);
319+
320+
var ff = expr.CompileFast(ifFastFailedReturnNull: true);
321+
t.IsNotNull(ff);
322+
ff.PrintIL();
323+
var resultFf = ff(data2);
324+
t.AreEqual(1, resultFf);
325+
}
326+
327+
public struct SomeStruct
328+
{
329+
public int? Foo { get; set; }
196330
}
197331
}

0 commit comments

Comments
 (0)