2
0

testspecifictmemdataset.pas 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. unit TestSpecificTMemDataSet;
  2. {
  3. Unit tests which are specific to TMemDataset
  4. }
  5. {$mode objfpc}{$H+}
  6. {$codepage UTF8}
  7. interface
  8. uses
  9. Classes, SysUtils,
  10. testregistry,
  11. ToolsUnit;
  12. type
  13. { TTestSpecificTMemDataset }
  14. TTestSpecificTMemDataset = class(TDBBasicsTestCase)
  15. private
  16. protected
  17. published
  18. procedure TestClear;
  19. procedure TestFileName;
  20. procedure TestCopyFromDataset; //is copied dataset identical to original?
  21. procedure TestCopyFromDatasetMoved; //move record then copy. Is copy identical? Has record position changed?
  22. Procedure TestLocateUTF8;
  23. end;
  24. implementation
  25. uses
  26. MemDS, db;
  27. const
  28. Test_FileName='test.dat';
  29. { TTestSpecificTMemDataset }
  30. procedure TTestSpecificTMemDataset.TestClear;
  31. const
  32. testValuesCount=3;
  33. var
  34. i: integer;
  35. begin
  36. with DBConnector.GetNDataset(10) as TMemDataset do
  37. begin
  38. Open;
  39. Clear;
  40. // test after FieldDefs are Cleared, if internal structures are updated properly
  41. // create other FieldDefs
  42. FieldDefs.Add('Fs', ftString, 20);
  43. FieldDefs.Add('Fi', ftInteger);
  44. FieldDefs.Add('Fi2', ftInteger);
  45. // use only Open without CreateTable
  46. Open;
  47. CheckTrue(IsEmpty);
  48. CheckEquals(0, DataSize);
  49. // add some data
  50. for i:=1 to testValuesCount do
  51. AppendRecord([TestStringValues[i], TestIntValues[i], TestIntValues[i]]);
  52. // check data
  53. CheckEquals(testValuesCount, RecordCount);
  54. First;
  55. for i:=1 to testValuesCount do
  56. begin
  57. CheckEquals(TestStringValues[i], FieldByName('Fs').AsString);
  58. CheckEquals(TestIntValues[i], FieldByName('Fi2').AsInteger);
  59. Next;
  60. end;
  61. CheckTrue(Eof);
  62. end;
  63. end;
  64. procedure TTestSpecificTMemDataset.TestFileName;
  65. var memds1, memds2: TMemDataset;
  66. begin
  67. memds1:=DBConnector.GetFieldDataset as TMemDataset;
  68. memds2:=DBConnector.GetNDataset(0) as TMemDataset;
  69. memds1.Open;
  70. memds1.SaveToFile(Test_FileName);
  71. memds1.Close;
  72. memds1.Clear;
  73. memds1.FileName:=Test_FileName;
  74. memds1.Open;
  75. CheckFieldDatasetValues(memds1);
  76. // try read same file into different dataset, testing if FieldDefs are updated properly
  77. memds2.FileName:=Test_FileName;
  78. memds2.Open;
  79. CheckFieldDatasetValues(memds2);
  80. DeleteFile(memds2.FileName);
  81. end;
  82. procedure TTestSpecificTMemDataset.TestCopyFromDataset;
  83. var memds1, memds2: TMemDataset;
  84. i: integer;
  85. begin
  86. memds1:=DBConnector.GetFieldDataset as TMemDataset;
  87. memds2:=DBConnector.GetNDataset(0) as TMemDataset;
  88. memds1.Open;
  89. // insert 1st row with all NULL values
  90. memds1.Insert; memds1.Post;
  91. memds2.CopyFromDataset(memds1);
  92. // check if 1st row has all NULL values
  93. for i:=0 to memds2.FieldCount-1 do CheckTrue(memds2.Fields[i].IsNull, 'IsNull');
  94. memds2.Delete;
  95. CheckFieldDatasetValues(memds2);
  96. end;
  97. procedure TTestSpecificTMemDataset.TestCopyFromDatasetMoved;
  98. var
  99. memds1, memds2: TMemDataset;
  100. CurrentID,NewID: integer;
  101. begin
  102. memds1:=DBConnector.GetFieldDataset as TMemDataset;
  103. memds2:=DBConnector.GetNDataset(0) as TMemDataset;
  104. memds1.Open;
  105. memds1.Next; //this should not influence the copydataset step.
  106. CurrentID:=memds1.FieldByName('ID').AsInteger;
  107. memds2.CopyFromDataset(memds1);
  108. CheckFieldDatasetValues(memds2);
  109. NewID:=memds1.FieldByName('ID').AsInteger;
  110. CheckEquals(CurrentID,NewID,'Mismatch between ID field contents - the record has moved.');
  111. end;
  112. procedure TTestSpecificTMemDataset.TestLocateUTF8;
  113. Var
  114. MemDataset1: TMemDataset;
  115. S : UTF8String;
  116. begin
  117. MemDataset1:=TMemDataset.Create(Nil);
  118. With MemDataset1 do
  119. try
  120. FieldDefs.Add('first',ftString,40,0,true,False,1,cp_UTF8);
  121. FieldDefs.Add('second',ftString,40,0,true,False,2,cp_ACP);
  122. CreateTable;
  123. Active:=True;
  124. Append;
  125. Fields[0].AsUTF8String:='♯abcd';
  126. Fields[1].AsString:='native';
  127. Post;
  128. Append;
  129. Fields[0].AsUTF8String:='défaut';
  130. Fields[1].AsString:='morenative';
  131. Post;
  132. First;
  133. While not eof do
  134. begin
  135. S:=fields[0].AsUTF8String;
  136. Writeln(S);
  137. next;
  138. end;
  139. First;
  140. AssertTrue('UTF8 1 ok',Locate('first','♯abcd',[]));
  141. AssertTrue('UTF8 2 ok',Locate('first','défaut',[]));
  142. AssertTrue('ANSI 1 ok',Locate('second','native',[]));
  143. AssertTrue('ANSI 1 ok',Locate('second','morenative',[]));
  144. finally
  145. Free;
  146. end;
  147. end;
  148. initialization
  149. if uppercase(dbconnectorname)='MEMDS' then
  150. begin
  151. RegisterTestDecorator(TDBBasicsTestSetup, TTestSpecificTMemDataset);
  152. end;
  153. end.