testansi.pp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  1. Program ansitest;
  2. {$ifdef GO32V2}
  3. uses
  4. dpmiexcp;
  5. {$endif GO32V2}
  6. {$ifndef fpc}
  7. Function Memavail : Longint;
  8. begin
  9. Result:=0;
  10. end;
  11. {$endif}
  12. { -------------------------------------------------------------------
  13. General stuff
  14. ------------------------------------------------------------------- }
  15. Procedure DoMem (Var StartMem : Longint);
  16. begin
  17. Writeln ('Lost ',StartMem-Memavail,' Bytes.');
  18. StartMem:=MemAvail;
  19. end;
  20. Procedure DoRef (P : Pointer);
  21. Type PLongint = ^Longint;
  22. begin
  23. If P=Nil then
  24. Writeln ('(Ref : Empty string)')
  25. else
  26. {$ifdef fpc}
  27. Writeln (' (Ref: ',Plongint(Longint(P)-4)^,',Len: ',PLongint(Longint(P)-8)^,')');
  28. {$else}
  29. Writeln (' (Ref: ',Plongint(Longint(P)-8)^,',Len: ',PLongint(Longint(P)-4)^,')');
  30. {$endif}
  31. end;
  32. { -------------------------------------------------------------------
  33. Initialize/Finalize test
  34. ------------------------------------------------------------------- }
  35. Procedure TestInitFinal;
  36. Type ARec = record
  37. FirstName, LastName : AnsiString;
  38. end;
  39. AnArray = Array [1..10] of AnsiString;
  40. Var
  41. S : AnsiString;
  42. AR : Arec;
  43. AAR : AnArray;
  44. I : longint;
  45. Begin
  46. S:='This is an ansistring!';
  47. If Pointer(AR.FirstNAme)<>Nil then
  48. Writeln ('AR.FirstName not OK');
  49. If Pointer(AR.LastName)<>Nil then
  50. Writeln ('AR.LastName not OK');
  51. for I:=1 to 10 do
  52. If Pointer(AAR[I])<>Nil then
  53. Writeln ('Array (',I,') NOT ok');
  54. AR.FirstName:='Napoleon';
  55. AR.LastName:='Bonaparte';
  56. For I:=1 to 10 do
  57. AAR[I]:='Yet another AnsiString';
  58. Writeln ('S : ',S);
  59. Writeln (AR.FirstName, ' ', AR.LastName);
  60. For I:=1 to 10 do
  61. Writeln (I:2,' : ',AAR[i]);
  62. end;
  63. { -------------------------------------------------------------------
  64. Parameter passing test
  65. ------------------------------------------------------------------- }
  66. Procedure TestVarParam (Var Sv : AnsiString);
  67. Var LS : AnsiString;
  68. begin
  69. Write ('TestVarParam : Got S="',Sv,'"');
  70. DoRef(Pointer(Sv));
  71. Sv:='This is a var parameter ansistring';
  72. Write ('S Changed to : ',Sv);
  73. DoRef (Pointer(Sv));
  74. Ls:=Sv;
  75. Write ('Assigned to local var: "',ls,'"');
  76. DoRef (Pointer(Sv));
  77. end;
  78. Procedure TestValParam (S : AnsiString);
  79. Var LS : AnsiString;
  80. begin
  81. Write ('TestValParam : Got S="',S,'"');
  82. S:='This is a value parameter ansistring';
  83. Write ('S Changed to : ',S);
  84. DoRef(Pointer(S));
  85. Ls:=S;
  86. Write ('Assigned to local var: "',ls,'"');
  87. DoRef(Pointer(S));
  88. end;
  89. Procedure TestConstParam (Const Sc : AnsiString);
  90. Var LS : AnsiString;
  91. begin
  92. Write ('TestConstParam : Got S="',Sc,'"');
  93. DoRef(Pointer(Sc));
  94. Ls:=Sc;
  95. Write ('Assigned to local var: "',ls,'"');
  96. DoRef(Pointer(Sc));
  97. end;
  98. Procedure TestParams;
  99. Var S : AnsiString;
  100. Mem : Longint;
  101. begin
  102. Mem:=MemAvail;
  103. S :='This is another ansistring';
  104. Writeln ('Calling testvalparam with "',s,'"');
  105. testvalparam (s);
  106. DoMem(Mem);
  107. Writeln ('Calling testConstparam with "',s,'"');
  108. testconstparam (s);
  109. DoMem(Mem);
  110. Writeln ('Calling testvarparam with "',s,'"');
  111. testvarparam (s);
  112. Writeln ('TestVarParam returned with "',S,'"');
  113. DoMem(Mem);
  114. end;
  115. { -------------------------------------------------------------------
  116. Comparision operators test
  117. ------------------------------------------------------------------- }
  118. Procedure TestCompare;
  119. Const S1 : AnsiString = 'Teststring 1';
  120. S2 : AnsiString = 'Teststring 1';
  121. S3 : AnsiString = 'Teststring 2';
  122. S4 : AnsiString = '';
  123. PC : Pchar = 'Teststring 1';
  124. Var S,T : AnsiString;
  125. ss : Shortstring;
  126. begin
  127. If S1=S2 then writeln ('S1 and S2 are the same');
  128. If S4='' then Writeln ('S4 is empty. OK');
  129. If Not(S4='Non-empty') then writeln ('S4 is not non-empty');
  130. if S3='Teststring 2' then writeln('S3 equals "Teststring 2". OK.');
  131. Write ('S3<>S2 : ');
  132. If S2<>S3 Then writeln ('OK') else writeln ('NOT OK');
  133. Write ('S3>S2 : ');
  134. If (S3>S2) Then Writeln ('OK') else writeln ('NOT OK');
  135. Write ('S1<S3 : ');
  136. if (S1<S3) Then writeln ('OK') else writeln ('NOT OK');
  137. S:=S2;
  138. T:=S;
  139. Write ('Assigned S to T. ');Doref(Pointer(T));
  140. If S=T then Writeln ('S=T, OK');
  141. SS:='Teststring 1';
  142. If SS=S then
  143. Writeln ('Shortstring and AnsiString are the same. OK')
  144. else
  145. Writeln ('Shortstring and AnsiString NOT equal. PROBLEM !');
  146. If S=PC then
  147. Writeln ('Pchar and AnsiString are the same. OK')
  148. else
  149. Writeln ('Pchar and AnsiString NOT equal. PROBLEM !');
  150. end;
  151. { -------------------------------------------------------------------
  152. Type conversion test
  153. ------------------------------------------------------------------- }
  154. Procedure DoPchar (P : Pchar);
  155. begin
  156. Writeln ('DoPchar : Got : "',P,'"');
  157. end;
  158. Procedure TestConversion;
  159. Var Pstr : Pchar;
  160. Sstr : String[40];
  161. Astr : AnsiString;
  162. Const PC : Pchar = 'A PCHAR constant string';
  163. begin
  164. Writeln ('Astr empty : "',Astr,'"');
  165. Pstr:=PChar(Astr);
  166. Writeln ('AnsiString Assigned to Pchar : "',Pstr,'"');
  167. DoPchar(Pchar(Astr));
  168. Astr:='An Ansistring';
  169. Writeln ('Astr: "',Astr,'"');
  170. Pstr:=PChar(Astr);
  171. Writeln ('AnsiString Assigned to Pchar : "',Pstr,'"');
  172. DoPchar(Pchar(Astr));
  173. SStr:='A ShortString';
  174. Writeln ('Shortstring : "',Sstr,'"');
  175. Astr:=Sstr;
  176. Write ('ShortString assigned to AnsiString : "',Astr,'"');
  177. DoRef(Pointer(Astr));
  178. Astr:=PC;
  179. Write ('PChar assigned to AnsiString : "',Astr,'"');
  180. DoRef(Pointer(Astr));
  181. end;
  182. { -------------------------------------------------------------------
  183. Adding of strings test.
  184. ------------------------------------------------------------------- }
  185. Procedure TestAdd;
  186. Const S1 : AnsiString = 'This is ansistring 1 ';
  187. S2 : AnsiString = 'This is ansistring 2 ';
  188. S3 : Ansistring = 'This is ansistring 3';
  189. Var S : AnsiString;
  190. S4 : String;
  191. begin
  192. S:=S1+S2;
  193. //!! Reference count is 2, should be 1...
  194. Write ('Adding S1+S2 : ',S,' '); DoRef(Pointer(S));
  195. S:=S1+S2+S3;
  196. Write ('Adding S1+S2+S3 : ',S,' '); DoRef(Pointer(S));
  197. S:=S+'...Added tail';
  198. Write ('Added tail to S ! : ',S);DoRef(Pointer(S));
  199. S4:=' This is a shortstring';
  200. //!! This crashes the program...
  201. S:=S1+S4;
  202. Write ('Adding S1+S4 : ',S,' '); DoRef(Pointer(S));
  203. S:=S1+'@';
  204. Write ('Adding S1+''@'' : ',S,' '); DoRef(Pointer(S));
  205. end;
  206. { -------------------------------------------------------------------
  207. SetLength test.
  208. ------------------------------------------------------------------- }
  209. Procedure TestSetlength;
  210. Const S1 : AnsiString = 'This is ansistring 1';
  211. S2 : AnsiString = 'This is ansistring 2 and it is longer';
  212. Var S : AnsiString;
  213. begin
  214. Setlength(S,length(S1));
  215. Write ('Set length of s to ',length(s1));Doref(pointer(s));
  216. Move (Pointer(S1)^,Pointer(S)^,Length(S1)+1);
  217. Write ('S = "',S,'" '); DoRef(Pointer(S));
  218. Setlength(S,length(S2));
  219. Write ('Set length of s to ',length(s2));Doref(pointer(s));
  220. Move (Pointer(S2)^,Pointer(S)^,Length(S2)+1);
  221. Write ('S = "',S,'" '); DoRef(Pointer(S));
  222. SetLength(S,10);
  223. Write ('Set length of s to 10 ');Doref(pointer(s));
  224. Write ('S = "',S,'" '); DoRef(Pointer(S));
  225. SetLength(S,0);
  226. Write ('Set length of S to 0 ');Doref(Pointer(S));
  227. Write ('S = "',S,'" ');Doref(Pointer(s));
  228. end;
  229. { -------------------------------------------------------------------
  230. Index test.
  231. ------------------------------------------------------------------- }
  232. Procedure testIndex;
  233. Var S,T : AnsiString;
  234. I,Len : longint;
  235. begin
  236. S:='ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  237. Write ('S = "',S,'" ');doref(pointer(S));
  238. Write ('S = "');
  239. Len:=Length(S);
  240. For I:=1 to Len do Write(S[i]);
  241. write ('" ');Doref(pointer(S));
  242. Write ('Inverting S, ');
  243. For I:=1 to Len do
  244. S[i]:='A';
  245. // Asc(Ord('Z')+1-i);
  246. Write ('S = "',S,'" ');doref(pointer(S));
  247. T:=S;
  248. Write ('Assigned S to T '); Doref(Pointer(S));
  249. Write ('Again inverting S. ');
  250. For I:=1 to Len do
  251. S[i]:='B';
  252. Write ('S = "',S,'" ');doref(pointer(S));
  253. Write ('T = "',T,'" ');doref(pointer(T));
  254. end;
  255. { -------------------------------------------------------------------
  256. Adding in expressions test.
  257. ------------------------------------------------------------------- }
  258. Procedure TestAddExpr;
  259. Const S1 : AnsiString = 'ABC';
  260. S2 : AnsiString = 'DEF';
  261. OK = 'OK';
  262. NOK = 'NOK';
  263. Var I : Integer;
  264. S3 : AnsiString;
  265. mem : Longint;
  266. begin
  267. mem:=memavail;
  268. S3 := 'ABCDEF';
  269. Write ('S1+S2=S3 :');
  270. If S1+S2=S3 then writeln (ok) else writeln (nok);
  271. Write ('S1+S2=ABCDEF');
  272. If S1+S2='ABCDEF' then writeln (ok) else writeln (nok);
  273. Write ('Testing repeat');
  274. I:=0;
  275. S3:='';
  276. Repeat
  277. Inc(i);
  278. If I=10 then s3:='ABCDEF';
  279. until S1+S2=S3;
  280. Writeln (' Done.');
  281. I:=2;
  282. S3:='';
  283. Write ('Testing While');
  284. While S1+S2<>S3 do
  285. begin
  286. INc(i);
  287. If I=10 then s3:='ABCDEF';
  288. end;
  289. Writeln (' Done');
  290. end;
  291. Procedure TestStdFunc;
  292. Var S,T : AnsiString;
  293. SS : ShortString;
  294. C : Char;
  295. Ca : Cardinal;
  296. L : longint;
  297. I : Integer;
  298. W : Word;
  299. B : Byte;
  300. R : Real;
  301. D : Double;
  302. E : Extended;
  303. Si : Single;
  304. Co : Comp;
  305. TempMem:Longint;
  306. begin
  307. TempMem:=Memavail;
  308. S:='ABCDEF';
  309. Write ('S = "',S,'"');Doref(Pointer(S));
  310. T:=Copy(S,1,3);
  311. Write ('T : "',T,'"');DoRef(Pointer(T));
  312. T:=Copy(S,3,3);
  313. Write ('T : "',T,'"');DoRef(Pointer(T));
  314. T:=Copy(S,3,6);
  315. Write ('T : "',T,'"');DoRef(Pointer(T));
  316. Writeln ('Inserting "123" in S at pos 4');
  317. Insert ('123',S,4);
  318. Write ('S = "',S,'"');DoRef(Pointer(S));
  319. Writeln ('Deleting 3 characters From S starting Pos 4');
  320. Delete (S,4,3);
  321. Write ('S = "',S,'"');Doref(Pointer(S));
  322. Writeln ('Pos ''DE'' in S is : ',Pos('DE',S));
  323. Write ('S = "',S,'"');Doref(Pointer(S));
  324. Writeln ('Setting T to ''DE''.');
  325. T:='DE';
  326. //!! Here something weird is happening ? S is lost ???
  327. Writeln('***');
  328. Writeln ('Pos T in S is : ',Pos(T,S));
  329. Write ('S = "',S,'"');Doref(Pointer(S));
  330. Writeln ('Setting T to ''D''.');
  331. T:='D';
  332. Writeln ('Pos T in S is : ',Pos(T,S));
  333. Write ('S = "',S,'"');Doref(Pointer(S));
  334. Writeln ('Setting T to ''DA''.');
  335. T:='DA';
  336. Writeln ('Pos T in S is : ',Pos(T,S));
  337. Write ('S = "',S,'"');Doref(Pointer(S));
  338. Writeln ('SS:=''DE''');
  339. Writeln('***');
  340. SS:='DE';
  341. Writeln ('Pos SS in S is : ',Pos(SS,S));
  342. Write ('S = "',S,'"');Doref(Pointer(S));
  343. Writeln ('C:=''D''');
  344. C:='D';
  345. Writeln ('Pos C in S is : ',Pos(C,S));
  346. Write ('S = "',S,'"');Doref(Pointer(S));
  347. Writeln ('Pos ''D'' in S is : ',Pos('D',S));
  348. Write ('S = "',S,'"');Doref(Pointer(S));
  349. Write ('str(Ca,S)= ');
  350. ca:=1;
  351. str(Ca,S);
  352. Writeln (S);
  353. Write ('str(L,S)= ');
  354. L:=2;
  355. str(L,S);
  356. Writeln (S);
  357. Write ('str(I,S)= ');
  358. I:=3;
  359. str(I,S);
  360. Writeln (S);
  361. Write ('str(W,S)= ');
  362. W:=4;
  363. str(W,S);
  364. Writeln (S);
  365. Write ('str(R,S)= ');
  366. R:=1.0;
  367. str(R,S);
  368. Writeln (S);
  369. Write ('str(D,S)= ');
  370. D:=2.0;
  371. str(D,S);
  372. Writeln (S);
  373. Write ('str(E,S)= ');
  374. E:=3.0;
  375. str(E,S);
  376. Writeln (S);
  377. Write ('str(Co,S)= ');
  378. Co:=4.0;
  379. str(Co,S);
  380. Writeln (S);
  381. Write ('str(Si,S)= ');
  382. Si:=5.0;
  383. str(Si,S);
  384. Writeln (S);
  385. end;
  386. Var GlobalStartMem,StartMem : Longint;
  387. begin
  388. GlobalStartMem:=MemAvail;
  389. StartMem:=MemAvail;
  390. Writeln ('Testing Initialize/Finalize.');
  391. TestInitFinal;
  392. Write ('End of Initialize/finalize test : ');DoMem(StartMem);
  393. Writeln;Writeln ('Testing parameter passing.');
  394. TestParams;
  395. Write ('End of Parameter passing test : ');DoMem(StartMem);
  396. Writeln;Writeln ('Testing comparision operators');
  397. TestCompare;
  398. Write ('End of compare test : ');DoMem(StartMem);
  399. Writeln;Writeln ('Testing setlength of AnsiStrings');
  400. TestSetLength;
  401. Write ('End of setlength test : ');DoMem(StartMem);
  402. Writeln;Writeln ('Testing Adding of AnsiStrings');
  403. TestAdd;
  404. Write ('End of adding test : ');DoMem(StartMem);
  405. Writeln;Writeln ('Testing Adding of AnsiStrings in expressions');
  406. TestAddExpr;
  407. Write ('End of adding in expressions test : ');DoMem(StartMem);
  408. Writeln;Writeln ('Testing type conversion.');
  409. TestConversion;
  410. Write ('End of typeconversion test : ');DoMem(StartMem);
  411. Writeln;Writeln ('Testing indexed access.');
  412. TestIndex;
  413. Write ('End of index access test : ');DoMem(StartMem);
  414. Writeln;Writeln ('Testing standard functions.');
  415. TestStdfunc;
  416. Write ('End of standard functions: ');DoMem(StartMem);
  417. Write ('For the whole program ');DoMem(GlobalStartMem);
  418. end.