mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-15 22:59:51 +02:00
281 lines
5.4 KiB
ObjectPascal
281 lines
5.4 KiB
ObjectPascal
unit RegTestBasics;
|
|
|
|
{$IFDEF FPC}
|
|
{$mode objfpc}{$H+}
|
|
{$ENDIF}
|
|
|
|
interface
|
|
|
|
uses
|
|
fpcunit, testutils, testregistry, testdecorator, Classes, SysUtils;
|
|
|
|
type
|
|
|
|
{ TTestBasics }
|
|
|
|
TTestBasics = class(TTestCase)
|
|
private
|
|
procedure DeleteUserXmlFile;
|
|
protected
|
|
published
|
|
procedure TestSimpleWinRegistry;
|
|
procedure TestDoubleWrite;
|
|
procedure bug16395;
|
|
procedure TestStringList;
|
|
Procedure TestInt64;
|
|
Procedure TestDeleteSubkey;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
registry;
|
|
|
|
{ TTestBasics }
|
|
|
|
procedure TTestBasics.DeleteUserXmlFile;
|
|
{$ifndef windows}
|
|
var
|
|
fn: string;
|
|
{$endif}
|
|
begin
|
|
{$ifdef windows}
|
|
with TRegistry.Create do
|
|
try
|
|
DeleteKey('FirstNode');
|
|
finally
|
|
Free;
|
|
end;
|
|
{$else}
|
|
FN:=includetrailingpathdelimiter(GetAppConfigDir(False))+'reg.xml';
|
|
if FileExists(FN) then
|
|
AssertTrue(DeleteFile(FN));
|
|
{$endif}
|
|
end;
|
|
|
|
procedure TTestBasics.TestSimpleWinRegistry;
|
|
var
|
|
Registry : TRegistry;
|
|
begin
|
|
Registry := TRegistry.Create(KEY_READ);
|
|
Registry.RootKey:=HKEY_LOCAL_MACHINE;
|
|
|
|
// use a hopefully non existing key
|
|
AssertFalse(Registry.KeyExists('FPC1234'));
|
|
{$ifdef windows}
|
|
AssertTrue(Registry.KeyExists('SOFTWARE'));
|
|
{$endif}
|
|
|
|
Registry.Free;
|
|
end;
|
|
|
|
procedure TTestBasics.TestDoubleWrite;
|
|
begin
|
|
DeleteUserXmlFile;
|
|
with TRegistry.Create do
|
|
try
|
|
OpenKey('FirstNode', true);
|
|
WriteString('LAYOUT', '');
|
|
CloseKey;
|
|
finally
|
|
Free;
|
|
end;
|
|
with TRegistry.Create do
|
|
try
|
|
OpenKey('FirstNode', true);
|
|
WriteString('LAYOUT', '');
|
|
CloseKey;
|
|
finally
|
|
Free;
|
|
end;
|
|
DeleteUserXmlFile;
|
|
end;
|
|
|
|
procedure TTestBasics.bug16395;
|
|
var
|
|
r: TRegistry;
|
|
s,t: string;
|
|
begin
|
|
DeleteUserXmlFile;
|
|
|
|
r := TRegistry.Create;
|
|
try
|
|
r.RootKey := HKEY_CURRENT_USER;
|
|
r.OpenKey('FirstNode', true);
|
|
r.WriteString('string1', '');
|
|
r.CloseKey;
|
|
finally
|
|
r.Free;
|
|
end;
|
|
|
|
// verify that empty value can be changed to non-empty one
|
|
r := TRegistry.Create;
|
|
try
|
|
r.RootKey := HKEY_CURRENT_USER;
|
|
r.OpenKey('FirstNode',false);
|
|
s := r.ReadString('string1');
|
|
AssertEquals('Failed to read back an empty string', '', s);
|
|
r.WriteString('string1', 'string_value_1');
|
|
r.CloseKey;
|
|
finally
|
|
r.Free;
|
|
end;
|
|
|
|
// verify that non-empty value can be changed to empty one
|
|
r := TRegistry.Create;
|
|
try
|
|
r.RootKey := HKEY_CURRENT_USER;
|
|
r.OpenKey('FirstNode',false);
|
|
s := r.ReadString('string1');
|
|
AssertEquals('Failed chaning empty string value to non-empty one', 'string_value_1',s);
|
|
|
|
r.WriteString('string1', '');
|
|
r.CloseKey;
|
|
finally
|
|
r.Free;
|
|
end;
|
|
|
|
r := TRegistry.Create;
|
|
try
|
|
r.RootKey := HKEY_CURRENT_USER;
|
|
r.OpenKey('FirstNode',false);
|
|
s := r.ReadString('string1');
|
|
AssertEquals('Failed changing non-empty string value to empty one', '', s);
|
|
r.CloseKey;
|
|
finally
|
|
r.Free;
|
|
end;
|
|
|
|
r := TRegistry.Create;
|
|
try
|
|
r.RootKey := HKEY_CURRENT_USER;
|
|
r.OpenKey('LongNode',true);
|
|
t:=StringOfChar('*',4000);
|
|
r.WriteString('LongString',T);
|
|
s := r.ReadString('LongString');
|
|
AssertEquals('Writing long string works OK', t, s);
|
|
r.CloseKey;
|
|
finally
|
|
r.Free;
|
|
end;
|
|
|
|
DeleteUserXmlFile;
|
|
end;
|
|
|
|
Procedure TTestBasics.TestStringList;
|
|
|
|
Var
|
|
SL : TStringList;
|
|
I : Integer;
|
|
|
|
begin
|
|
With TRegistry.Create do
|
|
try
|
|
RootKey:=HKEY_CURRENT_USER;
|
|
OpenKey('Software/Test',True);
|
|
SL:=TstringList.Create;
|
|
For I:=0 to 10 do
|
|
SL.Add(IntToStr(I));
|
|
WriteStringList('me',SL);
|
|
SL.Clear;
|
|
ReadStringList('me',SL);
|
|
For I:=0 to 10 do
|
|
AssertEquals('String '+IntToStr(i),IntToStr(I),SL[I]);
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
|
|
procedure TTestBasics.TestInt64;
|
|
|
|
|
|
|
|
Var
|
|
Def,I64 : Int64;
|
|
|
|
begin
|
|
def:=MaxInt*1024;
|
|
With TRegistry.Create do
|
|
try
|
|
RootKey:=HKEY_CURRENT_USER;
|
|
OpenKey('Software/Test',True);
|
|
WriteInt64('you',Def);
|
|
I64:=ReadInt64('you');
|
|
AssertEquals('Value written and read',Def,I64);
|
|
finally
|
|
Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TTestBasics.TestDeleteSubKey;
|
|
|
|
const
|
|
BugID = 'Bug35132';
|
|
Base = 'Software\' + BugID;
|
|
One = 'One';
|
|
OneFull = Base + '\' + One;
|
|
Two = 'Two';
|
|
TwoFull = OneFull + '\' + Two;
|
|
|
|
|
|
procedure CleanUp(AssertionFailed: Boolean);
|
|
var
|
|
R: TRegistry;
|
|
B: Boolean;
|
|
begin
|
|
R := TRegistry.Create(KEY_ALL_ACCESS);
|
|
try
|
|
R.RootKey := HKEY_CURRENT_USER;
|
|
if R.KeyExists(TwoFull) then
|
|
begin
|
|
B := R. DeleteKey(TwoFull);
|
|
if B then B := R.DeleteKey(OneFull);
|
|
if B then B := R.DeleteKey(Base);
|
|
AssertTrue('cleanup OK',B);
|
|
end;
|
|
finally
|
|
R.Free;
|
|
end;
|
|
end;
|
|
|
|
var
|
|
R: TRegistry;
|
|
B: Boolean;
|
|
begin
|
|
R := TRegistry.Create(KEY_ALL_ACCESS);
|
|
try
|
|
R.RootKey := HKEY_CURRENT_USER;
|
|
|
|
B := R.OpenKey(Base, True);
|
|
AssertTrue(format('OpenKey(''%s'') failed.',[Base]),B);
|
|
|
|
B := R.OpenKey('One',True);
|
|
AssertTrue(format('OpenKey(''%s'') failed.',[OneFull]),B);
|
|
|
|
B := R.OpenKey('Two',True);
|
|
AssertTrue(format('OpenKey(''%s'') failed.',[TwoFull]),B);
|
|
|
|
R.CloseKey;
|
|
|
|
B := R.KeyExists(TwoFull);
|
|
AssertTrue(format('KeyExists(''%s'') failed.',[TwoFull]),B);
|
|
|
|
R.CloseKey;
|
|
B := R.OpenKey(Base,False);
|
|
AssertTrue(format('OpenKey(''%s'') failed.',[Base]),B);
|
|
|
|
B := R.DeleteKey('One');
|
|
AssertTrue(format('DeleteKey(''%s'') should have succeeded, but it failed.',[OneFull]),B);
|
|
finally
|
|
R.Free;
|
|
CleanUp(ExceptObject <> nil);
|
|
end;
|
|
end;
|
|
|
|
|
|
initialization
|
|
RegisterTest(TTestBasics);
|
|
end.
|
|
|