testbasics.pas 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  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 TestExtractFieldName;
  20. end;
  21. implementation
  22. uses db, toolsunit;
  23. Type HackedDataset = class(TDataset);
  24. { TTestBasics }
  25. procedure TTestBasics.TestParseSQL;
  26. var Params : TParams;
  27. ReplStr : string;
  28. pb : TParamBinding;
  29. i : integer;
  30. SQLStr : string;
  31. begin
  32. Params := TParams.Create;
  33. AssertEquals( 'select * from table where id = $1',
  34. params.ParseSQL('select * from table where id = :id',true,True,True,psPostgreSQL));
  35. AssertEquals( 'select * from table where id = $1',
  36. params.ParseSQL('select * from table where id = :id',false,True,True,psPostgreSQL));
  37. 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)',
  38. 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));
  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 = $3) and (test=''$test'')',
  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 = :par3) and (test=''$test'')',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 10=$10 11=$11 12=$5 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 10=:par10 11=:11 12=:par5 where (id = :par3) and (test=''$test'')',true,true,true,psPostgreSQL));
  43. AssertEquals( 'select * from table where id = $1',
  44. params.ParseSQL('select * from table where id = :id',true,true,false,psSimulated,pb,ReplStr));
  45. AssertEquals('$',ReplStr);
  46. 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)',
  47. 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));
  48. AssertEquals('$',ReplStr);
  49. 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'')',
  50. 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));
  51. AssertEquals('$$',ReplStr);
  52. 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'')',
  53. 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));
  54. AssertEquals('$$',ReplStr);
  55. 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'')',
  56. 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));
  57. AssertEquals('$$$',ReplStr);
  58. AssertEquals( 'select * from table where id = ?',
  59. params.ParseSQL('select * from table where id = :id',true,true,true,psInterbase));
  60. // Test bug 10345
  61. AssertEquals( 'select email from table where upper(email) like ''%''||?||''%''',
  62. params.ParseSQL('select email from table where upper(email) like ''%''||:email||''%''',true,true,true,psInterbase));
  63. // Test escape-sequences:
  64. AssertEquals( 'select * from table where ''id '''' = :id''',
  65. params.ParseSQL('select * from table where ''id '''' = :id''',true,False,True,psPostgreSQL));
  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,True,False,psPostgreSQL));
  70. AssertEquals( 'select * from table where "id \" = $1',
  71. params.ParseSQL('select * from table where "id \" = :id',true,False,False,psPostgreSQL));
  72. AssertEquals( 'select * from table where "id = :id\',
  73. params.ParseSQL('select * from table where "id = :id\',true,True,True,psInterbase));
  74. // Test strange-field names
  75. AssertEquals( 'select * from table where "field-name" = ?',
  76. params.ParseSQL('select * from table where "field-name" = :"field-name"',true,True,True,psInterbase));
  77. AssertEquals('field-name',Params.Items[0].Name);
  78. AssertEquals( 'select * from table where "field-name" = ?',
  79. params.ParseSQL('select * from table where "field-name" = :"field-name',true,True,True,psInterbase));
  80. // Test more than 99 params - bug 19645
  81. SQLStr := 'update test set';
  82. for i := 1 to 101 do
  83. SQLStr := format('%s field%d=:par%d', [SQLStr,i,i]);
  84. AssertEquals( StringReplace(SQLStr, ':par', '$', [rfReplaceAll]),
  85. Params.ParseSQL(SQLStr, True, True, True, psPostgreSQL) );
  86. Params.Free;
  87. end;
  88. procedure TTestBasics.TestInitFielddefsFromFields;
  89. var ds : TDataset;
  90. F1,F2,F3 : Tfield;
  91. Procedure CompareFieldAndFieldDef(Fld: TField; FldDef : TFieldDef);
  92. begin
  93. AssertEquals(Fld.FieldName,FldDef.Name);
  94. AssertEquals(Fld.Size,FldDef.Size);
  95. AssertEquals(Fld.Required,FldDef.Required);
  96. AssertTrue(Fld.DataType=FldDef.DataType);
  97. end;
  98. begin
  99. ds := TDataset.Create(nil);
  100. F1:=TStringField.Create(ds);
  101. F1.Size := 10;
  102. F1.Name := 'StringFld';
  103. F1.FieldName := 'FStringFld';
  104. F1.Required := false;
  105. F1.Dataset:=ds;
  106. F2:=TIntegerField.Create(ds);
  107. F2.Name := 'IntegerFld';
  108. F2.FieldName := 'FIntegerFld';
  109. F2.Required := True;
  110. F2.Dataset:=ds;
  111. F3:=TBCDField.Create(ds);
  112. F3.Name := 'BCDFld';
  113. F3.FieldName := 'FBCDFld';
  114. F3.Required := false;
  115. F3.Dataset:=ds;
  116. (f3 as TBCDField).Precision := 2;
  117. HackedDataset(ds).InitFieldDefsFromfields;
  118. AssertEquals(3,ds.FieldDefs.Count);
  119. CompareFieldAndFieldDef(F1,ds.FieldDefs[0]);
  120. CompareFieldAndFieldDef(F2,ds.FieldDefs[1]);
  121. CompareFieldAndFieldDef(F3,ds.FieldDefs[2]);
  122. end;
  123. procedure TTestBasics.TestDoubleFieldDef;
  124. var ds : TDataset;
  125. PassException : boolean;
  126. begin
  127. // If a second field with the same name is added to a TFieldDefs, an exception
  128. // should occur
  129. ds := TDataset.create(nil);
  130. ds.FieldDefs.Add('Field1',ftInteger);
  131. PassException:=False;
  132. try
  133. ds.FieldDefs.Add('Field1',ftString,10,false)
  134. except
  135. on E: EDatabaseError do PassException := True;
  136. end;
  137. AssertTrue(PassException);
  138. end;
  139. procedure TTestBasics.TestFieldDefWithoutDS;
  140. var FieldDefs : TFieldDefs;
  141. begin
  142. FieldDefs := TFieldDefs.Create(nil);
  143. FieldDefs.Add('test',ftString);
  144. FieldDefs.Free;
  145. end;
  146. procedure TTestBasics.TestExtractFieldName;
  147. var
  148. i: Integer;
  149. Fields: String;
  150. FieldName: String;
  151. begin
  152. Fields := '';
  153. i := 1;
  154. FieldName := ExtractFieldName(Fields, i);
  155. AssertEquals(1, i);
  156. AssertEquals('', FieldName);
  157. Fields := 'test';
  158. i := 1;
  159. FieldName := ExtractFieldName(Fields, i);
  160. AssertEquals(5, i);
  161. AssertEquals('test', FieldName);
  162. Fields := 'test;';
  163. i := 1;
  164. FieldName := ExtractFieldName(Fields, i);
  165. AssertEquals(6, i);
  166. AssertEquals('test', FieldName);
  167. Fields := ' test ';
  168. i := 1;
  169. FieldName := ExtractFieldName(Fields, i);
  170. AssertEquals(7, i);
  171. AssertEquals('test', FieldName);
  172. Fields := 'test;xxx';
  173. i := 1;
  174. FieldName := ExtractFieldName(Fields, i);
  175. AssertEquals(6, i);
  176. AssertEquals('test', FieldName);
  177. FieldName := ExtractFieldName(Fields, i);
  178. AssertEquals(9, i);
  179. AssertEquals('xxx', FieldName);
  180. end;
  181. initialization
  182. RegisterTest(TTestBasics);
  183. end.