home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / mosmllib / test / array2.sml < prev    next >
Encoding:
Text File  |  1997-08-18  |  14.2 KB  |  415 lines  |  [TEXT/R*ch]

  1. (* File "test/array2.sml" 1995-09-12, 1997-03-12 *)
  2.  
  3. val _ = load "Array2";            (* MOSML *)
  4.  
  5. use "auxil.sml";
  6.  
  7. local 
  8.     open Array2
  9. in
  10.  
  11. val a0 = tabulate(0, 0, fn (i, j) => 1 div 0);
  12. fun fill (i, j) = 10 * i + j
  13.  
  14. val sequence = ref ([] : (int * int) list)
  15.  
  16. val a = tabulate(3, 4, fn args => (sequence := args :: !sequence; fill args));
  17.  
  18. val test0 = !sequence = [(2,3), (2,2), (2,1), (2,0), 
  19.              (1,3), (1,2), (1,1), (1,0), 
  20.              (0,3), (0,2), (0,1), (0,0)];
  21.  
  22. val test1a = 
  23.     check'(fn _ => 
  24.        sub(a, 1, 2) = 12
  25.        andalso sub(a, 0, 0) = 0
  26.        andalso sub(a, 0, 3) = 3
  27.        andalso sub(a, 2, 0) = 20
  28.        andalso sub(a, 2, 3) = 23);
  29.  
  30. val test1b = (sub(a, 3, 0) seq "WRONG")
  31.              handle Subscript => "OK" | _ => "WRONG";
  32. val test1c = (sub(a, 0, 4) seq "WRONG")
  33.              handle Subscript => "OK" | _ => "WRONG";
  34. val test1d = (sub(a, ~1, 0) seq "WRONG")
  35.              handle Subscript => "OK" | _ => "WRONG";
  36. val test1e = (sub(a, 0, ~1) seq "WRONG")
  37.              handle Subscript => "OK" | _ => "WRONG";
  38. val test1f = (sub(a, ~1, ~1) seq "WRONG")
  39.              handle Subscript => "OK" | _ => "WRONG";
  40.  
  41. val _ = update(a, 1, 2, 112);
  42.  
  43. val test2 =
  44.     check'(fn _ => 
  45.        sub(a, 1, 2) = 112
  46.        andalso sub(a, 1, 1) = 11
  47.        andalso sub(a, 1, 3) = 13
  48.        andalso sub(a, 0, 2) =  2
  49.        andalso sub(a, 2, 2) = 22);
  50.  
  51. val test3a = check'(fn _ => dimensions a = (3, 4));
  52. val test3b = check'(fn _ => height a = 3);
  53. val test3c = check'(fn _ => width a = 4);
  54.  
  55. val test4a = 
  56.     check'(fn _ =>
  57.        row(a, 0) = Vector.tabulate(4, fn j => fill(0, j)));
  58. val test4b = 
  59.     check'(fn _ =>
  60.        row(a, 2) = Vector.tabulate(4, fn j => fill(2, j)));
  61. val test4c = (row(a, 4) seq "WRONG")
  62.              handle Subscript => "OK" | _ => "WRONG";
  63. val test4d = (row(a, ~1) seq "WRONG")
  64.              handle Subscript => "OK" | _ => "WRONG";
  65.  
  66. val test5a = 
  67.     check'(fn _ =>
  68.        column(a, 0) = Vector.tabulate(3, fn i => fill(i, 0)));
  69. val test5b = 
  70.     check'(fn _ =>
  71.        column(a, 3) = Vector.tabulate(3, fn i => fill(i, 3)));
  72. val test5c = (column(a,  4) seq "WRONG")
  73.              handle Subscript => "OK" | _ => "WRONG";
  74. val test5d = (column(a, ~1) seq "WRONG")
  75.              handle Subscript => "OK" | _ => "WRONG";
  76.  
  77. val a1 = tabulate(3, 4, fill);        (* Supposed to be constant below *)
  78.  
  79. fun testcopy src_reg dst_row dst_col reschk = 
  80.     check'(fn _ => 
  81.        let val a2 = tabulate(3, 4, fill);
  82.            val _ = copy { src=a2, dst=a2, src_reg = src_reg, 
  83.                  dst_col=dst_col, dst_row=dst_row } 
  84.        in reschk a2 end);
  85.  
  86. fun same a2 = List.all (fn i => row(a2, i) = row(a1, i)) [0, 1, 2]
  87.  
  88. fun elts matrix a2 = [row(a2, 0), row(a2, 1), row(a2, 2)] = matrix
  89.  
  90. val test6a = 
  91.     testcopy {row=0, col=0, ht=NONE, wd=NONE} 0 0 same
  92. val test6b = 
  93.     testcopy {row=3,  col=0,  ht=NONE, wd=NONE } 0 0 same
  94. val test6c = 
  95.     testcopy {row=0,  col=4,  ht=NONE, wd=NONE } 0 0 same
  96. val test6d = 
  97.     testcopy {row=3,  col=4,  ht=NONE, wd=NONE } 0 0 same
  98. val test6e = 
  99.     testcopy {row=3,  col=4,  ht=SOME 0, wd=SOME 0 } 0 0 same
  100. val test6f = 
  101.     testcopy {row=1,  col=1,  ht=SOME 0, wd=SOME 2 } 0 0 same
  102. val test6g = 
  103.     testcopy {row=1,  col=1,  ht=SOME 2, wd=SOME 0 } 0 0 same
  104. val test6h = 
  105.     testcopy {row=0,  col=0,  ht=NONE, wd=SOME 3 } 0 1
  106.     (elts [ #[0, 0, 1, 2], #[10, 10, 11, 12], #[20, 20, 21, 22]])
  107. val test6i = 
  108.     testcopy {row=0,  col=0,  ht=SOME 2, wd=NONE } 1 0
  109.     (elts [ #[0, 1, 2, 3], #[0, 1, 2, 3], #[10, 11, 12, 13]])
  110. val test6j = 
  111.     testcopy {row=0,  col=0,  ht=SOME 2, wd=SOME 3 } 1 1
  112.     (elts [ #[0, 1, 2, 3], #[10, 0, 1, 2], #[20, 10, 11, 12]])
  113. val test6k = 
  114.     testcopy {row=1,  col=1,  ht=SOME 2, wd=SOME 3 } 0 0
  115.     (elts [ #[11, 12, 13, 3], #[21, 22, 23, 13], #[20, 21, 22, 23]])
  116. val test6l = 
  117.     testcopy {row=0,  col=1,  ht=SOME 2, wd=SOME 3 } 1 0
  118.     (elts [ #[0, 1, 2, 3], #[1, 2, 3, 13], #[11, 12, 13, 23]])
  119. val test6m = 
  120.     testcopy {row=0,  col=1,  ht=SOME 2, wd=SOME 3 } 1 1
  121.     (elts [ #[0, 1, 2, 3], #[10, 1, 2, 3], #[20, 11, 12, 13]])
  122. val test6n = 
  123.     testcopy {row=0,  col=1,  ht=NONE, wd=SOME 1 } 0 3
  124.     (elts [ #[0, 1, 2, 1], #[10, 11, 12, 11], #[20, 21, 22, 21]])
  125. val test6o = 
  126.     testcopy {row=1,  col=0,  ht=SOME 1, wd=NONE } 2 0
  127.     (elts [ #[0, 1, 2, 3], #[10, 11, 12, 13], #[10, 11, 12, 13]])
  128.  
  129. fun failcopy src_reg dst_row dst_col = 
  130.     (copy { src=a1, dst=a1, src_reg=src_reg, 
  131.        dst_col=dst_col, dst_row=dst_row } seq "WRONG")
  132.     handle Subscript => "OK" | _ => "WRONG"
  133.  
  134. val test7a = failcopy {row=0,   col=0,   ht=NONE,   wd=NONE   } 0 1
  135. val test7b = failcopy {row=0,   col=0,   ht=NONE,   wd=NONE   } 1 0
  136. val test7c = failcopy {row=0,   col=0,   ht=NONE,   wd=SOME 4 } 0 1
  137. val test7d = failcopy {row=0,   col=0,   ht=SOME 3, wd=NONE   } 1 0
  138. val test7e = failcopy {row=0,   col=0,   ht=NONE,   wd=SOME 5 } 0 0
  139. val test7f = failcopy {row=0,   col=0,   ht=SOME 4, wd=NONE   } 0 0
  140. val test7g = failcopy {row= ~1, col=0,   ht=NONE,   wd=NONE   } 0 0
  141. val test7h = failcopy {row=0,   col= ~1, ht=NONE,   wd=NONE   } 0 0
  142. val test7i = failcopy {row=3,   col=0,   ht=SOME 1, wd=NONE   } 0 0
  143. val test7j = failcopy {row=0,   col=4,   ht=NONE,   wd=SOME 1 } 0 0
  144. val test7k = failcopy {row=1,   col=1,   ht=NONE,   wd=NONE   } 0 2
  145. val test7l = failcopy {row=1,   col=1,   ht=NONE,   wd=NONE   } 2 0
  146. val test7m = failcopy {row=1,   col=1,   ht=NONE,   wd=SOME 3 } 0 2
  147. val test7n = failcopy {row=1,   col=1,   ht=SOME 2, wd=NONE   } 2 0
  148.  
  149. val sequence = ref ([] : int list);
  150.  
  151. fun collect a = sequence := a :: !sequence;
  152.  
  153. fun collecti (i, j, a) = 
  154.     if fill(i, j) = a then 
  155.     sequence := a :: !sequence
  156.     else
  157.     raise Fail ("collecti: Error in " ^ Int.toString a)
  158.  
  159. val a3 = tabulate(3, 4, fill);
  160.  
  161. val test8a = check'(fn _ => 
  162.     (sequence := []; 
  163.      app collect a3;
  164.      !sequence = [23, 22, 21, 20, 13, 12, 11, 10, 3, 2, 1, 0]));
  165. val test8b = check'(fn _ => 
  166.     (sequence := []; 
  167.      appi collecti (a3, { row=0, col=0, ht=NONE, wd=NONE });
  168.      !sequence = [23, 22, 21, 20, 13, 12, 11, 10, 3, 2, 1, 0]));
  169. val test8c = check'(fn _ => 
  170.     (sequence := []; 
  171.      appi collecti (a3, { row=0, col=1, ht=NONE, wd=NONE });
  172.      !sequence = [23, 22, 21, 13, 12, 11, 3, 2, 1]));
  173. val test8d = check'(fn _ => 
  174.     (sequence := []; 
  175.      appi collecti (a3, { row=1, col=0, ht=NONE, wd=NONE });
  176.      !sequence = [23, 22, 21, 20, 13, 12, 11, 10]));
  177. val test8e = check'(fn _ => 
  178.     (sequence := []; 
  179.      appi collecti (a3, { row=1, col=1, ht=NONE, wd=NONE });
  180.      !sequence = [23, 22, 21, 13, 12, 11]));
  181. val test8f = check'(fn _ => 
  182.     (sequence := []; 
  183.      appi collecti (a3, { row=3, col=0, ht=NONE, wd=NONE });
  184.      !sequence = []));
  185. val test8g = check'(fn _ => 
  186.     (sequence := []; 
  187.      appi collecti (a3, { row=0, col=4, ht=NONE, wd=NONE });
  188.      !sequence = []));
  189. val test8h = check'(fn _ => 
  190.     (sequence := []; 
  191.      appi collecti (a3, { row=1, col=1, ht=SOME 0, wd=NONE });
  192.      !sequence = []));
  193. val test8i = check'(fn _ => 
  194.     (sequence := []; 
  195.      appi collecti (a3, { row=1, col=1, ht=NONE, wd=SOME 0 });
  196.      !sequence = []));
  197. val test8j = check'(fn _ => 
  198.     (sequence := []; 
  199.      appi collecti (a3, { row=1, col=1, ht=SOME 1, wd=NONE });
  200.      !sequence = [13, 12, 11]));
  201. val test8k = check'(fn _ => 
  202.     (sequence := []; 
  203.      appi collecti (a3, { row=1, col=1, ht=NONE, wd=SOME 1 });
  204.      !sequence = [21, 11]));
  205. val test8l = check'(fn _ => 
  206.     (sequence := []; 
  207.      appi collecti (a3, { row=0, col=1, ht=SOME 2, wd=SOME 2 });
  208.      !sequence = [12, 11, 2, 1]));
  209.  
  210. fun chkmodify resseq reschk =
  211.     check'(fn _ =>
  212.        let val a3 = tabulate(3, 4, fill)
  213.        in 
  214.            sequence := [];
  215.            modify (fn a => (collect a; a*10)) a3;
  216.            !sequence = resseq andalso reschk a3
  217.        end)
  218.  
  219. fun chkmodifyi reg resseq reschk =
  220.     check'(fn _ =>
  221.        let val a3 = tabulate(3, 4, fill)
  222.        in 
  223.            sequence := [];
  224.            modifyi (fn (args as (i, j, a)) => (collecti args; a*10))
  225.                   (a3, reg);
  226.            !sequence = resseq andalso reschk a3
  227.        end)
  228.  
  229. val test9a = 
  230.     chkmodify 
  231.       [23, 22, 21, 20, 13, 12, 11, 10, 3, 2, 1, 0]
  232.       (elts [#[0, 10, 20, 30], #[100, 110, 120, 130], #[200, 210, 220, 230]]);
  233. val test9b = 
  234.     chkmodifyi { row=0, col=0, ht=NONE, wd=NONE }
  235.       [23, 22, 21, 20, 13, 12, 11, 10, 3, 2, 1, 0]
  236.       (elts [#[0, 10, 20, 30], #[100, 110, 120, 130], #[200, 210, 220, 230]]);
  237. val test9c = 
  238.     chkmodifyi { row=0, col=1, ht=NONE, wd=NONE }
  239.       [23, 22, 21, 13, 12, 11, 3, 2, 1]
  240.       (elts [#[0, 10, 20, 30], #[10, 110, 120, 130], #[20, 210, 220, 230]]);
  241. val test9d = 
  242.     chkmodifyi { row=1, col=0, ht=NONE, wd=NONE }
  243.       [23, 22, 21, 20, 13, 12, 11, 10]
  244.       (elts [#[0, 1, 2, 3], #[100, 110, 120, 130], #[200, 210, 220, 230]]);
  245. val test9e = 
  246.     chkmodifyi { row=1, col=1, ht=NONE, wd=NONE }
  247.       [23, 22, 21, 13, 12, 11]
  248.       (elts [#[0, 1, 2, 3], #[10, 110, 120, 130], #[20, 210, 220, 230]]);
  249. val test9f =  
  250.     chkmodifyi { row=3, col=0, ht=NONE, wd=NONE }
  251.       []
  252.       (elts [#[0, 1, 2, 3], #[10, 11, 12, 13], #[20, 21, 22, 23]]);
  253. val test9g =  
  254.     chkmodifyi { row=0, col=4, ht=NONE, wd=NONE }
  255.       []
  256.       (elts [#[0, 1, 2, 3], #[10, 11, 12, 13], #[20, 21, 22, 23]]);
  257. val test9h =  
  258.     chkmodifyi { row=1, col=1, ht=SOME 0, wd=NONE }
  259.       []
  260.       (elts [#[0, 1, 2, 3], #[10, 11, 12, 13], #[20, 21, 22, 23]]);
  261. val test9i =  
  262.     chkmodifyi { row=1, col=1, ht=NONE, wd=SOME 0 }
  263.       []
  264.       (elts [#[0, 1, 2, 3], #[10, 11, 12, 13], #[20, 21, 22, 23]]);
  265. val test9j =  
  266.     chkmodifyi { row=1, col=1, ht=SOME 1, wd=NONE }
  267.       [13, 12, 11]
  268.       (elts [#[0, 1, 2, 3], #[10, 110, 120, 130], #[20, 21, 22, 23]]);
  269. val test9k =  
  270.     chkmodifyi { row=1, col=1, ht=NONE, wd=SOME 1 }
  271.       [21, 11]
  272.       (elts [#[0, 1, 2, 3], #[10, 110, 12, 13], #[20, 210, 22, 23]]);
  273. val test9l =  
  274.     chkmodifyi { row=0, col=1, ht=SOME 2, wd=SOME 2 }
  275.       [12, 11, 2, 1]
  276.       (elts [#[0, 10, 20, 3], #[10, 110, 120, 13], #[20, 21, 22, 23]]);
  277.  
  278. fun chkfold traversal resseq =
  279.     check'(fn _ =>
  280.        let val a3 = tabulate(3, 4, fill)
  281.            val sequence = 
  282.            fold traversal (fn (a, res) => a :: res) [] a3
  283.        in sequence = resseq end)
  284.  
  285. fun chkfoldi traversal reg resseq =
  286.     check'(fn _ =>
  287.        let val a3 = tabulate(3, 4, fill)
  288.            fun chkidx i j a = 
  289.            if fill(i, j) = a then () 
  290.            else raise Fail ("chkfoldi: Error in " ^ Int.toString a)
  291.            val sequence = 
  292.            foldi traversal 
  293.            (fn (i, j, a, res) => (chkidx i j a; a :: res)) [] (a3, reg)
  294.        in sequence = resseq end)
  295.  
  296. val test10a1 = 
  297.     chkfold RowMajor
  298.       [23, 22, 21, 20, 13, 12, 11, 10, 3, 2, 1, 0];
  299. val test10a2 = 
  300.     chkfold ColMajor
  301.       [23, 13, 3, 22, 12, 2, 21, 11, 1, 20, 10, 0];
  302. val test10b1 = 
  303.     chkfoldi RowMajor { row=0, col=0, ht=NONE, wd=NONE }
  304.       [23, 22, 21, 20, 13, 12, 11, 10, 3, 2, 1, 0];
  305. val test10b2 = 
  306.     chkfoldi ColMajor { row=0, col=0, ht=NONE, wd=NONE }
  307.       [23, 13, 3, 22, 12, 2, 21, 11, 1, 20, 10, 0];
  308. val test10c1 = 
  309.     chkfoldi RowMajor { row=0, col=1, ht=NONE, wd=NONE }
  310.       [23, 22, 21, 13, 12, 11, 3, 2, 1];
  311. val test10c2 = 
  312.     chkfoldi ColMajor { row=0, col=1, ht=NONE, wd=NONE }
  313.       [23, 13, 3, 22, 12, 2, 21, 11, 1];
  314. val test10d1 = 
  315.     chkfoldi RowMajor { row=1, col=0, ht=NONE, wd=NONE }
  316.       [23, 22, 21, 20, 13, 12, 11, 10];
  317. val test10d2 = 
  318.     chkfoldi ColMajor { row=1, col=0, ht=NONE, wd=NONE }
  319.       [23, 13, 22, 12, 21, 11, 20, 10];
  320. val test10e1 = 
  321.     chkfoldi RowMajor { row=1, col=1, ht=NONE, wd=NONE }
  322.       [23, 22, 21, 13, 12, 11];
  323. val test10e2 = 
  324.     chkfoldi ColMajor { row=1, col=1, ht=NONE, wd=NONE }
  325.       [23, 13, 22, 12, 21, 11];
  326. val test10f1 =  
  327.     chkfoldi RowMajor { row=3, col=0, ht=NONE, wd=NONE }
  328.       [];
  329. val test10f2 =  
  330.     chkfoldi ColMajor { row=3, col=0, ht=NONE, wd=NONE }
  331.       [];
  332. val test10g1 =  
  333.     chkfoldi RowMajor { row=0, col=4, ht=NONE, wd=NONE }
  334.       [];
  335. val test10g2 =  
  336.     chkfoldi ColMajor { row=0, col=4, ht=NONE, wd=NONE }
  337.       [];
  338. val test10h1 =  
  339.     chkfoldi RowMajor { row=1, col=1, ht=SOME 0, wd=NONE }
  340.       [];
  341. val test10h2 =  
  342.     chkfoldi ColMajor { row=1, col=1, ht=SOME 0, wd=NONE }
  343.       [];
  344. val test10i1 =  
  345.     chkfoldi RowMajor { row=1, col=1, ht=NONE, wd=SOME 0 }
  346.       [];
  347. val test10i2 =  
  348.     chkfoldi ColMajor { row=1, col=1, ht=NONE, wd=SOME 0 }
  349.       [];
  350. val test10j1 =  
  351.     chkfoldi RowMajor { row=1, col=1, ht=SOME 1, wd=NONE }
  352.       [13, 12, 11];
  353. val test10j2 =  
  354.     chkfoldi ColMajor { row=1, col=1, ht=SOME 1, wd=NONE }
  355.       [13, 12, 11];
  356. val test10k1 =  
  357.     chkfoldi RowMajor { row=1, col=1, ht=NONE, wd=SOME 1 }
  358.       [21, 11];
  359. val test10k2 =  
  360.     chkfoldi ColMajor { row=1, col=1, ht=NONE, wd=SOME 1 }
  361.       [21, 11];
  362. val test10l1 =  
  363.     chkfoldi RowMajor { row=0, col=1, ht=SOME 2, wd=SOME 2 }
  364.       [12, 11, 2, 1];
  365. val test10l2 =  
  366.     chkfoldi ColMajor { row=0, col=1, ht=SOME 2, wd=SOME 2 }
  367.       [12, 2, 11, 1];
  368.  
  369. fun faili reg = 
  370.     (appi ignore (a1, reg) seq "WRONG") 
  371.     handle Subscript => 
  372.     ((modifyi (fn (_, _, a) => a) (a1, reg)) seq "WRONG") 
  373.     handle Subscript => 
  374.         ((foldi RowMajor (fn _ => 1) 0 (a1, reg)) seq "WRONG") 
  375.         handle Subscript => 
  376.         ((foldi ColMajor (fn _ => 1) 0 (a1, reg)) seq "WRONG") 
  377.         handle Subscript => "OK"
  378.              | _ => "WRONG"
  379.  
  380. val test11a = faili {row=0,   col=0,   ht=NONE,   wd=SOME 5 }
  381. val test11b = faili {row=0,   col=0,   ht=SOME 4, wd=NONE   }
  382. val test11c = faili {row= ~1, col=0,   ht=NONE,   wd=NONE   }
  383. val test11d = faili {row=0,   col= ~1, ht=NONE,   wd=NONE   }
  384. val test11e = faili {row=3,   col=0,   ht=SOME 1, wd=NONE   }
  385. val test11f = faili {row=0,   col=4,   ht=NONE,   wd=SOME 1 }
  386. val test11g = faili {row=0,   col=1,   ht=NONE,   wd=SOME 4 }
  387. val test11h = faili {row=1,   col=0,   ht=SOME 3, wd=NONE   }
  388.  
  389. fun chkfromlist xss =
  390.     check'(fn _ =>
  391.        let val a        = fromList xss
  392.            val elements = 
  393.            List.tabulate(height a, 
  394.                  fn i => Vector.foldr (op::) [] (row(a, i)))
  395.        in elements = xss end)
  396.  
  397. val test12a = chkfromlist []
  398. val test12b = chkfromlist [[]]
  399. val test12c = chkfromlist [[], [], []]
  400. val test12d = chkfromlist [[0]]
  401. val test12e = chkfromlist [[0, 1]]
  402. val test12f = chkfromlist [[0], [10]]
  403. val test12g = chkfromlist [[0, 1, 2], [10, 11, 12]]
  404. val test12h = chkfromlist [[0, 1, 2], [10, 11, 12], [20, 21, 22]]
  405. val test12i = (fromList [[], [2]] seq "WRONG")
  406.               handle Size => "OK" | _ => "WRONG"
  407. val test12j = (fromList [[2], []] seq "WRONG")
  408.               handle Size => "OK" | _ => "WRONG"
  409. val test12k = (fromList [[1, 2, 3], [4, 5, 6], [7, 8]] seq "WRONG")
  410.               handle Size => "OK" | _ => "WRONG"
  411. val test12l = (fromList [[1, 2, 3], [7, 8], [4, 5, 6]] seq "WRONG")
  412.               handle Size => "OK" | _ => "WRONG"
  413.  
  414. end
  415.