Skip to content

Commit c336b8d

Browse files
committed
fixed defect in Equals method that takes an array
1 parent 5ea0e6b commit c336b8d

File tree

2 files changed

+23
-4
lines changed

2 files changed

+23
-4
lines changed

Source/Base/Collections/Spring.Collections.Base.pas

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -989,13 +989,13 @@ function TEnumerableBase<T>.EqualsTo(const values: array of T): Boolean;
989989
i := 0;
990990
enumerator := IEnumerable<T>(this).GetEnumerator;
991991
comparer := IEqualityComparer<T>(_LookupVtableInfo(giEqualityComparer, GetElementType, SizeOf(T)));
992-
while enumerator.MoveNext and (i < Length(values)) do
992+
while enumerator.MoveNext do
993993
begin
994-
if not comparer.Equals(enumerator.Current, values[i]) then
995-
Break;
994+
if (i > High(values)) or not comparer.Equals(enumerator.Current, values[i]) then
995+
Exit(False);
996996
Inc(i);
997997
end;
998-
Result := i = Length(values);
998+
Result := i > High(values);
999999
end;
10001000

10011001
function TEnumerableBase<T>.EqualsTo(const values: IEnumerable<T>): Boolean;

Tests/Source/Base/Spring.Tests.Collections.pas

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -184,6 +184,9 @@ TTestIntegerList = class(TTestCase)
184184
procedure TestTryMethodsReturnDefaultWhenFalse;
185185

186186
procedure TestDeleteRangeEmptyList;
187+
188+
procedure EqualsToArray;
189+
procedure EqualsToEnumerable;
187190
end;
188191

189192
TTestStringList = class(TTestCase)
@@ -1068,6 +1071,22 @@ procedure TTestNormalHashSet.TestSetEqualsList;
10681071

10691072
{$REGION 'TTestIntegerList'}
10701073

1074+
procedure TTestIntegerList.EqualsToArray;
1075+
begin
1076+
SimpleFillList;
1077+
CheckFalse(SUT.EqualsTo([1, 2]));
1078+
CheckTrue(SUT.EqualsTo([1, 2, 3]));
1079+
CheckFalse(SUT.EqualsTo([1, 2, 3, 4]));
1080+
end;
1081+
1082+
procedure TTestIntegerList.EqualsToEnumerable;
1083+
begin
1084+
SimpleFillList;
1085+
CheckFalse(SUT.EqualsTo(TEnumerable.From<Integer>([1, 2])));
1086+
CheckTrue(SUT.EqualsTo(TEnumerable.From<Integer>([1, 2, 3])));
1087+
CheckFalse(SUT.EqualsTo(TEnumerable.From<Integer>([1, 2, 3, 4])));
1088+
end;
1089+
10711090
procedure TTestIntegerList.GetCapacity;
10721091
begin
10731092
SimpleFillList;

0 commit comments

Comments
 (0)