Skip to content

Commit f3a37d6

Browse files
committed
make enumerating datasets consistent with other objects using in/of on for loops
1 parent 551ab9c commit f3a37d6

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/Sempare.Template.Evaluate.pas

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -503,7 +503,10 @@ procedure TEvaluationTemplateVisitor.Visit(const AStmt: IForInStmt);
503503

504504
while not LDataSetEOFProperty.GetValue(LObj).AsBoolean and ((LLimit = -1) or (LLoops < LLimit)) do
505505
begin
506-
FStackFrames.peek[LVariableName] := LIdx;
506+
if AStmt.ForOp = foIn then
507+
FStackFrames.peek[LVariableName] := LIdx - 1
508+
else
509+
FStackFrames.peek[LVariableName] := LLoopExpr;
507510
if HandleLoop then
508511
break;
509512
LDataSetNextMethod.Invoke(LObj, []);

tests/Sempare.Template.TestFor.pas

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -147,19 +147,38 @@ procedure TTestTemplateFor.TestDataSet;
147147
var
148148
ds: TDataSet;
149149
begin
150+
// traditional
150151
ds := CreateMockUsersTable();
151152
try
152153
Assert.AreEqual('joe pete jane ', //
153154
Template.Eval('<% for i in _ %><% _[''name''] %> <%end%>', ds));
154155
finally
155156
ds.Free;
156157
end;
158+
// index in
159+
ds := CreateMockUsersTable();
160+
try
161+
Assert.AreEqual('0 1 2 ', //
162+
Template.Eval('<% for i in _ %><% i %> <%end%>', ds));
163+
finally
164+
ds.Free;
165+
end;
166+
// index of
167+
ds := CreateMockUsersTable();
168+
try
169+
Assert.AreEqual('joe pete jane ', //
170+
Template.Eval('<% for i of _ %><% i[''name''] %> <%end%>', ds));
171+
finally
172+
ds.Free;
173+
end;
174+
157175
end;
158176

159177
procedure TTestTemplateFor.TestDataSetWithEvent;
160178
var
161179
ds: TDataSet;
162180
begin
181+
// traditional
163182
ds := CreateMockUsersTable();
164183
try
165184
Assert.AreEqual('<ul><li>joe</li><li>pete</li><li>jane</li></ul>', //
@@ -175,6 +194,40 @@ procedure TTestTemplateFor.TestDataSetWithEvent;
175194
finally
176195
ds.Free;
177196
end;
197+
198+
// using index in
199+
ds := CreateMockUsersTable();
200+
try
201+
Assert.AreEqual('<ul><li>0</li><li>1</li><li>2</li></ul>', //
202+
Template.Eval('<% for i in _ %><li><% i %></li><% onbegin%><ul><%onend%></ul><%end%>', ds));
203+
204+
ds.Delete();
205+
ds.Delete();
206+
ds.Delete();
207+
208+
Assert.AreEqual('<h1>No values</h1>', //
209+
Template.Eval('<% for i in _ %><li><% i %></li><% onbegin%><ul><%onend%></ul><% onempty%><h1>No values</h1><%end%>', ds));
210+
211+
finally
212+
ds.Free;
213+
end;
214+
215+
// using index of
216+
ds := CreateMockUsersTable();
217+
try
218+
Assert.AreEqual('<ul><li>joe</li><li>pete</li><li>jane</li></ul>', //
219+
Template.Eval('<% for i of _ %><li><% i[''name''] %></li><% onbegin%><ul><%onend%></ul><%end%>', ds));
220+
221+
ds.Delete();
222+
ds.Delete();
223+
ds.Delete();
224+
225+
Assert.AreEqual('<h1>No values</h1>', //
226+
Template.Eval('<% for i in _ %><li><% [''name''] %></li><% onbegin%><ul><%onend%></ul><% onempty%><h1>No values</h1><%end%>', ds));
227+
228+
finally
229+
ds.Free;
230+
end;
178231
end;
179232

180233
procedure TTestTemplateFor.TestDataSetCount;

0 commit comments

Comments
 (0)