unit uutlLinqTests; {$mode objfpc}{$H+} {$IFDEF UTL_NESTED_PROCVARS} {$modeswitch nestedprocvars} {$ENDIF} interface {$IFDEF UTL_ENUMERATORS} uses Classes, SysUtils, TestFramework, uutlLinq; type TutlLinqTests = class(TTestCase) published procedure proc_Count; procedure proc_Any; procedure proc_Contains; procedure proc_Contains_WithComparer; procedure proc_ToArray; procedure proc_Reverse; procedure proc_Skip; procedure proc_Take; procedure proc_Concat; procedure proc_Concat_WithArray; {$IFDEF UTL_ADVANCED_ENUMERATORS} procedure proc_Sort; procedure proc_Sort_WithComparer; procedure proc_Where_WithFilter; procedure proc_Where_WithNormalCallback; procedure proc_Where_WithObjectCallback; {$IFDEF UTL_NESTED_PROCVARS} procedure proc_Where_WithNestedCallback; {$ENDIF} procedure proc_Distinct; procedure proc_Distinct_WithComparer; procedure proc_Intersect; procedure proc_Intersect_WithComparer; procedure proc_Union; procedure proc_Union_WithComparer; procedure proc_Without; procedure proc_Without_WithComparer; procedure proc_Select_WithSelector; procedure proc_Select_WithNormalCallback; procedure proc_Select_WithObjectCallback; {$IFDEF UTL_NESTED_PROCVARS} procedure proc_Select_WithNestedCallback; {$ENDIF} procedure proc_SelectMany_WithSelector; procedure proc_SelectMany_WithNormalCallback; procedure proc_SelectMany_WithObjectCallback; {$IFDEF UTL_NESTED_PROCVARS} procedure proc_SelectMany_WithNestedCallback; {$ENDIF} procedure proc_Zip; {$ENDIF} end; {$ENDIF} implementation {$IFDEF UTL_ENUMERATORS} uses uutlEnumerator, uutlComparer, uutlFilter, uutlTypes, uutlInterfaces; type TIntArrEnumerator = specialize TutlArrayEnumerator; TStringArrEnumerator = specialize TutlArrayEnumerator; TCallbackObject = class(TInterfacedObject, specialize IutlFilter, specialize IutlSelector) public function Filter(constref i: Integer): Boolean; function Select(constref i: Integer): Single; end; TSelectManyObject = class(TInterfacedObject, specialize IutlSelector>) public function Select(constref i: Integer): specialize IutlEnumerator; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //Helper//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TestFilter(constref i: Integer): Boolean; begin result := (i mod 2) = 0; end; function TestSelector(constref i: Integer): Single; begin result := i / 2.0; end; function TestManySelector(constref i: Integer): specialize IutlEnumerator; var data: array of Single; begin SetLength(data, 3); data[0] := 10 * i + 1.5; data[1] := 10 * i + 5.0; data[2] := 10 * i + 7.5; result := specialize TutlArrayEnumerator.Create(data); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TCallbackObject.Filter(constref i: Integer): Boolean; begin result := TestFilter(i); end; function TCallbackObject.Select(constref i: Integer): Single; begin result := TestSelector(i); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TSelectManyObject.Select(constref i: Integer): specialize IutlEnumerator; begin result := TestManySelector(i); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function CreateArrayEnumerator(const aSize: Integer; const aStartIndex: Integer = 1): TIntArrEnumerator.IutlEnumerator; var arr: array of Integer; i: Integer; begin SetLength(arr, aSize); for i := low(arr) to high(arr) do arr[i] := aStartIndex + i; result := TIntArrEnumerator.Create(arr); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function CreateArrayEnumerator(const aData: array of Integer): TIntArrEnumerator.IutlEnumerator; var arr: array of Integer; i: Integer; begin SetLength(arr, Length(aData)); for i := low(arr) to high(arr) do arr[i] := aData[i]; result := TIntArrEnumerator.Create(arr); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function CreateStringEnumerator(const aData: array of String): TStringArrEnumerator.IutlEnumerator; var arr: array of String; i: Integer; begin SetLength(arr, Length(aData)); for i := low(arr) to high(arr) do arr[i] := aData[i]; result := TStringArrEnumerator.Create(arr); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TutlLinqTests///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Count; var e: TIntArrEnumerator.IutlEnumerator; begin e := CreateArrayEnumerator(10); AssertEquals(10, specialize utlCount(e)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Any; begin AssertFalse(specialize utlAny(CreateArrayEnumerator(0))); AssertTrue (specialize utlAny(CreateArrayEnumerator(1))); AssertTrue (specialize utlAny(CreateArrayEnumerator(2))); AssertTrue (specialize utlAny(CreateArrayEnumerator(9))); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Contains; begin AssertFalse(specialize utlContains(CreateArrayEnumerator(10), 11)); AssertFalse(specialize utlContains(CreateArrayEnumerator(10), -1)); AssertTrue (specialize utlContains(CreateArrayEnumerator(10), 4)); AssertTrue (specialize utlContains(CreateArrayEnumerator(10), 6)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Contains_WithComparer; begin AssertFalse(specialize utlContains(CreateArrayEnumerator(10), 11, specialize TutlEqualityComparer.Create)); AssertFalse(specialize utlContains(CreateArrayEnumerator(10), -1, specialize TutlEqualityComparer.Create)); AssertTrue (specialize utlContains(CreateArrayEnumerator(10), 4, specialize TutlEqualityComparer.Create)); AssertTrue (specialize utlContains(CreateArrayEnumerator(10), 6, specialize TutlEqualityComparer.Create)); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_ToArray; var arr: array of Integer; begin arr := specialize utlToArray(CreateArrayEnumerator(5)); AssertEquals(5, Length(arr)); AssertEquals(1, arr[0]); AssertEquals(2, arr[1]); AssertEquals(3, arr[2]); AssertEquals(4, arr[3]); AssertEquals(5, arr[4]); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Reverse; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlReverse(CreateArrayEnumerator(5)); e.Reset; AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Skip; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlSkip(CreateArrayEnumerator(5), 2); e.Reset; AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Take; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlTake(CreateArrayEnumerator(5), 3); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Concat; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlConcat( CreateArrayEnumerator(2, 1), CreateArrayEnumerator(2, 3)); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Concat_WithArray; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlConcat( specialize TutlArray>.Create( CreateArrayEnumerator(2, 1), CreateArrayEnumerator(2, 3), CreateArrayEnumerator(2, 5))); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertTrue (e.MoveNext); AssertEquals(6, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_ADVANCED_ENUMERATORS} procedure TutlLinqTests.proc_Sort; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlSort(CreateArrayEnumerator([1, 5, 3, 6, 7, 9, 2])); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertTrue (e.MoveNext); AssertEquals(6, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertTrue (e.MoveNext); AssertEquals(9, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Sort_WithComparer; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlSort(CreateArrayEnumerator([1, 5, 3, 6, 7, 9, 2]), specialize TutlComparer.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertTrue (e.MoveNext); AssertEquals(6, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertTrue (e.MoveNext); AssertEquals(9, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Where_WithFilter; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlWhere(CreateArrayEnumerator(5), TCallbackObject.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Where_WithNormalCallback; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlWhere(CreateArrayEnumerator(5), @TestFilter); e.Reset; AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Where_WithObjectCallback; var e: TIntArrEnumerator.IutlEnumerator; o: TCallbackObject; begin o := TCallbackObject.Create; try e := specialize utlWhere(CreateArrayEnumerator(5), @o.Filter); e.Reset; AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertFalse (e.MoveNext); finally FreeAndNil(o); end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_NESTED_PROCVARS} procedure TutlLinqTests.proc_Where_WithNestedCallback; function IsEventNested(constref i: Integer): Boolean; begin result := (i mod 2) = 0; end; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlWhere(CreateArrayEnumerator(5), @IsEventNested); e.Reset; AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertFalse (e.MoveNext); end; {$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Distinct; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlDistinct(CreateArrayEnumerator([1, 4, 3, 6, 1, 3, 4, 7 ])); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(6, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Distinct_WithComparer; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlDistinct(CreateArrayEnumerator([1, 4, 3, 6, 1, 3, 4, 7 ]), specialize TutlComparer.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(6, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Intersect; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlIntersect( CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]), CreateArrayEnumerator([ 3, 5, 4, 3 ])); e.Reset; AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Intersect_WithComparer; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlIntersect( CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]), CreateArrayEnumerator([ 3, 5, 4, 3 ]), specialize TutlComparer.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Union; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlUnion( CreateArrayEnumerator([ 2, 4, 5, 7 ]), CreateArrayEnumerator([ 3, 5, 4, 3, 8 ])); e.Reset; AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(8, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Union_WithComparer; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlUnion( CreateArrayEnumerator([ 2, 4, 5, 7 ]), CreateArrayEnumerator([ 3, 5, 4, 3, 8 ]), specialize TutlComparer.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(4, e.Current); AssertTrue (e.MoveNext); AssertEquals(5, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertTrue (e.MoveNext); AssertEquals(3, e.Current); AssertTrue (e.MoveNext); AssertEquals(8, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Without; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlWithout( CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]), CreateArrayEnumerator([ 3, 5, 4, 3 ]), specialize TutlComparer.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(6, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Without_WithComparer; var e: TIntArrEnumerator.IutlEnumerator; begin e := specialize utlWithout( CreateArrayEnumerator([ 1, 2, 3, 4, 5, 6, 7 ]), CreateArrayEnumerator([ 3, 5, 4, 3 ])); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current); AssertTrue (e.MoveNext); AssertEquals(2, e.Current); AssertTrue (e.MoveNext); AssertEquals(6, e.Current); AssertTrue (e.MoveNext); AssertEquals(7, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Select_WithSelector; var e: specialize IutlEnumerator; begin e := specialize utlSelect( CreateArrayEnumerator(4), TCallbackObject.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(0.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(2.0, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Select_WithNormalCallback; var e: specialize IutlEnumerator; begin e := specialize utlSelect( CreateArrayEnumerator(4), @TestSelector); e.Reset; AssertTrue (e.MoveNext); AssertEquals(0.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(2.0, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Select_WithObjectCallback; var o: TCallbackObject; e: specialize IutlEnumerator; begin o := TCallbackObject.Create; try e := specialize utlSelect( CreateArrayEnumerator(4), @o.Select); e.Reset; AssertTrue (e.MoveNext); AssertEquals(0.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(2.0, e.Current); AssertFalse (e.MoveNext); finally FreeAndNil(o); end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_NESTED_PROCVARS} procedure TutlLinqTests.proc_Select_WithNestedCallback; function TestSelectorNested(constref i: Integer): Single; begin result := i / 2.0; end; var e: specialize IutlEnumerator; begin e := specialize utlSelect( CreateArrayEnumerator(4), @TestSelectorNested); e.Reset; AssertTrue (e.MoveNext); AssertEquals(0.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(1.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(2.0, e.Current); AssertFalse (e.MoveNext); end; {$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_SelectMany_WithSelector; var e: specialize IutlEnumerator; begin e := specialize utlSelectMany( CreateArrayEnumerator(3), TSelectManyObject.Create); e.Reset; AssertTrue (e.MoveNext); AssertEquals(11.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(15.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(17.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(21.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(25.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(27.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(31.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(35.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(37.5, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_SelectMany_WithNormalCallback; var e: specialize IutlEnumerator; begin e := specialize utlSelectMany( CreateArrayEnumerator(3), @TestManySelector); e.Reset; AssertTrue (e.MoveNext); AssertEquals(11.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(15.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(17.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(21.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(25.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(27.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(31.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(35.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(37.5, e.Current); AssertFalse (e.MoveNext); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_SelectMany_WithObjectCallback; var o: TSelectManyObject; e: specialize IutlEnumerator; begin o := TSelectManyObject.Create; try e := specialize utlSelectMany( CreateArrayEnumerator(3), @o.Select); e.Reset; AssertTrue (e.MoveNext); AssertEquals(11.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(15.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(17.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(21.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(25.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(27.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(31.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(35.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(37.5, e.Current); AssertFalse (e.MoveNext); finally FreeAndNil(o); end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// {$IFDEF UTL_NESTED_PROCVARS} procedure TutlLinqTests.proc_SelectMany_WithNestedCallback; function TestManySelectorNested(constref i: Integer): specialize IutlEnumerator; begin result := TestManySelector(i); end; var e: specialize IutlEnumerator; begin e := specialize utlSelectMany( CreateArrayEnumerator(3), @TestManySelectorNested); e.Reset; AssertTrue (e.MoveNext); AssertEquals(11.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(15.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(17.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(21.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(25.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(27.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(31.5, e.Current); AssertTrue (e.MoveNext); AssertEquals(35.0, e.Current); AssertTrue (e.MoveNext); AssertEquals(37.5, e.Current); AssertFalse (e.MoveNext); end; {$ENDIF} //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TutlLinqTests.proc_Zip; var e: specialize IutlEnumerator>; begin e := specialize utlZip( CreateArrayEnumerator([ 1, 4, 6, 9 ]), CreateStringEnumerator([ 'fuu', 'bar', 'baz' ])); e.Reset; AssertTrue (e.MoveNext); AssertEquals(1, e.Current.First); AssertEquals('fuu', e.Current.Second); AssertTrue (e.MoveNext); AssertEquals(4, e.Current.First); AssertEquals('bar', e.Current.Second); AssertTrue (e.MoveNext); AssertEquals(6, e.Current.First); AssertEquals('baz', e.Current.Second); AssertFalse (e.MoveNext); end; {$ENDIF} initialization RegisterTest(TutlLinqTests.Suite); {$ENDIF} end.