testbasics.pas 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. unit TestBasics;
  2. {$IFDEF FPC}
  3. {$mode objfpc}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. fpcunit, testutils, testregistry, testdecorator,
  8. Classes, SysUtils;
  9. type
  10. { TTestBasics }
  11. TTestBasics = class(TTestCase)
  12. private
  13. protected
  14. published
  15. procedure TestParseSQL;
  16. procedure TestInitFielddefsFromFields;
  17. procedure TestDoubleFieldDef;
  18. procedure TestFieldDefWithoutDS;
  19. procedure TestGetParamList;
  20. procedure TestGetFieldList;
  21. procedure TestExtractFieldName; //move record then copy. Is copy identical? Has record position changed?
  22. end;
  23. implementation
  24. uses db, toolsunit;
  25. Type HackedDataset = class(TDataset);
  26. { TTestBasics }
  27. procedure TTestBasics.TestParseSQL;
  28. var Params : TParams;
  29. ReplStr : string;
  30. pb : TParamBinding;
  31. i : integer;
  32. SQLStr : string;
  33. begin
  34. Params := TParams.Create;
  35. AssertEquals( 'select * from table where id = $1',
  36. params.ParseSQL('select * from table where id = :id',true,True,True,psPostgreSQL));
  37. AssertEquals( 'select * from table where id = $1',
  38. params.ParseSQL('select * from table where id = :id',false,True,True,psPostgreSQL));
  39. AssertEquals( 'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 where (id = $2)',
  40. params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :2)',true,True,True,psPostgreSQL));
  41. AssertEquals( 'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 where (id = $3) and (test=''$test'')',
  42. params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :par3) and (test=''$test'')',true,true,true,psPostgreSQL));
  43. AssertEquals( 'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 10=$10 11=$11 12=$5 where (id = $3) and (test=''$test'')',
  44. params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 10=:par10 11=:11 12=:par5 where (id = :par3) and (test=''$test'')',true,true,true,psPostgreSQL));
  45. AssertEquals( 'select * from table where id = $1',
  46. params.ParseSQL('select * from table where id = :id',true,true,false,psSimulated,pb,ReplStr));
  47. AssertEquals('$',ReplStr);
  48. AssertEquals( 'update test set 1=$1 2=$2 3=$3 4=$4 5=$5 6=$6 7=$7 8=$8 9=$9 where (id = $2)',
  49. params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :2)',true,true,false,psSimulated,pb,ReplStr));
  50. AssertEquals('$',ReplStr);
  51. AssertEquals( 'update test set 1=$$1 2=$$2 3=$$3 4=$$4 5=$$5 6=$$6 7=$$7 8=$$8 9=$$9 where (id = $$3) and (test=''$test'')',
  52. params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 where (id = :par3) and (test=''$test'')',true,true,false,psSimulated,pb,ReplStr));
  53. AssertEquals('$$',ReplStr);
  54. AssertEquals( 'update test set 1=$$1 2=$$2 3=$$3 4=$$4 5=$$5 6=$$6 7=$$7 8=$$8 9=$$9 10=$$10 11=$$11 12=$$5 where (id = $$3) and (test=''$test'')',
  55. params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 10=:par10 11=:11 12=:par5 where (id = :par3) and (test=''$test'')',true,True,True,psSimulated));
  56. AssertEquals('$$',ReplStr);
  57. AssertEquals( 'update test set 1=$$$1 2=$$$2 3=$$$3 4=$$$4 5=$$$5 6=$$$6 7=$$$7 8=$$$8 9=$$$9 10=$$$10 11=$$$11 12=$$$5 where (id$$ = $$$3) and (test$=''$test'')',
  58. params.ParseSQL('update test set 1=:1 2=:2 3=:par3 4=:par4 5=:par5 6=:par6 7=:par7 8=:par8 9=:par9 10=:par10 11=:11 12=:par5 where (id$$ = :par3) and (test$=''$test'')',true,true,False,psSimulated,pb,ReplStr));
  59. AssertEquals('$$$',ReplStr);
  60. AssertEquals( 'select * from table where id = ?',
  61. params.ParseSQL('select * from table where id = :id',true,true,true,psInterbase));
  62. // Test bug 10345
  63. AssertEquals( 'select email from table where upper(email) like ''%''||?||''%''',
  64. params.ParseSQL('select email from table where upper(email) like ''%''||:email||''%''',true,true,true,psInterbase));
  65. // Test escape-sequences:
  66. AssertEquals( 'select * from table where ''id '''' = :id''',
  67. params.ParseSQL('select * from table where ''id '''' = :id''',true,False,True,psPostgreSQL));
  68. AssertEquals( 'select * from table where "id "" = :id"',
  69. params.ParseSQL('select * from table where "id "" = :id"',true,False,True,psPostgreSQL));
  70. AssertEquals( 'select * from table where "id \" = :id"',
  71. params.ParseSQL('select * from table where "id \" = :id"',true,True,False,psPostgreSQL));
  72. AssertEquals( 'select * from table where "id \" = $1',
  73. params.ParseSQL('select * from table where "id \" = :id',true,False,False,psPostgreSQL));
  74. AssertEquals( 'select * from table where "id = :id\',
  75. params.ParseSQL('select * from table where "id = :id\',true,True,True,psInterbase));
  76. // Test strange-field names
  77. AssertEquals( 'select * from table where "field-name" = ?',
  78. params.ParseSQL('select * from table where "field-name" = :"field-name"',true,True,True,psInterbase));
  79. AssertEquals('field-name',Params.Items[0].Name);
  80. AssertEquals( 'select * from table where "field-name" = ?',
  81. params.ParseSQL('select * from table where "field-name" = :"field-name',true,True,True,psInterbase));
  82. // Test more than 99 params - bug 19645
  83. SQLStr := 'update test set';
  84. for i := 1 to 101 do
  85. SQLStr := format('%s field%d=:par%d', [SQLStr,i,i]);
  86. AssertEquals( StringReplace(SQLStr, ':par', '$', [rfReplaceAll]),
  87. Params.ParseSQL(SQLStr, True, True, True, psPostgreSQL) );
  88. // Test comments:
  89. // Simple comment
  90. AssertEquals( 'select * from table where id= --comment :c'#10'$1-$2 or id= --:c'#13'-$3',
  91. Params.ParseSQL('select * from table where id= --comment :c'#10':a-:b or id= --:c'#13'-:d', True, True, True, psPostgreSQL));
  92. // Bracketed comment
  93. AssertEquals( 'select * from table where id=/*comment :c*/$1-$2',
  94. Params.ParseSQL('select * from table where id=/*comment :c*/:a-:b', True, True, True, psPostgreSQL));
  95. Params.Free;
  96. end;
  97. procedure TTestBasics.TestInitFielddefsFromFields;
  98. var ds : TDataset;
  99. F1,F2,F3 : Tfield;
  100. Procedure CompareFieldAndFieldDef(Fld: TField; FldDef : TFieldDef);
  101. begin
  102. AssertEquals(Fld.FieldName,FldDef.Name);
  103. AssertEquals(Fld.Size,FldDef.Size);
  104. AssertEquals(Fld.Required,FldDef.Required);
  105. AssertTrue(Fld.DataType=FldDef.DataType);
  106. end;
  107. begin
  108. ds := TDataset.Create(nil);
  109. try
  110. F1:=TStringField.Create(ds);
  111. F1.Size := 10;
  112. F1.Name := 'StringFld';
  113. F1.FieldName := 'FStringFld';
  114. F1.Required := false;
  115. F1.Dataset:=ds;
  116. F2:=TIntegerField.Create(ds);
  117. F2.Name := 'IntegerFld';
  118. F2.FieldName := 'FIntegerFld';
  119. F2.Required := True;
  120. F2.Dataset:=ds;
  121. F3:=TBCDField.Create(ds);
  122. F3.Name := 'BCDFld';
  123. F3.FieldName := 'FBCDFld';
  124. F3.Required := false;
  125. F3.Dataset:=ds;
  126. (f3 as TBCDField).Precision := 2;
  127. HackedDataset(ds).InitFieldDefsFromfields;
  128. AssertEquals(3,ds.FieldDefs.Count);
  129. CompareFieldAndFieldDef(F1,ds.FieldDefs[0]);
  130. CompareFieldAndFieldDef(F2,ds.FieldDefs[1]);
  131. CompareFieldAndFieldDef(F3,ds.FieldDefs[2]);
  132. finally
  133. ds.Free;
  134. end;
  135. end;
  136. procedure TTestBasics.TestDoubleFieldDef;
  137. var ds : TDataset;
  138. PassException : boolean;
  139. begin
  140. // If a second field with the same name is added to a TFieldDefs, an exception
  141. // should occur
  142. ds := TDataset.create(nil);
  143. try
  144. ds.FieldDefs.Add('Field1',ftInteger);
  145. PassException:=False;
  146. try
  147. ds.FieldDefs.Add('Field1',ftString,10,false)
  148. except
  149. on E: EDatabaseError do PassException := True;
  150. end;
  151. AssertTrue(PassException);
  152. finally
  153. ds.Free;
  154. end;
  155. end;
  156. procedure TTestBasics.TestFieldDefWithoutDS;
  157. var FieldDefs : TFieldDefs;
  158. begin
  159. FieldDefs := TFieldDefs.Create(nil);
  160. try
  161. FieldDefs.Add('test',ftString);
  162. finally
  163. FieldDefs.Free;
  164. end;
  165. end;
  166. procedure TTestBasics.TestGetFieldList;
  167. var
  168. ds: TDataSet;
  169. F: TField;
  170. List: TList;
  171. ExceptionRaised: Boolean;
  172. begin
  173. ds := TDataSet.Create(nil);
  174. try
  175. F := TIntegerField.Create(ds);
  176. F.FieldName := 'Field1';
  177. F.DataSet := ds;
  178. F := TIntegerField.Create(ds);
  179. F.FieldName := 'Field2';
  180. F.DataSet := ds;
  181. F := TIntegerField.Create(ds);
  182. F.FieldName := 'Field3';
  183. F.DataSet := ds;
  184. List := TList.Create;
  185. try
  186. //should not
  187. List.Clear;
  188. ds.GetFieldList(List, '');
  189. AssertEquals(0, List.Count);
  190. List.Clear;
  191. ExceptionRaised := False;
  192. try
  193. ds.GetFieldList(List, ' ');
  194. except
  195. on E: EDatabaseError do ExceptionRaised := True;
  196. end;
  197. AssertTrue(ExceptionRaised);
  198. List.Clear;
  199. ds.GetFieldList(List, 'Field1');
  200. AssertEquals(1, List.Count);
  201. List.Clear;
  202. ds.GetFieldList(List, ' Field1 ');
  203. AssertEquals(1, List.Count);
  204. List.Clear;
  205. ds.GetFieldList(List, 'Field1;Field2');
  206. AssertEquals(2, List.Count);
  207. List.Clear;
  208. ds.GetFieldList(List, 'Field1;Field2;');
  209. AssertEquals(2, List.Count);
  210. List.Clear;
  211. ds.GetFieldList(List, 'Field1;Field2;Field3');
  212. AssertEquals(3, List.Count);
  213. finally
  214. List.Destroy;
  215. end;
  216. finally
  217. ds.Destroy;
  218. end;
  219. end;
  220. procedure TTestBasics.TestGetParamList;
  221. var
  222. Params: TParams;
  223. P: TParam;
  224. List: TList;
  225. ExceptionRaised: Boolean;
  226. begin
  227. Params := TParams.Create(nil);
  228. try
  229. P := TParam.Create(Params, ptInput);
  230. P.Name := 'Param1';
  231. P := TParam.Create(Params, ptInput);
  232. P.Name := 'Param2';
  233. P := TParam.Create(Params, ptInput);
  234. P.Name := 'Param3';
  235. List := TList.Create;
  236. try
  237. List.Clear;
  238. Params.GetParamList(List, '');
  239. AssertEquals(0, List.Count);
  240. List.Clear;
  241. ExceptionRaised := False;
  242. try
  243. Params.GetParamList(List, ' ');
  244. except
  245. on E: EDatabaseError do ExceptionRaised := True;
  246. end;
  247. AssertTrue(ExceptionRaised);
  248. List.Clear;
  249. Params.GetParamList(List, 'Param1');
  250. AssertEquals(1, List.Count);
  251. List.Clear;
  252. Params.GetParamList(List, ' Param1 ');
  253. AssertEquals(1, List.Count);
  254. List.Clear;
  255. Params.GetParamList(List, 'Param1;');
  256. AssertEquals(1, List.Count);
  257. List.Clear;
  258. Params.GetParamList(List, 'Param1;Param2');
  259. AssertEquals(2, List.Count);
  260. List.Clear;
  261. Params.GetParamList(List, 'Param1;Param2;Param3');
  262. AssertEquals(3, List.Count);
  263. finally
  264. List.Destroy;
  265. end;
  266. finally
  267. Params.Destroy;
  268. end;
  269. end;
  270. procedure TTestBasics.TestExtractFieldName;
  271. var
  272. i: Integer;
  273. Fields: String;
  274. FieldName: String;
  275. begin
  276. Fields := '';
  277. i := 1;
  278. FieldName := ExtractFieldName(Fields, i);
  279. AssertEquals(1, i);
  280. AssertEquals('', FieldName);
  281. Fields := 'test';
  282. i := 1;
  283. FieldName := ExtractFieldName(Fields, i);
  284. AssertEquals(5, i);
  285. AssertEquals('test', FieldName);
  286. Fields := 'test;';
  287. i := 1;
  288. FieldName := ExtractFieldName(Fields, i);
  289. AssertEquals(6, i);
  290. AssertEquals('test', FieldName);
  291. Fields := ' test ';
  292. i := 1;
  293. FieldName := ExtractFieldName(Fields, i);
  294. AssertEquals(7, i);
  295. AssertEquals('test', FieldName);
  296. Fields := 'test;xxx';
  297. i := 1;
  298. FieldName := ExtractFieldName(Fields, i);
  299. AssertEquals(6, i);
  300. AssertEquals('test', FieldName);
  301. FieldName := ExtractFieldName(Fields, i);
  302. AssertEquals(9, i);
  303. AssertEquals('xxx', FieldName);
  304. end;
  305. initialization
  306. RegisterTest(TTestBasics);
  307. end.