123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230 |
- { %TARGET=win32,win64,wince,linux,solaris,openbsd }
- {
- This unit tests mostly TRegIniFile to work properly and be Delphi compatible.
- This test also runs on non-Windows platforms where XML registry is used.
- Please keep this test Delphi compatible.
- }
- {$ifdef FPC} {$mode delphi} {$endif}
- uses
- {$ifdef unix}
- cwstring,
- {$endif unix}
- SysUtils, Classes, registry;
- {$ifdef FPC}
- {$WARN implicit_string_cast_loss off}
- {$WARN symbol_deprecated off}
- {$endif FPC}
- const
- STestRegPath = 'Software\FPC-RegTest';
-
- procedure TestFailed(ErrCode: integer);
- begin
- writeln('Test FAILED. Error code: ' + IntToStr(ErrCode));
- Halt(ErrCode);
- end;
- procedure ClearReg(const KeyName: string = '');
- begin
- with TRegistry.Create do
- try
- DeleteKey(STestRegPath);
- finally
- Free;
- end;
- end;
- function NormPath(const s: string): string;
- begin
- Result:=StringReplace(s, '/', '\', [rfReplaceAll]);
- end;
- procedure DoRegTest2;
- var
- reg: TRegistry;
- ri: TRegIniFile;
- rini: TRegistryIniFile;
- sl: TStringList;
- begin
- ClearReg;
- try
- reg:=TRegistry.Create;
- try
- { The test key must be deleted by ClearReg() }
- if reg.KeyExists(STestRegPath) then
- TestFailed(1);
- if reg.OpenKey(STestRegPath, False) then
- TestFailed(2);
- if not reg.OpenKey(STestRegPath, True) then
- TestFailed(5);
- if NormPath(reg.CurrentPath) <> STestRegPath then
- TestFailed(6);
- reg.WriteString('Item1', '1');
- if not reg.OpenKey('\' + STestRegPath + '\1', True) then
- TestFailed(10);
- reg.WriteString('Item2', '2');
- if NormPath(reg.CurrentPath) <> STestRegPath + '\1' then
- TestFailed(15);
- reg.CloseKey;
- if NormPath(reg.CurrentPath) <> '' then
- TestFailed(20);
- if reg.KeyExists(STestRegPath + '\' + STestRegPath) then
- TestFailed(21);
- finally
- reg.Free;
- end;
- ri:=TRegIniFile.Create(STestRegPath);
- with ri do
- try
- if ReadString('', 'Item1', '') <> '1' then
- TestFailed(101);
- if ReadString('1', 'Item2', '') <> '2' then
- TestFailed(105);
- if NormPath(ri.CurrentPath) <> STestRegPath then
- TestFailed(110);
- if ReadString('', 'Item1', '') <> '1' then
- TestFailed(115);
- if not ValueExists('Item1') then
- TestFailed(120);
- WriteInteger('1', 'Item3', 3);
- sl:=TStringList.Create;
- try
- ReadSectionValues('1', sl);
- if sl.Count <> 2 then
- TestFailed(125);
- if sl.Values['Item2'] <> '2' then
- TestFailed(130);
- if sl.Values['Item3'] <> '3' then
- TestFailed(135);
- finally
- sl.Free;
- end;
- WriteInteger('', 'Item4', 4);
- WriteInteger('', 'Item41', 41);
- WriteInteger('', 'Item42', 42);
- if GetDataType('Item4') <> rdString then
- TestFailed(140);
- if ReadString('', 'Item41', '') <> '41' then
- TestFailed(141);
- if ReadString('', 'Item42', '') <> '42' then
- TestFailed(142);
- finally
- Free;
- end;
- { \ at the beginning of the path must be accepted }
- ri:=TRegIniFile.Create('\' + STestRegPath);
- with ri do
- try
- if ReadString('', 'Item1', '') <> '1' then
- TestFailed(145);
- finally
- Free;
- end;
- { Write to non-existing key must work }
- ri:=TRegIniFile.Create(STestRegPath + '\2\3\4');
- with ri do
- try
- if FileName <> NormPath(CurrentPath) then
- TestFailed(147);
- if CurrentKey = 0 then
- TestFailed(148);
- WriteInteger('', 'Item5', 5);
- WriteInteger('5', 'Item6', 6);
- if ReadInteger('', 'Item5', 0) <> 5 then
- TestFailed(150);
- if ReadInteger('5', 'Item6', 0) <> 6 then
- TestFailed(160);
- finally
- Free;
- end;
- rini:=TRegistryIniFile.Create(STestRegPath);
- with rini do
- try
- if ReadString('', 'Item1', '') <> '1' then
- TestFailed(201);
- { \ is not allowed as a section name }
- if ReadString('\', 'Item1', '') = '1' then
- TestFailed(202);
- if ReadString('1', 'Item2', '') <> '2' then
- TestFailed(205);
- { Trailing \ is allowed }
- if ReadString('1\', 'Item2', '') <> '2' then
- TestFailed(206);
- if ReadString('', 'Item1', '') <> '1' then
- TestFailed(210);
- if not ValueExists('', 'Item4') then
- TestFailed(215);
- if not ValueExists('1', 'Item2') then
- TestFailed(220);
- if ReadInteger('2\3\4\5', 'Item6', 0) <> 6 then
- TestFailed(225);
- if ReadInteger('2\3\4', 'Item5', 0) <> 5 then
- TestFailed(230);
- EraseSection('2');
- if SectionExists('2\3') then
- TestFailed(245);
- if ValueExists('2\3\4', 'Item5') then
- TestFailed(240);
- WriteString('2\3\4', 'Item10', '10');
- if ReadInteger('2\3\4', 'Item10', 0) <> 10 then
- TestFailed(245);
- { Check access via a full path }
- if not SectionExists('\' + STestRegPath) then
- TestFailed(250);
- if ReadInteger('\2\3\4', 'Item10', 0) = 10 then
- TestFailed(255);
- if ReadInteger('\' + STestRegPath + '\2\3\4', 'Item10', 0) <> 10 then
- TestFailed(260);
- finally
- Free;
- end;
- finally
- ClearReg;
- end;
- { Test if all test keys have been deleted by ClearReg() }
- reg:=TRegistry.Create;
- try
- if reg.KeyExists(STestRegPath) then
- TestFailed(501);
- if reg.OpenKey(STestRegPath, False) then
- TestFailed(502);
- if reg.OpenKey(STestRegPath + '\2', False) then
- TestFailed(503);
- finally
- reg.Free;
- end;
- end;
- procedure DeleteUserXmlFile;
- begin
- {$ifdef FPC}
- DeleteFile(Includetrailingpathdelimiter(GetAppConfigDir(False))+'reg.xml');
- RemoveDir(GetAppConfigDir(False));
- {$endif FPC}
- end;
- begin
- try
- DoRegTest2;
- finally
- DeleteUserXmlFile;
- end;
- end.
|