/
lasersquad
/
DynamicArrays
Обзор
Документация
Войти
/
lasersquad
/
DynamicArrays
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
dynamicarrays/prj/Delphi/DynamicArraysOTests/DynamicArraysAnsiStringFixTest.pas
469 строк
12 KB
lasersquad0
new files with tests
20 май 2026, 23:18
20 май 2026, 23:18
ccf62a3
Код
Авторство
О чём код?
unit DynamicArraysAnsiStringFixTest; interface uses SysUtils, DUnitX.TestFramework, BaseTest; type [TestFixture] TTestTHArrayAnsiStringFix = class(TBaseTest) public [Setup] procedure SetUp; [TearDown] procedure TearDown; [Test] procedure testTHArrayAnsiStringFix1; [Test] procedure testTHArrayAnsiStringFix2; [Test] procedure testTHArrayAnsiStringFix3; [Test] procedure testTHArrayAnsiStringFix4; [Test] procedure testTHArrayAnsiStringFix5; [Test] procedure testTHArrayAnsiStringFix6; [Test] procedure testTHArrayAnsiStringFixZeroLength; [Test] procedure testTHArrayAnsiStringFixSetLength; [Test] procedure testTHArrayAnsiStringFixAddMany; [Test] procedure testTHArrayAnsiStringFixPerformance; end; implementation uses Windows, DynamicArrays, DynamicArraysUtils; procedure TTestTHArrayAnsiStringFix.SetUp; begin end; procedure TTestTHArrayAnsiStringFix.TearDown; begin end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFix1; var arr: THArrayAnsiStringFix; begin try arr := THArrayAnsiStringFix.Create; Fail('We should not be here'); except on E:Exception do CheckEquals('Constructor THArrayAnsiStringFix.Create() is prohibited, use THArrayAnsiStringFix.CreateSize(SizeOfItem: Cardinal) instead.', E.Message); end; { roma 23.01.2005 try arr := THArrayStringFix.CreateSize(0); Check(False); except on E:Exception do CheckEquals('The parameter Size cannot be zero!', E.Message); end; } end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFix2; var arr:THArrayAnsiStringFix; begin arr := THArrayAnsiStringFix.CreateSize(5); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckTrue(arr.Memory = nil); arr.AddValue(''); arr.AddValue('a'); arr.AddValue('11'); arr.AddValue('bbb'); arr.AddValue('bbbb'); arr.AddValue('bbbbb'); arr.AddValue('bbbbbb'); CheckEquals(7, arr.Count); CheckEquals(8, arr.Capacity); CheckTrue(arr.Memory <> nil); CheckEquals(AnsiString(''), arr[0]); CheckEquals(AnsiString('a'), arr[1]); CheckEquals(AnsiString('11'), arr[2]); CheckEquals(AnsiString('bbb'), arr[3]); CheckEquals(AnsiString('bbbb'), arr[4]); CheckEquals(AnsiString('bbbbb'), arr[5]); CheckEquals(AnsiString('bbbbb'), arr[6]); CheckEquals(-1, arr.IndexOf('bbbbbb')); CheckEquals(-1, arr.IndexOf('aa')); CheckEquals(-1, arr.IndexOf('1')); CheckEquals(-1, arr.IndexOf('bb')); CheckEquals(0, arr.IndexOf('')); CheckEquals(2, arr.IndexOf('11')); CheckEquals(1, arr.IndexOf('a')); CheckEquals(3, arr.IndexOf('bbb')); CheckEquals(4, arr.IndexOf('bbbb')); CheckEquals(5, arr.IndexOf('bbbbb')); arr.Free; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFix3; var arr:THArrayAnsiStringFix; begin arr := THArrayAnsiStringFix.CreateSize(5); CheckEquals(0, arr.Count); try arr.Value[0] := 'aaa'; Fail('We should not be here'); except on E:ERangeError do CheckEquals('Element with index 0 not found !', E.Message); end; try arr.Value[1] := 'aaa'; Fail('We should not be here'); except on E:ERangeError do CheckEquals('Element with index 1 not found !', E.Message); end; arr.Free; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFix4; var arr:THArrayAnsiStringFix; begin arr := THArrayAnsiStringFix.CreateSize(1024); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckTrue(arr.Memory = nil); CheckEquals(-1, arr.IndexOf('')); CheckEquals(-1, arr.IndexOf('n')); CheckEquals(-1, arr.IndexOfFrom('', 1)); CheckEquals(-1, arr.IndexOf('g'), 10); // weird third parameter should be string arr.AddValue('4444'); arr.AddValue('1234567890'); CheckEquals(2, arr.Count); CheckEquals(4, arr.Capacity); CheckTrue(arr.Memory <> nil); CheckEquals(-1, arr.IndexOf('')); CheckEquals(-1, arr.IndexOf('n')); CheckEquals(-1, arr.IndexOf('4')); CheckEquals(-1, arr.IndexOf('444')); CheckEquals( 0, arr.IndexOf('4444')); CheckEquals(-1, arr.IndexOf('44444')); CheckEquals(-1, arr.IndexOf('123456789')); CheckEquals( 1, arr.IndexOf('1234567890')); CheckEquals(-1, arr.IndexOf('1234567890 ')); CheckEquals(-1, arr.IndexOf('1234567890'), 2); CheckEquals(-1, arr.IndexOf('1234567890'), 3); CheckEquals(-1, arr.IndexOf('1234567890'), 4); CheckEquals(-1, arr.IndexOfFrom('', 0)); CheckEquals(-1, arr.IndexOfFrom('n', 0)); CheckEquals(-1, arr.IndexOfFrom('4', 0)); CheckEquals(-1, arr.IndexOfFrom('444', 0)); CheckEquals( 0, arr.IndexOfFrom('4444', 0)); CheckEquals(-1, arr.IndexOfFrom('44444', 0)); CheckEquals(-1, arr.IndexOfFrom('123456789', 0)); CheckEquals( 1, arr.IndexOfFrom('1234567890', 0)); CheckEquals(-1, arr.IndexOfFrom('', 1)); CheckEquals(-1, arr.IndexOfFrom('n', 1)); CheckEquals(-1, arr.IndexOfFrom('4', 1)); CheckEquals(-1, arr.IndexOfFrom('444', 1)); CheckEquals(-1, arr.IndexOfFrom('4444', 1)); CheckEquals(-1, arr.IndexOfFrom('44444', 1)); CheckEquals(1, arr.IndexOfFrom('1234567890', 0)); CheckEquals(1, arr.IndexOfFrom('1234567890', 1)); CheckEquals(-1, arr.IndexOfFrom('1234567890', 2)); CheckEquals(-1, arr.IndexOfFrom('', 2)); CheckEquals(-1, arr.IndexOfFrom('n', 2)); CheckEquals(-1, arr.IndexOfFrom('4', 2)); CheckEquals(-1, arr.IndexOfFrom('444', 2)); CheckEquals(-1, arr.IndexOfFrom('4444', 2)); CheckEquals(-1, arr.IndexOfFrom('44444', 2)); CheckEquals(-1, arr.IndexOfFrom('123456789', 2)); CheckEquals(-1, arr.IndexOfFrom('1234567890', 2)); arr.Free; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFix5; var arr:THArrayAnsiStringFix; begin arr := THArrayAnsiStringFix.CreateSize(1); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckTrue(arr.Memory = nil); arr.AddValue(''); arr.AddValue('a'); arr.AddValue('11'); arr.AddValue('bbb'); arr.AddValue('5555'); arr.AddValue('dfgh'); arr.AddValue('\'); CheckEquals(7, arr.Count); CheckEquals(8, arr.Capacity); CheckTrue(arr.Memory <> nil); CheckEquals(AnsiString(''), arr[0]); CheckEquals(AnsiString('a'), arr[1]); CheckEquals(AnsiString('1'), arr[2]); CheckEquals(AnsiString('b'), arr[3]); CheckEquals(AnsiString('5'), arr[4]); CheckEquals(AnsiString('d'), arr[5]); CheckEquals(AnsiString('\'), arr[6]); CheckEquals(-1, arr.IndexOf('bbbbbb')); CheckEquals(-1, arr.IndexOf('aa')); CheckEquals( 2, arr.IndexOf('1')); CheckEquals(-1, arr.IndexOf('bb')); CheckEquals( 0, arr.IndexOf('')); CheckEquals(-1, arr.IndexOf('11')); CheckEquals( 1, arr.IndexOf('a')); CheckEquals(-1, arr.IndexOf('bbb')); CheckEquals(-1, arr.IndexOf('5555')); CheckEquals( 6, arr.IndexOf('\')); arr.Free; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFixZeroLength; var arr: THArrayAnsiStringFix; begin { try arr := THArrayAnsiStringFix.CreateSize(0); Check(False); except on E:EInvalidOpException do CheckEquals('Value of parameter Size should be greater than zero.', e.Message); end; } arr := THArrayAnsiStringFix.CreateSize(0); CheckEquals(0, arr.ItemSize); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckEquals(nil, arr.Memory); arr.AddValue('some'); CheckEquals(1, arr.Count); CheckEquals(4, arr.Capacity); CheckEquals(nil, arr.Memory); arr.AddValue('some2'); arr.AddValue(''); CheckEquals(3, arr.Count); CheckEquals(4, arr.Capacity); CheckEquals(nil, arr.Memory); CheckEquals(AnsiString(''), arr.Value[0]); CheckEquals(AnsiString(''), arr.Value[1]); CheckEquals(AnsiString(''), arr[2]); arr.Free; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFix6; var arr: THArrayAnsiStringFix; begin arr := THArrayAnsiStringFix.CreateSize(1); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckTrue(arr.Memory = nil); arr.AddValue(''); CheckEquals(1, arr.Count); CheckEquals(4, arr.Capacity); CheckEquals(AnsiString(''), arr[0]); arr.AddValue('a'); CheckEquals(2, arr.Count); CheckEquals(4, arr.Capacity); CheckEquals(AnsiString(''), arr[0]); CheckEquals(AnsiString('a'), arr[1]); arr.AddValue('b1'); CheckEquals(3, arr.Count); CheckEquals(4, arr.Capacity); CheckEquals(AnsiString(''), arr[0]); CheckEquals(AnsiString('a'), arr[1]); CheckEquals(AnsiString('b'), arr[2]); arr.Free; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFixSetLength; const FIELD_SIZE = 20; var arr:THArrayAnsiStringFix; str: AnsiString; begin arr := THArrayAnsiStringFix.CreateSize(FIELD_SIZE); // emulate DB field string with length 20 try CheckEquals(0, arr.Count); str := '1234'; SetLength(str, FIELD_SIZE); str[5] := #0; // this is to avoid grbage symbols after 1234 after SetLength. arr.AddValue('1234'); arr.AddValue(str); CheckEquals(2, arr.Count); CheckEquals(arr[0], arr[1]); CheckEquals(AnsiString('1234'), arr[0]); CheckEquals(AnsiString('1234'), arr[1]); finally arr.Free; end; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFixAddMany; const STR_FIX_LEN = 10; var arr: THArray; val, val2: AnsiString; begin arr := THArrayAnsiStringFix.CreateSize(STR_FIX_LEN); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); val := AnsiString('54321'); arr.AddMany(PAnsiChar(val), 1); val := AnsiString('1234567890'); arr.AddMany(PAnsiChar(val), 1); val := AnsiString('12345678901'); arr.AddMany(PAnsiChar(val), 1); val := AnsiString('ansi'); arr.AddMany(PAnsiChar(val), 1); CheckEquals(4, arr.Count); CheckEquals(4, arr.Capacity); val := AnsiString('STRING'); arr.AddMany(PAnsiChar(val), 1); CheckEquals(5, arr.Count); CheckEquals(8, arr.Capacity); SetLength(val2, STR_FIX_LEN); arr.Get(0, PAnsiChar(val2)); SetLength(val2, Length('54321')); CheckEquals(AnsiString('54321'), val2); SetLength(val2, STR_FIX_LEN); arr.Get(1, PAnsiChar(val2)); SetLength(val2, Length('1234567890')); CheckEquals(AnsiString('1234567890'), val2); SetLength(val2, STR_FIX_LEN); arr.Get(2, PAnsiChar(val2)); SetLength(val2, Length('1234567890')); CheckEquals(AnsiString('1234567890'), val2); SetLength(val2, STR_FIX_LEN); arr.Get(3, PAnsiChar(val2)); SetLength(val2, Length('ansi')); CheckEquals(AnsiString('ansi'), val2); SetLength(val2, STR_FIX_LEN); arr.Get(4, PAnsiChar(val2)); SetLength(val2, Length('STRING')); CheckEquals(AnsiString('STRING'), val2); arr.Free; end; procedure TTestTHArrayAnsiStringFix.testTHArrayAnsiStringFixPerformance; const NUM_ITEMS = 50_000_000; var arr: THArrayAnsiStringFix; i: Integer; astr: AnsiString; start, stop1, stop2, stop3: Cardinal; val: AnsiString; begin arr := THArrayAnsiStringFix.CreateSize(40); // field size 40sym=40 bytes arr.SetCapacity(NUM_ITEMS); astr := '12345678901234567890123456789012345678901234567890'; start := GetTickCount; for i := 1 to NUM_ITEMS do begin arr.AddValue(astr); // 50 symbols=50 bytes end; stop1 := GetTickCount; for i := 1 to NUM_ITEMS do begin val := arr[i-1]; CheckTrue(40 = Length(val)); end; stop2 := GetTickCount; for i := 1 to NUM_ITEMS do begin arr[i - 1] := astr; end; stop3 := GetTickCount; TDUnitX.CurrentRunner.Log(Format('Inserting %d items takes %s', [NUM_ITEMS, MillisecToStr(stop1 - start)])); TDUnitX.CurrentRunner.Log(Format('Getting %d items takes %s', [NUM_ITEMS, MillisecToStr(stop2 - stop1)])); TDUnitX.CurrentRunner.Log(Format('Setting %d items takes %s', [NUM_ITEMS, MillisecToStr(stop3 - stop2)])); // Status(Format('Inserting %d items takes %s', [NUM_ITEMS, MillisecToStr(stop1 - start)])); // Status(Format('Getting %d items takes %s', [NUM_ITEMS, MillisecToStr(stop2 - stop1)])); // Status(Format('Setting %d items takes %s', [NUM_ITEMS, MillisecToStr(stop3 - stop2)])); arr.Free; //Check(False, 'THIS IS TEST FAILURE TO BE ABLE TO SHOW PERFORMANCE MESSAGE FOR THIS TEST'); end; initialization TDUnitX.RegisterTestFixture(TTestTHArrayAnsiStringFix); end.