MathArrays.Execution.Test 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808
  1. # Math Array Exeuction Test Suite
  2. # options --mayTrap --prolog="Compiler.Compile TesterInput.txt" --command="System.Free Test Dummy B A;System.Load Test" --logFile="FoxExecutionTest.Log" --result="MathArrays.Execution.Test.Diff"
  3. positive: DIM and LEN
  4. MODULE Test;
  5. VAR
  6. v1: ARRAY [*] OF INTEGER;
  7. v2: ARRAY [*,*] OF INTEGER;
  8. v3: ARRAY [*,*,*] OF INTEGER;
  9. t1,t2,t3: ARRAY [?] OF INTEGER;
  10. s1: ARRAY [3] OF INTEGER;
  11. s2: ARRAY [3,4] OF INTEGER;
  12. s3: ARRAY [3,4,5] OF INTEGER;
  13. h2: ARRAY [*,4] OF INTEGER;
  14. h3: ARRAY [*,*,5] OF INTEGER;
  15. BEGIN
  16. NEW(v1,3); NEW(v2,3,4); NEW(v3,3,4,5);
  17. NEW(t1,3); NEW(t2,3,4); NEW(t3,3,4,5);
  18. NEW(h2,3); NEW(h3,3,4);
  19. ASSERT(DIM(v1)=1); ASSERT(DIM(v2)=2); ASSERT(DIM(v3)=3);
  20. ASSERT(DIM(t1)=1); ASSERT(DIM(t2)=2); ASSERT(DIM(t3)=3);
  21. ASSERT(DIM(s1)=1); ASSERT(DIM(s2)=2); ASSERT(DIM(s3)=3);
  22. ASSERT(DIM(h2)=2); ASSERT(DIM(h3)=3);
  23. ASSERT(LEN(v1,0)=3);
  24. ASSERT(LEN(v2,0)=3); ASSERT(LEN(v2,1)=4);
  25. ASSERT(LEN(v3,0)=3); ASSERT(LEN(v3,1)=4); ASSERT(LEN(v3,2)=5);
  26. ASSERT(LEN(t1,0)=3);
  27. ASSERT(LEN(t2,0)=3); ASSERT(LEN(t2,1)=4);
  28. ASSERT(LEN(t3,0)=3); ASSERT(LEN(t3,1)=4); ASSERT(LEN(t3,2)=5);
  29. ASSERT(LEN(s1,0)=3);
  30. ASSERT(LEN(s2,0)=3); ASSERT(LEN(s2,1)=4);
  31. ASSERT(LEN(s3,0)=3); ASSERT(LEN(s3,1)=4); ASSERT(LEN(s3,2)=5);
  32. ASSERT(LEN(h2,0)=3); ASSERT(LEN(h2,1)=4);
  33. ASSERT(LEN(h3,0)=3); ASSERT(LEN(h3,1)=4); ASSERT(LEN(h3,2)=5);
  34. END Test.
  35. positive: assignment and equality, dynamic arrays
  36. MODULE Test;
  37. VAR
  38. v1: ARRAY [*] OF INTEGER;
  39. v2: ARRAY [*,*] OF INTEGER;
  40. v3: ARRAY [*,*,*] OF INTEGER;
  41. BEGIN
  42. v1 := [1,2,3];
  43. v2 := [[1,2,3],[4,5,6],[7,8,9]];
  44. v3 := [
  45. [[1,2,3],[4,5,6],[7,8,9]],
  46. [[11,12,13],[14,15,16],[17,18,19]]
  47. ];
  48. ASSERT(v1=[1,2,3]);
  49. ASSERT(v2=[[1,2,3],[4,5,6],[7,8,9]]);
  50. ASSERT(v3=[
  51. [[1,2,3],[4,5,6],[7,8,9]],
  52. [[11,12,13],[14,15,16],[17,18,19]]
  53. ]);
  54. END Test.
  55. negative: assignment and equality, one dimensional dynamic arrays
  56. MODULE Test;
  57. VAR
  58. v1: ARRAY [*] OF INTEGER;
  59. BEGIN
  60. v1 := [1,2,3];
  61. ASSERT(v1=[1,2,4]);
  62. END Test.
  63. negative: assignment and equality, two dimensional dynamic arrays
  64. MODULE Test;
  65. VAR
  66. v2: ARRAY [*,*] OF INTEGER;
  67. BEGIN
  68. v2 := [[1,2,3],[4,5,6],[7,8,9]];
  69. ASSERT(v2=[[1,2,3],[40,5,6],[7,8,9]]);
  70. END Test.
  71. positive: assignment and equality, tensor
  72. MODULE Test;
  73. VAR
  74. v1: ARRAY [?] OF INTEGER;
  75. v2: ARRAY [?] OF INTEGER;
  76. v3: ARRAY [?] OF INTEGER;
  77. BEGIN
  78. v1 := [1,2,3];
  79. v2 := [[1,2,3],[4,5,6],[7,8,9]];
  80. v3 := [
  81. [[1,2,3],[4,5,6],[7,8,9]],
  82. [[11,12,13],[14,15,16],[17,18,19]]
  83. ];
  84. ASSERT(v1=[1,2,3]);
  85. ASSERT(v2=[[1,2,3],[4,5,6],[7,8,9]]);
  86. ASSERT(v3=[
  87. [[1,2,3],[4,5,6],[7,8,9]],
  88. [[11,12,13],[14,15,16],[17,18,19]]
  89. ]);
  90. END Test.
  91. negative: assignment and equality, one dimensional tensor
  92. MODULE Test;
  93. VAR
  94. v1: ARRAY [?] OF INTEGER;
  95. BEGIN
  96. v1 := [1,2,3];
  97. ASSERT(v1=[1,2,4]);
  98. END Test.
  99. negative: assignment and equality, two dimensional tensor
  100. MODULE Test;
  101. VAR
  102. v2: ARRAY [?] OF INTEGER;
  103. BEGIN
  104. v2 := [[1,2,3],[4,5,6],[7,8,9]];
  105. ASSERT(v2=[[1,2,3],[40,5,6],[7,8,9]]);
  106. END Test.
  107. positive: initialization of math arrays during module initialization and during allocation
  108. MODULE Test;
  109. TYPE
  110. Record = RECORD
  111. v: ARRAY [*] OF INTEGER;
  112. r: RECORD
  113. v: ARRAY [*] OF INTEGER
  114. END;
  115. a: ARRAY 2 OF RECORD
  116. v: ARRAY [*] OF INTEGER
  117. END;
  118. END;
  119. Pointer= POINTER TO Record;
  120. VAR
  121. v: ARRAY [*] OF INTEGER;
  122. r: Record;
  123. p: Pointer;
  124. BEGIN
  125. v := [1,2,3];
  126. r.v := [1,2,3]; ASSERT(r.v = v);
  127. r.r.v := [1,2,3]; ASSERT( r.r.v = v);
  128. r.a[1].v := [1,2,3]; ASSERT(r.a[1].v = v);
  129. NEW(p);
  130. p.v := [1,2,3]; ASSERT(p.v = v);
  131. p.r.v := [1,2,3]; ASSERT( p.r.v = v);
  132. p.a[1].v := [1,2,3]; ASSERT(p.a[1].v = v);
  133. END Test.
  134. positive: test driver
  135. MODULE Driver;
  136. IMPORT Random,Debugging;
  137. VAR gen: Random.Generator;
  138. PROCEDURE FillS0(VAR a: ARRAY [?] OF SHORTINT; base: SHORTINT);
  139. VAR i: SHORTINT;
  140. BEGIN
  141. IF DIM(a) = 1 THEN
  142. FOR i := 0 TO SHORTINT(LEN(a,0)-1) DO a[i] := 10*base+i END;
  143. ELSE
  144. FOR i := 0 TO SHORTINT(LEN(a,0)-1) DO FillS0(a[i,?],10*base+i) END;
  145. END;
  146. END FillS0;
  147. PROCEDURE FillS*(VAR a: ARRAY [?] OF SHORTINT);
  148. BEGIN FillS0(a,0);
  149. END FillS;
  150. PROCEDURE TestFillS0*(CONST a: ARRAY [?] OF SHORTINT; base: SHORTINT);
  151. VAR i: SHORTINT;
  152. BEGIN
  153. IF DIM(a) = 1 THEN
  154. FOR i := 0 TO SHORTINT(LEN(a,0)-1) DO ASSERT(a[i] = 10*base+i) END;
  155. ELSE
  156. FOR i := 0 TO SHORTINT(LEN(a,0)-1) DO TestFillS0(a[i,?],10*base+i) END;
  157. END;
  158. END TestFillS0;
  159. PROCEDURE TestS1*(CONST a: ARRAY [*] OF SHORTINT; r: RANGE);
  160. VAR i: LONGINT;
  161. BEGIN
  162. i := FIRST(r); WHILE i <= LAST(r) DO
  163. ASSERT(a[(i-FIRST(r)) DIV STEP(r)]=SHORTINT(i));
  164. INC(i,STEP(r));
  165. END;
  166. END TestS1;
  167. PROCEDURE TestS2*(CONST a: ARRAY [*,*] OF SHORTINT; r1, r2: RANGE);
  168. VAR i,j: LONGINT;
  169. BEGIN
  170. i := FIRST(r1); WHILE i <= LAST(r1) DO
  171. j := FIRST(r2); WHILE j <= LAST(r2) DO
  172. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2)]=SHORTINT(10*i+j));
  173. INC(j,STEP(r2)) END;
  174. INC(i,STEP(r1)) END;
  175. END TestS2;
  176. PROCEDURE TestS3*(CONST a: ARRAY [*,*,*] OF SHORTINT; r1, r2, r3: RANGE);
  177. VAR i,j,k: LONGINT;
  178. BEGIN
  179. i := FIRST(r1); WHILE i <= LAST(r1) DO
  180. j := FIRST(r2); WHILE j <= LAST(r2) DO
  181. k := FIRST(r3); WHILE k <= LAST(r3) DO
  182. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2),(k-FIRST(r3)) DIV STEP(r3)]=SHORTINT(100*i+10*j+k));
  183. INC(k,STEP(r3)) END;
  184. INC(j,STEP(r2)) END;
  185. INC(i,STEP(r1)) END;
  186. END TestS3;
  187. PROCEDURE TestFillS*(CONST a: ARRAY [?] OF SHORTINT);
  188. BEGIN
  189. TestFillS0(a,0)
  190. END TestFillS;
  191. PROCEDURE RandomS*(VAR a: ARRAY [?] OF SHORTINT);
  192. VAR i: SHORTINT;
  193. BEGIN
  194. IF DIM(a) = 1 THEN
  195. FOR i := 0 TO SHORTINT(LEN(a,0)-1) DO a[i] := SHORTINT(gen.Dice(1000)) END;
  196. ELSE
  197. FOR i := 0 TO SHORTINT(LEN(a,0)-1) DO RandomS(a[i,?]) END;
  198. END;
  199. END RandomS;
  200. PROCEDURE FillI0(VAR a: ARRAY [?] OF INTEGER; base: INTEGER);
  201. VAR i: INTEGER;
  202. BEGIN
  203. IF DIM(a) = 1 THEN
  204. FOR i := 0 TO INTEGER(LEN(a,0)-1) DO a[i] := 10*base+i END;
  205. ELSE
  206. FOR i := 0 TO INTEGER(LEN(a,0)-1) DO FillI0(a[i,?],10*base+i) END;
  207. END;
  208. END FillI0;
  209. PROCEDURE FillI*(VAR a: ARRAY [?] OF INTEGER);
  210. BEGIN FillI0(a,0);
  211. END FillI;
  212. PROCEDURE TestFillI0*(CONST a: ARRAY [?] OF INTEGER; base: INTEGER);
  213. VAR i: INTEGER;
  214. BEGIN
  215. IF DIM(a) = 1 THEN
  216. FOR i := 0 TO INTEGER(LEN(a,0)-1) DO ASSERT(a[i] = 10*base+i) END;
  217. ELSE
  218. FOR i := 0 TO INTEGER(LEN(a,0)-1) DO TestFillI0(a[i,?],10*base+i) END;
  219. END;
  220. END TestFillI0;
  221. PROCEDURE TestFillI*(CONST a: ARRAY [?] OF INTEGER);
  222. BEGIN
  223. TestFillI0(a,0)
  224. END TestFillI;
  225. PROCEDURE RandomI*(VAR a: ARRAY [?] OF INTEGER);
  226. VAR i: INTEGER;
  227. BEGIN
  228. IF DIM(a) = 1 THEN
  229. FOR i := 0 TO INTEGER(LEN(a,0)-1) DO a[i] := INTEGER(gen.Dice(1000)) END;
  230. ELSE
  231. FOR i := 0 TO INTEGER(LEN(a,0)-1) DO RandomI(a[i,?]) END;
  232. END;
  233. END RandomI;
  234. PROCEDURE TestI1*(CONST a: ARRAY [*] OF INTEGER; r: RANGE);
  235. VAR i: LONGINT;
  236. BEGIN
  237. i := FIRST(r); WHILE i <= LAST(r) DO
  238. ASSERT(a[(i-FIRST(r)) DIV STEP(r)]=INTEGER(i));
  239. INC(i,STEP(r));
  240. END;
  241. END TestI1;
  242. PROCEDURE TestI2*(CONST a: ARRAY [*,*] OF INTEGER; r1, r2: RANGE);
  243. VAR i,j: LONGINT;
  244. BEGIN
  245. i := FIRST(r1); WHILE i <= LAST(r1) DO
  246. j := FIRST(r2); WHILE j <= LAST(r2) DO
  247. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2)]=INTEGER(10*i+j));
  248. INC(j,STEP(r2)) END;
  249. INC(i,STEP(r1)) END;
  250. END TestI2;
  251. PROCEDURE TestI3*(CONST a: ARRAY [*,*,*] OF INTEGER; r1, r2, r3: RANGE);
  252. VAR i,j,k: LONGINT;
  253. BEGIN
  254. i := FIRST(r1); WHILE i <= LAST(r1) DO
  255. j := FIRST(r2); WHILE j <= LAST(r2) DO
  256. k := FIRST(r3); WHILE k <= LAST(r3) DO
  257. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2),(k-FIRST(r3)) DIV STEP(r3)]=INTEGER(100*i+10*j+k));
  258. INC(k,STEP(r3)) END;
  259. INC(j,STEP(r2)) END;
  260. INC(i,STEP(r1)) END;
  261. END TestI3;
  262. PROCEDURE FillL0(VAR a: ARRAY [?] OF LONGINT; base: LONGINT);
  263. VAR i: LONGINT;
  264. BEGIN
  265. IF DIM(a) = 1 THEN
  266. FOR i := 0 TO LEN(a,0)-1 DO a[i] := 10*base+i END;
  267. ELSE
  268. FOR i := 0 TO LEN(a,0)-1 DO FillL0(a[i,?],10*base+i) END;
  269. END;
  270. END FillL0;
  271. PROCEDURE FillL*(VAR a: ARRAY [?] OF LONGINT);
  272. BEGIN FillL0(a,0);
  273. END FillL;
  274. PROCEDURE TestFillL0*(CONST a: ARRAY [?] OF LONGINT; base: LONGINT);
  275. VAR i: LONGINT;
  276. BEGIN
  277. IF DIM(a) = 1 THEN
  278. FOR i := 0 TO LEN(a,0)-1 DO ASSERT(a[i] = 10*base+i) END;
  279. ELSE
  280. FOR i := 0 TO LEN(a,0)-1 DO TestFillL0(a[i,?],10*base+i) END;
  281. END;
  282. END TestFillL0;
  283. PROCEDURE TestFillL*(CONST a: ARRAY [?] OF LONGINT);
  284. BEGIN
  285. TestFillL0(a,0)
  286. END TestFillL;
  287. PROCEDURE RandomL*(VAR a: ARRAY [?] OF LONGINT);
  288. VAR i: LONGINT;
  289. BEGIN
  290. IF DIM(a) = 1 THEN
  291. FOR i := 0 TO LEN(a,0)-1 DO a[i] := gen.Dice(1000) END;
  292. ELSE
  293. FOR i := 0 TO LEN(a,0)-1 DO RandomL(a[i,?]) END;
  294. END;
  295. END RandomL;
  296. PROCEDURE TestL1*(CONST a: ARRAY [*] OF LONGINT; r: RANGE);
  297. VAR i: LONGINT;
  298. BEGIN
  299. i := FIRST(r); WHILE i <= LAST(r) DO
  300. ASSERT(a[(i-FIRST(r)) DIV STEP(r)]=LONGINT(i));
  301. INC(i,STEP(r));
  302. END;
  303. END TestL1;
  304. PROCEDURE TestL2*(CONST a: ARRAY [*,*] OF LONGINT; r1, r2: RANGE);
  305. VAR i,j: LONGINT;
  306. BEGIN
  307. i := FIRST(r1); WHILE i <= LAST(r1) DO
  308. j := FIRST(r2); WHILE j <= LAST(r2) DO
  309. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2)]=LONGINT(10*i+j));
  310. INC(j,STEP(r2)) END;
  311. INC(i,STEP(r1)) END;
  312. END TestL2;
  313. PROCEDURE TestL3*(CONST a: ARRAY [*,*,*] OF LONGINT; r1, r2, r3: RANGE);
  314. VAR i,j,k: LONGINT;
  315. BEGIN
  316. i := FIRST(r1); WHILE i <= LAST(r1) DO
  317. j := FIRST(r2); WHILE j <= LAST(r2) DO
  318. k := FIRST(r3); WHILE k <= LAST(r3) DO
  319. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2),(k-FIRST(r3)) DIV STEP(r3)]=LONGINT(100*i+10*j+k));
  320. INC(k,STEP(r3)) END;
  321. INC(j,STEP(r2)) END;
  322. INC(i,STEP(r1)) END;
  323. END TestL3;
  324. PROCEDURE FillX0(VAR a: ARRAY [?] OF LONGREAL; base: LONGINT);
  325. VAR i: LONGINT;
  326. BEGIN
  327. IF DIM(a) = 1 THEN
  328. FOR i := 0 TO LEN(a,0)-1 DO a[i] := 10*base+i END;
  329. ELSE
  330. FOR i := 0 TO LEN(a,0)-1 DO FillX0(a[i,?],10*base+i) END;
  331. END;
  332. END FillX0;
  333. PROCEDURE FillX*(VAR a: ARRAY [?] OF LONGREAL);
  334. BEGIN FillX0(a,0);
  335. END FillX;
  336. PROCEDURE TestFillX0*(CONST a: ARRAY [?] OF LONGREAL; base: LONGINT);
  337. VAR i: LONGINT;
  338. BEGIN
  339. IF DIM(a) = 1 THEN
  340. FOR i := 0 TO LEN(a,0)-1 DO ASSERT(ENTIER(a[i]+0.5) = 10*base+i) END;
  341. ELSE
  342. FOR i := 0 TO LEN(a,0)-1 DO TestFillX0(a[i,?],10*base+i) END;
  343. END;
  344. END TestFillX0;
  345. PROCEDURE TestFillX*(CONST a: ARRAY [?] OF LONGREAL);
  346. BEGIN
  347. TestFillX0(a,0);
  348. END TestFillX;
  349. PROCEDURE RandomX*(VAR a: ARRAY [?] OF LONGREAL);
  350. VAR i: LONGINT;
  351. BEGIN
  352. IF DIM(a) = 1 THEN
  353. FOR i := 0 TO LEN(a,0)-1 DO a[i] := gen.Uniform() END;
  354. ELSE
  355. FOR i := 0 TO LEN(a,0)-1 DO RandomX(a[i,?]) END;
  356. END;
  357. END RandomX;
  358. PROCEDURE PrintX*(CONST a: ARRAY [?] OF LONGREAL);
  359. VAR i: LONGINT;
  360. BEGIN
  361. IF DIM(a) = 1 THEN
  362. FOR i := 0 TO LEN(a,0)-1 DO Debugging.Int(ENTIER(a[i]+0.5),5) END;
  363. ELSE
  364. FOR i := 0 TO LEN(a,0)-1 DO PrintX(a[i,?]); Debugging.Ln; END;
  365. END;
  366. END PrintX;
  367. PROCEDURE TestX1*(CONST a: ARRAY [*] OF LONGREAL; r: RANGE);
  368. VAR i: LONGINT;
  369. BEGIN
  370. i := FIRST(r); WHILE i <= LAST(r) DO
  371. ASSERT(a[(i-FIRST(r)) DIV STEP(r)]=LONGREAL(i));
  372. INC(i,STEP(r));
  373. END;
  374. END TestX1;
  375. PROCEDURE TestX2*(CONST a: ARRAY [*,*] OF LONGREAL; r1, r2: RANGE);
  376. VAR i,j: LONGINT;
  377. BEGIN
  378. i := FIRST(r1); WHILE i <= LAST(r1) DO
  379. j := FIRST(r2); WHILE j <= LAST(r2) DO
  380. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2)]=LONGREAL(10*i+j));
  381. INC(j,STEP(r2)) END;
  382. INC(i,STEP(r1)) END;
  383. END TestX2;
  384. PROCEDURE TestX3*(CONST a: ARRAY [*,*,*] OF LONGREAL; r1, r2, r3: RANGE);
  385. VAR i,j,k: LONGINT;
  386. BEGIN
  387. i := FIRST(r1); WHILE i <= LAST(r1) DO
  388. j := FIRST(r2); WHILE j <= LAST(r2) DO
  389. k := FIRST(r3); WHILE k <= LAST(r3) DO
  390. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2),(k-FIRST(r3)) DIV STEP(r3)]=LONGREAL(100*i+10*j+k));
  391. INC(k,STEP(r3)) END;
  392. INC(j,STEP(r2)) END;
  393. INC(i,STEP(r1)) END;
  394. END TestX3;
  395. PROCEDURE FillR0(VAR a: ARRAY [?] OF REAL; base: LONGINT);
  396. VAR i: LONGINT;
  397. BEGIN
  398. IF DIM(a) = 1 THEN
  399. FOR i := 0 TO LEN(a,0)-1 DO a[i] := 10*base+i END;
  400. ELSE
  401. FOR i := 0 TO LEN(a,0)-1 DO FillR0(a[i,?],10*base+i) END;
  402. END;
  403. END FillR0;
  404. PROCEDURE FillR*(VAR a: ARRAY [?] OF REAL);
  405. BEGIN FillR0(a,0);
  406. END FillR;
  407. PROCEDURE TestFillR0*(CONST a: ARRAY [?] OF REAL; base: LONGINT);
  408. VAR i: LONGINT;
  409. BEGIN
  410. IF DIM(a) = 1 THEN
  411. FOR i := 0 TO LEN(a,0)-1 DO ASSERT(ENTIER(a[i]+0.5) = 10*base+i) END;
  412. ELSE
  413. FOR i := 0 TO LEN(a,0)-1 DO TestFillR0(a[i,?],10*base+i) END;
  414. END;
  415. END TestFillR0;
  416. PROCEDURE TestFillR*(CONST a: ARRAY [?] OF LONGREAL);
  417. BEGIN
  418. TestFillX0(a,0);
  419. END TestFillR;
  420. PROCEDURE RandomR*(VAR a: ARRAY [?] OF REAL);
  421. VAR i: LONGINT;
  422. BEGIN
  423. IF DIM(a) = 1 THEN
  424. FOR i := 0 TO LEN(a,0)-1 DO a[i] := gen.Uniform() END;
  425. ELSE
  426. FOR i := 0 TO LEN(a,0)-1 DO RandomR(a[i,?]) END;
  427. END;
  428. END RandomR;
  429. PROCEDURE TestR1*(CONST a: ARRAY [*] OF REAL; r: RANGE);
  430. VAR i: LONGINT;
  431. BEGIN
  432. i := FIRST(r); WHILE i <= LAST(r) DO
  433. ASSERT(a[(i-FIRST(r)) DIV STEP(r)]=REAL(i));
  434. INC(i,STEP(r));
  435. END;
  436. END TestR1;
  437. PROCEDURE TestR2*(CONST a: ARRAY [*,*] OF REAL; r1, r2: RANGE);
  438. VAR i,j: LONGINT;
  439. BEGIN
  440. i := FIRST(r1); WHILE i <= LAST(r1) DO
  441. j := FIRST(r2); WHILE j <= LAST(r2) DO
  442. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2)]=REAL(10*i+j));
  443. INC(j,STEP(r2)) END;
  444. INC(i,STEP(r1)) END;
  445. END TestR2;
  446. PROCEDURE TestR3*(CONST a: ARRAY [*,*,*] OF REAL; r1, r2, r3: RANGE);
  447. VAR i,j,k: LONGINT;
  448. BEGIN
  449. i := FIRST(r1); WHILE i <= LAST(r1) DO
  450. j := FIRST(r2); WHILE j <= LAST(r2) DO
  451. k := FIRST(r3); WHILE k <= LAST(r3) DO
  452. ASSERT(a[(i-FIRST(r1)) DIV STEP(r1),(j-FIRST(r2)) DIV STEP(r2),(k-FIRST(r3)) DIV STEP(r3)]=REAL(100*i+10*j+k));
  453. INC(k,STEP(r3)) END;
  454. INC(j,STEP(r2)) END;
  455. INC(i,STEP(r1)) END;
  456. END TestR3;
  457. BEGIN NEW(gen);
  458. END Driver.
  459. positive: driver tests (fill and compare arrays)
  460. MODULE Test;
  461. IMPORT Driver;
  462. PROCEDURE TestS;
  463. VAR a: ARRAY [*,*] OF SHORTINT; b: ARRAY [?] OF SHORTINT; c: ARRAY [2,3] OF SHORTINT;
  464. BEGIN
  465. NEW(a,2,3); NEW(b,2,3);
  466. Driver.FillS(a); Driver.FillS(b); Driver.FillS(c);
  467. Driver.TestFillS(a); Driver.TestFillS(b); Driver.TestFillS(c);
  468. Driver.TestFillL(a); Driver.TestFillL(b); Driver.TestFillL(c);
  469. ASSERT(a = [[0,1,2],[10,11,12]]);
  470. ASSERT(b = a); ASSERT(c=a);
  471. Driver.RandomS(a); Driver.RandomS(b); Driver.RandomS(c);
  472. END TestS;
  473. PROCEDURE TestI;
  474. VAR a: ARRAY [*,*] OF INTEGER; b: ARRAY [?] OF INTEGER; c: ARRAY [2,3] OF INTEGER;
  475. BEGIN
  476. NEW(a,2,3); NEW(b,2,3);
  477. Driver.FillI(a); Driver.FillI(b); Driver.FillI(c);
  478. Driver.TestFillL(a); Driver.TestFillL(b); Driver.TestFillL(c);
  479. ASSERT(a = [[0,1,2],[10,11,12]]);
  480. ASSERT(b = a); ASSERT(c=a);
  481. Driver.RandomI(a); Driver.RandomI(b); Driver.RandomI(c);
  482. END TestI;
  483. PROCEDURE TestL;
  484. VAR a: ARRAY [*,*] OF LONGINT; b: ARRAY [?] OF LONGINT; c: ARRAY [2,3] OF LONGINT;
  485. BEGIN
  486. NEW(a,2,3); NEW(b,2,3);
  487. Driver.FillL(a); Driver.FillL(b); Driver.FillL(c);
  488. Driver.TestFillL(a); Driver.TestFillL(b); Driver.TestFillL(c);
  489. ASSERT(a = [[0,1,2],[10,11,12]]);
  490. ASSERT(b = a); ASSERT(c=a);
  491. Driver.RandomL(a); Driver.RandomL(b); Driver.RandomL(c);
  492. END TestL;
  493. PROCEDURE TestR;
  494. VAR a: ARRAY [*,*] OF REAL; b: ARRAY [?] OF REAL; c: ARRAY [2,3] OF REAL;
  495. BEGIN
  496. NEW(a,2,3); NEW(b,2,3);
  497. Driver.FillR(a); Driver.FillR(b); Driver.FillR(c);
  498. Driver.TestFillR(a); Driver.TestFillR(b); Driver.TestFillR(c);
  499. ASSERT(a = [[0,1,2],[10,11,12]]);
  500. ASSERT(b = a); ASSERT(c=a);
  501. Driver.RandomR(a); Driver.RandomR(b); Driver.RandomR(c);
  502. END TestR;
  503. PROCEDURE TestX;
  504. VAR a: ARRAY [*,*] OF LONGREAL; b: ARRAY [?] OF LONGREAL; c: ARRAY [2,3] OF LONGREAL;
  505. BEGIN
  506. NEW(a,2,3); NEW(b,2,3);
  507. Driver.FillX(a); Driver.FillX(b); Driver.FillX(c);
  508. Driver.TestFillX(a); Driver.TestFillX(b); Driver.TestFillX(c);
  509. ASSERT(a = [[0,1,2],[10,11,12]]);
  510. ASSERT(b = a); ASSERT(c=a);
  511. Driver.RandomX(a); Driver.RandomX(b); Driver.RandomX(c);
  512. END TestX;
  513. BEGIN
  514. TestS; TestI; TestL; TestR; TestX
  515. END Test.
  516. positive: use ranges in procedure with static global array (was: register allocation problem)
  517. MODULE Test;
  518. VAR a: ARRAY [3,3] OF SHORTINT;
  519. PROCEDURE Test(r1,r2: RANGE);
  520. BEGIN
  521. ASSERT (a[r1,r2] = [[2,3],[5,6]]);
  522. END Test;
  523. BEGIN
  524. a := [[1,2,3],[4,5,6],[7,8,9]];
  525. Test(0..1,1..2);
  526. END Test.
  527. positive: test for unequality with unallocated arrays
  528. MODULE Test;
  529. VAR array: ARRAY [*] OF SHORTINT; tensor: ARRAY [?] OF SHORTINT;
  530. BEGIN
  531. ASSERT(array # [1,2]);
  532. ASSERT(~(array = [1,2]));
  533. ASSERT(~(array > [1,2]));
  534. ASSERT(~(array < [1,2]));
  535. ASSERT(~(array >= [1,2]));
  536. ASSERT(~(array <= [1,2]));
  537. ASSERT(tensor # [1,2]);
  538. ASSERT(~(tensor = [1,2]));
  539. ASSERT(~(tensor > [1,2]));
  540. ASSERT(~(tensor < [1,2]));
  541. ASSERT(~(tensor >= [1,2]));
  542. ASSERT(~(tensor <= [1,2]));
  543. END Test.
  544. positive: simple tests for ranges
  545. MODULE Test;
  546. IMPORT Driver;
  547. PROCEDURE TestS;
  548. VAR s1: ARRAY [*] OF SHORTINT; s2: ARRAY [*,*] OF SHORTINT; s3: ARRAY [*,*,*] OF SHORTINT;
  549. BEGIN
  550. NEW(s1,3); NEW(s2,3,4); NEW(s3,3,4,5);
  551. Driver.FillS(s1); Driver.FillS(s2); Driver.FillS(s3);
  552. Driver.TestFillS(s1); Driver.TestFillS(s2); Driver.TestFillS(s3);
  553. Driver.TestS1(s1[1..2],1..2);
  554. Driver.TestS2(s2[1..2,2..3],1..2,2..3);
  555. Driver.TestS3(s3[1..2,2..3,3..4],1..2,2..3,3..4);
  556. END TestS;
  557. PROCEDURE TestI;
  558. VAR s1: ARRAY [*] OF INTEGER; s2: ARRAY [*,*] OF INTEGER; s3: ARRAY [*,*,*] OF INTEGER;
  559. BEGIN
  560. NEW(s1,3); NEW(s2,3,4); NEW(s3,3,4,5);
  561. Driver.FillI(s1); Driver.FillI(s2); Driver.FillI(s3);
  562. Driver.TestFillI(s1); Driver.TestFillI(s2); Driver.TestFillI(s3);
  563. Driver.TestI1(s1[1..2],1..2);
  564. Driver.TestI2(s2[1..2,2..3],1..2,2..3);
  565. Driver.TestI3(s3[1..2,2..3,3..4],1..2,2..3,3..4);
  566. END TestI;
  567. PROCEDURE TestL;
  568. VAR s1: ARRAY [*] OF LONGINT; s2: ARRAY [*,*] OF LONGINT; s3: ARRAY [*,*,*] OF LONGINT;
  569. BEGIN
  570. NEW(s1,3); NEW(s2,3,4); NEW(s3,3,4,5);
  571. Driver.FillL(s1); Driver.FillL(s2); Driver.FillL(s3);
  572. Driver.TestFillL(s1); Driver.TestFillL(s2); Driver.TestFillL(s3);
  573. Driver.TestL1(s1[1..2],1..2);
  574. Driver.TestL2(s2[1..2,2..3],1..2,2..3);
  575. Driver.TestL3(s3[1..2,2..3,3..4],1..2,2..3,3..4);
  576. END TestL;
  577. PROCEDURE TestR;
  578. VAR s1: ARRAY [*] OF REAL; s2: ARRAY [*,*] OF REAL; s3: ARRAY [*,*,*] OF REAL;
  579. BEGIN
  580. NEW(s1,3); NEW(s2,3,4); NEW(s3,3,4,5);
  581. Driver.FillR(s1); Driver.FillR(s2); Driver.FillR(s3);
  582. Driver.TestFillR(s1); Driver.TestFillR(s2); Driver.TestFillR(s3);
  583. Driver.TestR1(s1[1..2],1..2);
  584. Driver.TestR2(s2[1..2,2..3],1..2,2..3);
  585. Driver.TestR3(s3[1..2,2..3,3..4],1..2,2..3,3..4);
  586. END TestR;
  587. PROCEDURE TestX;
  588. VAR s1: ARRAY [*] OF LONGREAL; s2: ARRAY [*,*] OF LONGREAL; s3: ARRAY [*,*,*] OF LONGREAL;
  589. BEGIN
  590. NEW(s1,3); NEW(s2,3,4); NEW(s3,3,4,5);
  591. Driver.FillX(s1); Driver.FillX(s2); Driver.FillX(s3);
  592. Driver.TestFillX(s1); Driver.TestFillX(s2); Driver.TestFillX(s3);
  593. Driver.TestX1(s1[1..2],1..2);
  594. Driver.TestX2(s2[1..2,2..3],1..2,2..3);
  595. Driver.TestX3(s3[1..2,2..3,3..4],1..2,2..3,3..4);
  596. END TestX;
  597. BEGIN TestS; TestI; TestL; TestR; TestX
  598. END Test.
  599. positive: conversion tests
  600. MODULE Test;
  601. IMPORT Driver;
  602. VAR s: ARRAY [?] OF SHORTINT; i: ARRAY [?] OF INTEGER; l: ARRAY [?] OF LONGINT; r: ARRAY [?] OF REAL; x: ARRAY [?] OF LONGREAL;
  603. BEGIN
  604. NEW(s,2,3,5);
  605. Driver.FillS(s); Driver.TestFillS(s);
  606. i := s; l := s; r := s; x := s; Driver.TestFillI(i); Driver.TestFillL(l); Driver.TestFillR(r); Driver.TestFillX(x);
  607. l := i; r := i; x := i; Driver.TestFillL(l); Driver.TestFillR(r); Driver.TestFillX(x);
  608. r := l; x := l; Driver.TestFillR(r); Driver.TestFillX(x);
  609. x := r; Driver.TestFillX(x);
  610. r := SHORT(x); Driver.TestFillR(r);
  611. l := ENTIER(x); Driver.TestFillL(l);
  612. i := SHORT(l); Driver.TestFillI(i);
  613. s := SHORT(i); Driver.TestFillS(s);
  614. END Test.
  615. positive: correct use of ADDRESS OF and SYSTEM.VAL for tensors and open math arrays
  616. MODULE Test;
  617. IMPORT SYSTEM;
  618. VAR a: ARRAY [*,*,*] OF REAL;
  619. PROCEDURE GetDim(adr: ADDRESS): LONGINT;
  620. CONST
  621. AddressSize=SIZEOF(ADDRESS);
  622. MathDimOffset=3*AddressSize;
  623. BEGIN
  624. SYSTEM.GET(adr+MathDimOffset,adr); RETURN adr;
  625. END GetDim;
  626. PROCEDURE P(CONST a: ARRAY [?] OF REAL);
  627. VAR adr,val,val2: LONGINT;
  628. BEGIN
  629. adr := SYSTEM.ADR(a);
  630. SYSTEM.GET(adr,val2);
  631. val := SYSTEM.VAL(LONGINT,a);
  632. ASSERT(val = val2);
  633. ASSERT(GetDim(val) = 3);
  634. END P;
  635. PROCEDURE Q(CONST a: ARRAY [*,*,*] OF REAL);
  636. VAR adr: LONGINT;
  637. BEGIN
  638. adr := SYSTEM.ADR(a);
  639. ASSERT(GetDim(adr) = 3);
  640. END Q;
  641. BEGIN
  642. NEW(a,1,2,3);
  643. P(a); Q(a);
  644. END Test.
  645. positive: Test of Min and Max
  646. MODULE Test;
  647. TYPE B= ARRAY [*,*] OF REAL;
  648. CONST a = [[1,2,3],
  649. [4,5,6],
  650. [7,8,9]];
  651. PROCEDURE Min;
  652. VAR b:B;
  653. BEGIN
  654. b:=a;
  655. ASSERT(a=b);
  656. ASSERT(MIN(a)=1);
  657. ASSERT(MIN(a[1..])=4);
  658. ASSERT(MIN(a[..1])=1);
  659. ASSERT(MIN(a[..,1..])=2);
  660. ASSERT(MIN(a[..,..1])=1);
  661. ASSERT(MIN(b)=1);
  662. ASSERT(MIN(b[1..,*])=4);
  663. ASSERT(MIN(b[..1,*])=1);
  664. ASSERT(MIN(b[*,1..])=2);
  665. ASSERT(MIN(b[*,..1])=1);
  666. END Min;
  667. PROCEDURE Max;
  668. VAR b: B;
  669. BEGIN
  670. b:=a;
  671. ASSERT(a=b);
  672. ASSERT(MAX(a)=9);
  673. ASSERT(MAX(a[1..])=9);
  674. ASSERT(MAX(a[..1])=6);
  675. ASSERT(MAX(a[..,1..])=9);
  676. ASSERT(MAX(a[..,..1])=8);
  677. ASSERT(MAX(b)=9);
  678. ASSERT(MAX(b[1..])=9);
  679. ASSERT(MAX(b[..1])=6);
  680. ASSERT(MAX(b[..,1..])=9);
  681. ASSERT(MAX(b[..,..1])=8);
  682. END Max;
  683. BEGIN Min; Max;
  684. END Test.
  685. positive: Temporary allocation of small arrays (failed before 2016.10.07)
  686. MODULE Test;
  687. PROCEDURE Do;
  688. VAR LT1,LT2: ARRAY [4,4] OF REAL;
  689. L: ARRAY [4] OF REAL;
  690. BEGIN
  691. L := LT1 * LT2 * [0.3, 0, 0, 1];
  692. END Do;
  693. BEGIN
  694. Do;
  695. END Test.