/
lasersquad
/
DynamicArrays
Обзор
Документация
Войти
/
lasersquad
/
DynamicArrays
Код
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
dynamicarrays/prj/Delphi/DynamicArraysOTests/DynamicArraysStringFixTest.pas
463 строки
11 KB
lasersquad0
new files with tests
20 май 2026, 23:18
20 май 2026, 23:18
ccf62a3
Код
Авторство
О чём код?
unit DynamicArraysStringFixTest; interface uses SysUtils, DUnitX.TestFrameWork, BaseTest; type [TestFixture] TTestTHArrayStringFix = class(TBaseTest) public [Setup] procedure SetUp; [TearDown] procedure TearDown; [Test] procedure testTHArrayStringFix1; [Test] procedure testTHArrayStringFix2; [Test] procedure testTHArrayStringFix3; [Test] procedure testTHArrayStringFix4; [Test] procedure testTHArrayStringFix5; [Test] procedure testTHArrayStringFix6; [Test] procedure testTHArrayStringFixZeroLength; [Test] procedure testTHArrayStringFixSetLength; [Test] procedure testTHArrayStringFixAddMany; [Test] procedure testTHArrayStringFixPerformance; end; implementation uses Windows, DynamicArraysUtils, DynamicArrays; procedure TTestTHArrayStringFix.SetUp; begin end; procedure TTestTHArrayStringFix.TearDown; begin end; procedure TTestTHArrayStringFix.testTHArrayStringFix1; var arr: THArrayStringFix; begin try arr := THArrayStringFix.Create; Fail('We should not be here'); except on E:Exception do CheckEquals('Constructor THArrayStringFix.Create() is prohibited, use THArrayStringFix.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 TTestTHArrayStringFix.testTHArrayStringFix2; var arr:THArrayStringFix; begin arr := THArrayStringFix.CreateSize(3); // *** size here in symbols (not bytes) *** 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('�����'); // non-english symbols CheckEquals(7, arr.Count); CheckEquals(8, arr.Capacity); CheckTrue(arr.Memory <> nil); CheckEquals('', arr[0]); CheckEquals('a', arr[1]); CheckEquals('11', arr[2]); CheckEquals('bbb', arr[3]); CheckEquals('bbb', arr[4]); CheckEquals('bbb', arr[5]); CheckEquals('���', arr[6]); CheckEquals(-1, arr.IndexOf('bbbb')); CheckEquals(-1, arr.IndexOf('bbbbbb')); CheckEquals(-1, arr.IndexOf('aa')); CheckEquals(-1, arr.IndexOf('AA')); CheckEquals(-1, arr.IndexOf('A')); CheckEquals(-1, arr.IndexOf('1')); CheckEquals(-1, arr.IndexOf('bb')); CheckEquals(-1, arr.IndexOf('��')); CheckEquals(-1, arr.IndexOf('���')); CheckEquals(0, arr.IndexOf('')); CheckEquals(2, arr.IndexOf('11')); CheckEquals(1, arr.IndexOf('a')); CheckEquals(3, arr.IndexOf('bbb')); CheckEquals(3, arr.IndexOf('bbb')); CheckEquals(6, arr.IndexOf('���')); arr.Free; end; procedure TTestTHArrayStringFix.testTHArrayStringFix3; var arr:THArrayStringFix; begin arr := THArrayStringFix.CreateSize(5); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckTrue(arr.Memory = nil); 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; CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckTrue(arr.Memory = nil); 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; CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); CheckTrue(arr.Memory = nil); arr.Free; end; procedure TTestTHArrayStringFix.testTHArrayStringFix4; var arr:THArrayStringFix; begin arr := THArrayStringFix.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 TTestTHArrayStringFix.testTHArrayStringFix5; var arr:THArrayStringFix; begin arr := THArrayStringFix.CreateSize(1); CheckEquals(0, arr.Count); arr.AddValue(''); arr.AddValue('a'); arr.AddValue('11'); arr.AddValue('bbb'); arr.AddValue('5555'); arr.AddValue('dfgh'); arr.AddValue('\'); CheckEquals(7, arr.Count); CheckEquals('', arr[0]); CheckEquals('a', arr[1]); CheckEquals('1', arr[2]); CheckEquals('b', arr[3]); CheckEquals('5', arr[4]); CheckEquals('d', arr[5]); CheckEquals('\', 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 TTestTHArrayStringFix.testTHArrayStringFix6; var arr: THArrayStringFix; begin arr := THArrayStringFix.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('', arr[0]); arr.AddValue('a'); CheckEquals(2, arr.Count); CheckEquals(4, arr.Capacity); CheckEquals('', arr[0]); CheckEquals('a', arr[1]); arr.AddValue('b1'); CheckEquals(3, arr.Count); CheckEquals(4, arr.Capacity); CheckEquals('', arr[0]); CheckEquals('a', arr[1]); CheckEquals('b', arr[2]); arr.Free; end; procedure TTestTHArrayStringFix.testTHArrayStringFixZeroLength; var arr:THArrayStringFix; begin arr := THArrayStringFix.CreateSize(0); CheckEquals(0, arr.Count); arr.AddValue(''); CheckEquals(1, arr.Count); CheckEquals('', arr[0]); arr.AddValue('a'); CheckEquals(2, arr.Count); CheckEquals('', arr[0]); CheckEquals('', arr[1]); arr.AddValue('a1'); CheckEquals(3, arr.Count); CheckEquals('', arr[0]); CheckEquals('', arr[1]); CheckEquals('', arr[2]); arr.Free; end; procedure TTestTHArrayStringFix.testTHArrayStringFixSetLength; const FIELD_SIZE = 20; var arr:THArrayStringFix; str: string; begin arr := THArrayStringFix.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('1234', arr[0]); CheckEquals('1234', arr[1]); finally arr.Free; end; end; procedure TTestTHArrayStringFix.testTHArrayStringFixAddMany; const STR_FIX_LEN = 10; var arr: THArray; val, val2: string; begin arr := THArrayStringFix.CreateSize(STR_FIX_LEN); CheckEquals(0, arr.Count); CheckEquals(0, arr.Capacity); val := '54321'; arr.AddMany(PChar(val), 1); val := '1234567890'; arr.AddMany(PChar(val), 1); val := '12345678901'; arr.AddMany(PChar(val), 1); val := 'ansi'; arr.AddMany(PChar(val), 1); CheckEquals(4, arr.Count); CheckEquals(4, arr.Capacity); val := 'STRING'; arr.AddMany(PChar(val), 1); CheckEquals(5, arr.Count); CheckEquals(8, arr.Capacity); SetLength(val2, STR_FIX_LEN); arr.Get(0, PChar(val2)); SetLength(val2, Length('54321')); CheckEquals('54321', val2); SetLength(val2, STR_FIX_LEN); arr.Get(1, PChar(val2)); SetLength(val2, Length('1234567890')); CheckEquals('1234567890', val2); SetLength(val2, STR_FIX_LEN); arr.Get(2, PChar(val2)); SetLength(val2, Length('1234567890')); CheckEquals('1234567890', val2); SetLength(val2, STR_FIX_LEN); arr.Get(3, PChar(val2)); SetLength(val2, Length('ansi')); CheckEquals('ansi', val2); SetLength(val2, STR_FIX_LEN); arr.Get(4, PChar(val2)); SetLength(val2, Length('STRING')); CheckEquals('STRING', val2); arr.Free; end; procedure TTestTHArrayStringFix.testTHArrayStringFixPerformance; const NUM_ITEMS = 50_000_000; var arr: THArrayStringFix; i: Integer; start, stop1, stop2, stop3: Cardinal; str, val: string; begin arr := THArrayStringFix.CreateSize(20); // field size 20sym=40 bytes arr.SetCapacity(NUM_ITEMS); str := '12345678901234567890123456789012345678901234567890'; start := GetTickCount; for i := 1 to NUM_ITEMS do begin arr.AddValue(str); // 50 symbols=100 bytes end; stop1 := GetTickCount; for i := 1 to NUM_ITEMS do begin val := arr[i-1]; Check(20 = Length(val)); end; stop2 := GetTickCount; for i := 1 to NUM_ITEMS do begin arr[i - 1] := str; 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(TTestTHArrayStringFix); end.