| 1 | (* Auxiliary functions for test cases *) |
| 2 | |
| 3 | infix 1 seq |
| 4 | fun e1 seq e2 = e2; |
| 5 | fun check b = if b then "OK" else "WRONG"; |
| 6 | fun check' f = (if f () then "OK" else "WRONG") handle _ => "EXN"; |
| 7 | |
| 8 | fun range (from, to) p = |
| 9 | let open Int |
| 10 | in |
| 11 | (from > to) orelse (p from) andalso (range (from+1, to) p) |
| 12 | end; |
| 13 | |
| 14 | fun checkrange bounds = check o range bounds; |
| 15 | |
| 16 | fun tst0 s s' = print (s ^ " \t" ^ s' ^ "\n"); |
| 17 | fun tst s b = tst0 s (check b); |
| 18 | fun tst' s f = tst0 s (check' f); |
| 19 | |
| 20 | fun tstrange s bounds = (tst s) o range bounds |
| 21 | |
| 22 | |
| 23 | (* test/int.sml -- here we test only the `exotic' operations |
| 24 | PS 1995-02-25, 1996-07-02 *) |
| 25 | |
| 26 | (*KILL 05/11/1997 10:59. tho.: |
| 27 | use "auxil.sml"; |
| 28 | *) |
| 29 | |
| 30 | val _ = print "\nFile int.sml: Testing structure Int...\n" |
| 31 | |
| 32 | local |
| 33 | open Int |
| 34 | infix 7 quot rem |
| 35 | fun divmod s (i, d, q, r) = tst s (i div d = q andalso i mod d = r); |
| 36 | fun quotrem s (i, d, q, r) = tst s (i quot d = q andalso i rem d = r); |
| 37 | in |
| 38 | |
| 39 | val test1a = divmod "test1a" (10, 3, 3, 1); |
| 40 | val test1b = divmod "test1b" (~10, 3, ~4, 2); |
| 41 | val test1c = divmod "test1c" (~10, ~3, 3, ~1); |
| 42 | val test1d = divmod "test1d" (10, ~3, ~4, ~2); |
| 43 | |
| 44 | val test2a = quotrem "test2a" (10, 3, 3, 1); |
| 45 | val test2b = quotrem "test2b" (~10, 3, ~3, ~1); |
| 46 | val test2c = quotrem "test2c" (~10, ~3, 3, ~1); |
| 47 | val test2d = quotrem "test2d" (10, ~3, ~3, 1); |
| 48 | |
| 49 | val test3 = tst "test3" (max(~5, 2) = 2 andalso max(5, 2) = 5); |
| 50 | val test4 = tst "test4" (min(~5, 3) = ~5 andalso min(5, 2) = 2); |
| 51 | |
| 52 | val test5 = tst "test5" (sign ~57 = ~1 andalso sign 99 = 1 andalso sign 0 = 0); |
| 53 | val test6 = tst "test6" (sameSign(~255, ~256) andalso sameSign(255, 256) |
| 54 | andalso sameSign(0, 0)); |
| 55 | |
| 56 | val test12 = |
| 57 | tst0 "test12" (case (minInt, maxInt) of |
| 58 | (SOME mi, SOME ma) => check(sign mi = ~1 andalso sign ma = 1 |
| 59 | andalso sameSign(mi, ~1) andalso sameSign(ma, 1)) |
| 60 | | (NONE, NONE) => "OK" |
| 61 | | _ => "WRONG") |
| 62 | |
| 63 | fun chk f (s, r) = |
| 64 | tst' "chk" (fn _ => |
| 65 | case f s of |
| 66 | SOME res => res = r |
| 67 | | NONE => false) |
| 68 | |
| 69 | fun chkScan fmt = chk (StringCvt.scanString (scan fmt)) |
| 70 | |
| 71 | val test13a = |
| 72 | List.map (chk fromString) |
| 73 | [("10789", 10789), |
| 74 | ("+10789", 10789), |
| 75 | ("~10789", ~10789), |
| 76 | ("-10789", ~10789), |
| 77 | (" \n\t10789crap", 10789), |
| 78 | (" \n\t+10789crap", 10789), |
| 79 | (" \n\t~10789crap", ~10789), |
| 80 | (" \n\t-10789crap", ~10789), |
| 81 | ("0w123", 0), |
| 82 | ("0W123", 0), |
| 83 | ("0x123", 0), |
| 84 | ("0X123", 0), |
| 85 | ("0wx123", 0), |
| 86 | ("0wX123", 0)]; |
| 87 | |
| 88 | val test13b = |
| 89 | List.map (fn s => tst0 "test13b" (case fromString s of NONE => "OK" | _ => "WRONG")) |
| 90 | ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", |
| 91 | "+ 1", "~ 1", "- 1", "ff"]; |
| 92 | |
| 93 | val test14a = |
| 94 | List.map (chkScan StringCvt.DEC) |
| 95 | [("10789", 10789), |
| 96 | ("+10789", 10789), |
| 97 | ("~10789", ~10789), |
| 98 | ("-10789", ~10789), |
| 99 | (" \n\t10789crap", 10789), |
| 100 | (" \n\t+10789crap", 10789), |
| 101 | (" \n\t~10789crap", ~10789), |
| 102 | (" \n\t-10789crap", ~10789), |
| 103 | ("0w123", 0), |
| 104 | ("0W123", 0), |
| 105 | ("0x123", 0), |
| 106 | ("0X123", 0), |
| 107 | ("0wx123", 0), |
| 108 | ("0wX123", 0)]; |
| 109 | |
| 110 | val test14b = |
| 111 | List.map (fn s => tst0 "test14b" (case StringCvt.scanString (scan StringCvt.DEC) s |
| 112 | of NONE => "OK" | _ => "WRONG")) |
| 113 | ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", |
| 114 | "+ 1", "~ 1", "- 1", "ff"]; |
| 115 | |
| 116 | val test15a = |
| 117 | List.map (chkScan StringCvt.BIN) |
| 118 | [("10010", 18), |
| 119 | ("+10010", 18), |
| 120 | ("~10010", ~18), |
| 121 | ("-10010", ~18), |
| 122 | (" \n\t10010crap", 18), |
| 123 | (" \n\t+10010crap", 18), |
| 124 | (" \n\t~10010crap", ~18), |
| 125 | (" \n\t-10010crap", ~18), |
| 126 | ("0w101", 0), |
| 127 | ("0W101", 0), |
| 128 | ("0x101", 0), |
| 129 | ("0X101", 0), |
| 130 | ("0wx101", 0), |
| 131 | ("0wX101", 0)]; |
| 132 | |
| 133 | val test15b = |
| 134 | List.map (fn s => tst0 "test15b" (case StringCvt.scanString (scan StringCvt.BIN) s |
| 135 | of NONE => "OK" | _ => "WRONG")) |
| 136 | ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", |
| 137 | "+ 1", "~ 1", "- 1", "2", "8", "ff"]; |
| 138 | |
| 139 | val test16a = |
| 140 | List.map (chkScan StringCvt.OCT) |
| 141 | [("2071", 1081), |
| 142 | ("+2071", 1081), |
| 143 | ("~2071", ~1081), |
| 144 | ("-2071", ~1081), |
| 145 | (" \n\t2071crap", 1081), |
| 146 | (" \n\t+2071crap", 1081), |
| 147 | (" \n\t~2071crap", ~1081), |
| 148 | (" \n\t-2071crap", ~1081), |
| 149 | ("0w123", 0), |
| 150 | ("0W123", 0), |
| 151 | ("0x123", 0), |
| 152 | ("0X123", 0), |
| 153 | ("0wx123", 0), |
| 154 | ("0wX123", 0)]; |
| 155 | |
| 156 | val test16b = |
| 157 | List.map (fn s => tst0 "test16b" (case StringCvt.scanString (scan StringCvt.OCT) s |
| 158 | of NONE => "OK" | _ => "WRONG")) |
| 159 | ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", |
| 160 | "+ 1", "~ 1", "- 1", "8", "ff"]; |
| 161 | |
| 162 | val test17a = |
| 163 | List.map (chkScan StringCvt.HEX) |
| 164 | [("20Af", 8367), |
| 165 | ("+20Af", 8367), |
| 166 | ("~20Af", ~8367), |
| 167 | ("-20Af", ~8367), |
| 168 | (" \n\t20AfGrap", 8367), |
| 169 | (" \n\t+20AfGrap", 8367), |
| 170 | (" \n\t~20AfGrap", ~8367), |
| 171 | (" \n\t-20AfGrap", ~8367), |
| 172 | ("0w123", 0), |
| 173 | ("0W123", 0), |
| 174 | ("0x", 0), |
| 175 | ("0x ", 0), |
| 176 | ("0xG", 0), |
| 177 | ("0X", 0), |
| 178 | ("0XG", 0), |
| 179 | ("0x123", 291), |
| 180 | ("0X123", 291), |
| 181 | ("-0x123", ~291), |
| 182 | ("-0X123", ~291), |
| 183 | ("~0x123", ~291), |
| 184 | ("~0X123", ~291), |
| 185 | ("+0x123", 291), |
| 186 | ("+0X123", 291), |
| 187 | ("0wx123", 0), |
| 188 | ("0wX123", 0)]; |
| 189 | |
| 190 | val test17b = |
| 191 | List.map (fn s => tst0 "test17b" (case StringCvt.scanString (scan StringCvt.HEX) s |
| 192 | of NONE => "OK" | _ => "WRONG")) |
| 193 | ["", "-", "~", "+", " \n\t", " \n\t-", " \n\t~", " \n\t+", |
| 194 | "+ 1", "~ 1", "- 1"]; |
| 195 | |
| 196 | |
| 197 | local |
| 198 | fun fromToString i = |
| 199 | fromString (toString i) = SOME i; |
| 200 | |
| 201 | fun scanFmt radix i = |
| 202 | StringCvt.scanString (scan radix) (fmt radix i) = SOME i; |
| 203 | |
| 204 | in |
| 205 | val test18 = |
| 206 | tst' "test18" (fn _ => range (~1200, 1200) fromToString); |
| 207 | |
| 208 | val test19 = |
| 209 | tst' "test19" (fn _ => range (~1200, 1200) (scanFmt StringCvt.BIN)); |
| 210 | |
| 211 | val test20 = |
| 212 | tst' "test20" (fn _ => range (~1200, 1200) (scanFmt StringCvt.OCT)); |
| 213 | |
| 214 | val test21 = |
| 215 | tst' "test21" (fn _ => range (~1200, 1200) (scanFmt StringCvt.DEC)); |
| 216 | |
| 217 | val test22 = |
| 218 | tst' "test22" (fn _ => range (~1200, 1200) (scanFmt StringCvt.HEX)); |
| 219 | end |
| 220 | |
| 221 | end |