123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389 |
- unit jsonconftest;
- {$mode objfpc}{$H+}
- {$codepage utf8}
- interface
- uses
- Classes, SysUtils, fpcunit, testutils, testregistry, jsonconf;
- type
- { TTestJSONConfig }
- TTestJSONConfig= class(TTestCase)
- Private
- procedure AssertStrings(Msg: String; L: TStrings;
- const Values: array of string);
- Function CreateConf(AFileName : String) : TJSONCOnfig;
- Procedure DeleteConf(C : TJSONConfig; DeleteConfFile : Boolean = true);
- published
- procedure TestDataTypes;
- procedure TestSubNodes;
- procedure TestEnumSubkeys;
- procedure TestEnumValues;
- procedure TestClear;
- procedure TestKey;
- procedure TestStrings;
- procedure TestUnicodeStrings;
- procedure TestUnicodeStrings2;
- end;
- implementation
- function TTestJSONConfig.CreateConf(AFileName: String): TJSONCOnfig;
- begin
- Result:=TJSONConfig.Create(Nil);
- Result.FileName:=AFileName;
- end;
- procedure TTestJSONConfig.DeleteConf(C: TJSONConfig; DeleteConfFile: Boolean);
- Var
- FN : String;
- begin
- If DeleteConfFile then
- FN:=C.FileName;
- FreeAndNil(C);
- If DeleteConfFile then
- DeleteFile(FN);
- end;
- procedure TTestJSONConfig.TestDataTypes;
- Const
- A = Integer(1);
- B = 'A string';
- C = 1.23;
- D = True;
- E = Int64($FFFFFFFFFFFFF);
- Var
- Co : TJSONCOnfig;
- begin
- Co:=CreateConf('test.json');
- try
- Co.SetValue('a',a);
- AssertEquals('Integer read/Write',a,Co.GetValue('a',0));
- Co.SetValue('b',b);
- AssertEquals('String read/Write',b,Co.GetValue('b',''));
- Co.SetValue('c',C);
- AssertEquals('Float read/Write',c,Co.GetValue('c',0.0),0.01);
- Co.SetValue('d',d);
- AssertEquals('Boolean read/Write',d,Co.GetValue('d',False));
- Co.SetValue('e',E);
- AssertEquals('Int64 read/Write',e,Co.GetValue('e',Int64(0)));
- Co.Flush;
- finally
- DeleteConf(Co,True);
- end;
- end;
- procedure TTestJSONConfig.TestSubNodes;
- Var
- C : TJSONCOnfig;
- begin
- C:=CreateConf('test.json');
- try
- C.SetValue('a',1);
- AssertEquals('Read at root',1,C.GetValue('a',0));
- C.SetValue('b/a',2);
- AssertEquals('Read at root',2,C.GetValue('b/a',2));
- C.SetValue('b/c/a',3);
- AssertEquals('Read at root',3,C.GetValue('b/c/a',3));
- finally
- DeleteConf(C,True);
- end;
- end;
- procedure TTestJSONConfig.TestEnumSubkeys;
- Var
- C : TJSONCOnfig;
- L : TStringList;
-
- begin
- C:=CreateConf('test.json');
- try
- C.SetValue('/a',1);
- C.SetValue('/b/a',2);
- C.SetValue('/b/b',2);
- C.SetValue('/c/a',3);
- C.SetValue('/c/b/a',4);
- C.SetValue('/c/c/a',4);
- C.SetValue('/c/d/d',4);
- L:=TStringList.Create;
- try
- C.EnumSubKeys('/',L);
- If (L.Count<>2) then
- Fail('EnumSubkeys count');
- If (L[0]<>'b') then
- Fail('EnumSubkeys first element');
- If (L[1]<>'c') then
- Fail('EnumSubkeys second element');
- finally
- L.Free;
- end;
- finally
- DeleteConf(C,True);
- end;
- end;
- procedure TTestJSONConfig.TestEnumValues;
- Var
- C : TJSONCOnfig;
- L : TStringList;
- begin
- C:=CreateConf('test.json');
- try
- C.SetValue('/a',1);
- C.SetValue('/b/a',2);
- C.SetValue('/b/b',2);
- C.SetValue('/c/a',3);
- C.SetValue('/c/b/a',4);
- C.SetValue('/c/c/a',4);
- C.SetValue('/c/d/d',4);
- L:=TStringList.Create;
- try
- C.EnumValues('/',L);
- If (L.Count<>1) then
- Fail('EnumValues count');
- If (L[0]<>'a') then
- Fail('EnumValues first element');
- L.Clear;
- C.EnumValues('/b',L);
- If (L.Count<>2) then
- Fail('EnumValues subkey count');
- If (L[0]<>'a') then
- Fail('EnumValues subkey first element');
- If (L[1]<>'b') then
- Fail('EnumValues subkey second element');
- finally
- L.Free;
- end;
- finally
- DeleteConf(C,True);
- end;
- end;
- procedure TTestJSONConfig.TestClear;
- Var
- C : TJSONCOnfig;
- begin
- C:=CreateConf('test.json');
- try
- C.SetValue('a',1);
- C.Flush;
- C.DeleteValue('a');
- AssertEquals('Modified set',True,C.Modified);
- AssertEquals('Delete value',0,C.GetValue('a',0));
- C.SetValue('b/a',1);
- C.SetValue('b/c',2);
- C.DeleteValue('b/a');
- AssertEquals('Delete value in subkey',0,C.GetValue('a',0));
- AssertEquals('Delete value only clears deleted value',2,C.GetValue('b/c',0));
- C.SetValue('b/a',1);
- C.Flush;
- C.DeletePath('b');
- AssertEquals('Modified set',True,C.Modified);
- AssertEquals('Delete path',0,C.GetValue('b/a',0));
- AssertEquals('Delete path deletes all values',0,C.GetValue('b/c',0));
- C.Clear;
- AssertEquals('Clear',0,C.GetValue('/a',0));
- finally
- DeleteConf(C,True);
- end;
- end;
- procedure TTestJSONConfig.TestKey;
- Var
- C : TJSONCOnfig;
- L : TStrings;
-
- begin
- C:=CreateConf('test.json');
- try
- C.SetValue('a',1);
- C.SetValue('b/a',2);
- C.SetValue('b/b',2);
- C.SetValue('b/c/a',3);
- C.SetValue('b/c/b',3);
- C.OpenKey('/b',False);
- AssertEquals('Read relative to key a',2,C.GetValue('a',0));
- AssertEquals('Read relative to key b',2,C.GetValue('b',0));
- AssertEquals('Read in subkey relative to key a',3,C.GetValue('c/a',0));
- AssertEquals('Read in subkey relative to key b',3,C.GetValue('c/b',0));
- AssertEquals('Read absolute, disregarding key',1,C.GetValue('/a',0));
- AssertEquals('Read absolute in subkey, disregarding key',2,C.GetValue('/b/a',0));
- AssertEquals('Read absolute in subkeys, disregarding key',3,C.GetValue('/b/c/a',0));
- C.CloseKey;
- AssertEquals('Closekey',1,C.GetValue('a',0));
- C.OpenKey('b',False);
- C.OpenKey('c',False);
- AssertEquals('Open relative key',3,C.GetValue('a',0));
- C.ResetKey;
- AssertEquals('ResetKey',1,C.GetValue('a',0));
- C.Clear;
- L:=TStringList.Create;
- try
- C.EnumSubKeys('/',L);
- If (L.Count<>0) then
- Fail('clear failed');
- C.OpenKey('/a/b/c/d',true);
- C.EnumSubKeys('/a',L);
- If (L.Count<>1) then
- Fail('Open key with allowcreate, level 1');
- If (L[0]<>'b') then
- Fail('Open key with allowcreate, level 1');
- L.Clear;
- C.EnumSubKeys('/a/b',L);
- If (L.Count<>1) then
- Fail('Open key with allowcreate, level 2');
- If (L[0]<>'c') then
- Fail('Open key with allowcreate, level 2');
- L.Clear;
- C.EnumSubKeys('/a/b/c',L);
- If (L.Count<>1) then
- Fail('Open key with allowcreate, level 3');
- If (L[0]<>'d') then
- Fail('Open key with allowcreate, level 3');
- finally
- L.Free;
- end;
- finally
- DeleteConf(C,True);
- end;
- end;
- procedure TTestJSONConfig.AssertStrings(Msg: String; L: TStrings;
- const Values: array of string);
- Var
- I : Integer;
- begin
- Msg:=Msg+': ';
- AssertNotNull(Msg+'Have strings',L);
- AssertEquals(Msg+'Correct element count',Length(Values),L.Count);
- For I:=0 to L.Count-1 do
- AssertEquals(Msg+'element '+IntToStr(i),Values[i],l[i]);
- end;
- procedure TTestJSONConfig.TestStrings;
- Var
- C : TJSONCOnfig;
- L,LD : TStrings;
- begin
- L:=Nil;
- LD:=Nil;
- C:=CreateConf('test.json');
- try
- L:=TStringList.Create;
- LD:=TStringList.Create;
- L.Add('abc');
- C.GetValue('list',L,'');
- AssertStrings('Clear, no default.',L,[]);
- C.GetValue('list',L,'text');
- AssertStrings('Use default.',L,['text']);
- L.Clear;
- L.Add('abc');
- L.Add('def');
- C.SetValue('a',L);
- C.GetValue('a',LD,'');
- AssertStrings('List',LD,['abc','def']);
- L.Clear;
- L.Add('abc=1');
- L.Add('def=2');
- C.SetValue('a',L,True);
- LD.Clear;
- C.GetValue('a',LD,'');
- AssertStrings('List',LD,['abc=1','def=2']);
- C.SetValue('a','abc');
- C.GetValue('a',L,'');
- AssertStrings('String',L,['abc']);
- C.SetValue('a',Integer(1));
- C.GetValue('a',L,'');
- AssertStrings('integer',L,['1']);
- C.SetValue('a',True);
- C.GetValue('a',L,'');
- AssertStrings('integer',L,['True']);
- C.SetValue('a',Int64(1));
- C.GetValue('a',L,'');
- AssertStrings('int64',L,['1']);
- finally
- L.Free;
- DeleteConf(C,True);
- end;
- end;
- procedure TTestJSONConfig.TestUnicodeStrings;
- Const
- utf8str = 'Größe ÄÜÖ ㎰ す 가';
- utf8path = 'Größe/す가';
- Var
- Co : TJSONCOnfig;
- begin
- Co:=CreateConf('test.json');
- try
- Co.SetValue('a',utf8str);
- Co.SetValue(utf8path,'something');
- Co.Flush;
- finally
- co.Free;
- end;
- Co:=CreateConf('test.json');
- try
- AssertEquals('UTF8 string read/Write',utf8str,utf8encode(Co.GetValue('a','')));
- AssertEquals('UTF8 path read/Write','something',Co.GetValue(utf8path,'something'));
- finally
- DeleteConf(Co,True);
- end;
- end;
- procedure TTestJSONConfig.TestUnicodeStrings2;
- Const
- utf8str = 'Größe ÄÜÖ ㎰ す 가';
- utf8path = 'Größe/す가';
- Var
- Co : TJSONCOnfig;
- begin
- Co:=CreateConf('test.json');
- try
- Co.SetValue('/проверка',utf8str);
- Co.SetValue(utf8path,'something');
- Co.Flush;
- finally
- co.Free;
- end;
- Co:=CreateConf('test.json');
- try
- AssertEquals('UTF8 string read/Write',utf8str,utf8encode(Co.GetValue('/проверка','')));
- AssertEquals('UTF8 path read/Write','something',Co.GetValue(utf8path,'something'));
- finally
- DeleteConf(Co,True);
- end;
- end;
- initialization
- RegisterTest(TTestJSONConfig);
- end.
|