StrDecl.sml 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  1. structure StrDecl =
  2. struct
  3. open SMLUnit.Test SMLUnit.Assert
  4. structure StrDt = struct
  5. datatype d1 = D1
  6. end
  7. structure Str1 = struct
  8. type t1 = int
  9. type 'a t2 = 'a -> 'a
  10. val v1 = 1
  11. fun f1 x = x
  12. fun f2 x = x + x - x
  13. datatype d1 = D1
  14. datatype d2 = datatype StrDt.d1
  15. datatype 'a d3 = D3 of 'a
  16. abstype at1 = D1
  17. with
  18. val v2 = D1
  19. end
  20. exception Exn1
  21. fun f3 () = raise Exn1
  22. val v3 = f1 f1
  23. fun op1 (x, y) = x + y
  24. fun op2 (x, y) = x - y
  25. fun op3 (x, y) = x * y
  26. infix op1
  27. infixr op2
  28. fun opf1 () = (2 op1 1)
  29. fun opf2 () = (2 op2 1)
  30. infix op3
  31. nonfix op3
  32. structure Str1 = struct
  33. val v1 = 4
  34. end
  35. end
  36. fun testStrDecl () =
  37. let
  38. val _ = assertEqualInt 1 Str1.v1
  39. val _ = assertEqualInt 1 (Str1.f1 1)
  40. val _ = assertEqualString "A" (Str1.f1 "A")
  41. val _ = assertEqualInt 1 (Str1.f2 1)
  42. val v1 : Str1.t1 = 1
  43. val _ = assertTrue (Str1.D1 = Str1.D1)
  44. val v2 : Str1.d2 = Str1.D1
  45. val v3 : int Str1.d3 = Str1.D3 1
  46. val _ = assertTrue (Str1.D3 "A" = Str1.D3 "A")
  47. val v4 : Str1.at1 = Str1.v2
  48. val _ = Str1.f3 () handle Str1.Exn1 => ()
  49. | _ => fail "NG"
  50. val _ = assertEqualInt 1 (Str1.v3 1)
  51. val _ = assertEqualInt 3 (Str1.opf1 ())
  52. val _ = assertEqualInt 1 (Str1.opf2 ())
  53. val _ = assertEqualInt 4 Str1.Str1.v1
  54. in
  55. ()
  56. end
  57. structure Str2 = Str1
  58. fun testStrDeclStrID () =
  59. let
  60. val _ = assertEqualInt 1 Str2.v1
  61. val _ = assertEqualInt 1 (Str2.f1 1)
  62. val _ = assertEqualString "A" (Str2.f1 "A")
  63. val _ = assertEqualInt 1 (Str2.f2 1)
  64. val v1 : Str2.t1 = 1
  65. val _ = assertTrue (Str2.D1 = Str1.D1)
  66. val v2 : Str2.d2 = Str1.D1
  67. val v3 : int Str2.d3 = Str1.D3 1
  68. val _ = assertTrue (Str2.D3 "A" = Str2.D3 "A")
  69. val v4 : Str2.at1 = Str1.v2
  70. val _ = Str1.f3 () handle Str2.Exn1 => ()
  71. | _ => fail "NG"
  72. val _ = assertEqualInt 3 (Str2.opf1 ())
  73. val _ = assertEqualInt 1 (Str2.opf2 ())
  74. val _ = assertEqualInt 4 Str2.Str1.v1
  75. in
  76. ()
  77. end
  78. structure Str3 = Str1.Str1
  79. fun testStrDeclLongStrID () =
  80. let
  81. val _ = assertEqualInt 4 Str3.v1
  82. in
  83. ()
  84. end
  85. structure Str4 : sig
  86. type t1
  87. type 'a t2
  88. val v1 : t1
  89. val f1 : 'a t2
  90. val f2 : t1 t2
  91. datatype d2 = datatype StrDt.d1
  92. datatype 'a d3 = D3 of 'a
  93. type at1
  94. val v2 : at1
  95. exception Exn1
  96. val f3 : unit -> 'a
  97. val v3 : t1 t2
  98. structure Str1 : sig
  99. val v1 : int
  100. end
  101. end = Str1
  102. fun testStrDeclSigTransparent1 () =
  103. let
  104. val _ = assertEqualInt 1 Str4.v1
  105. val _ = assertEqualInt 1 (Str4.f1 1)
  106. val _ = assertEqualString "A" (Str4.f1 "A")
  107. val _ = assertEqualInt 1 (Str4.f2 1)
  108. val v1 : Str4.t1 = 1
  109. val _ = assertTrue (Str4.D1 = Str4.D1)
  110. val v2 : Str4.d2 = Str4.D1
  111. val v3 : int Str2.d3 = Str1.D3 1
  112. val _ = assertTrue (Str2.D3 "A" = Str2.D3 "A")
  113. val v4 : Str4.at1 = Str4.v2
  114. val _ = Str4.f3 () handle Str4.Exn1 => ()
  115. | _ => fail "NG"
  116. val _ = assertEqualInt 4 Str4.Str1.v1
  117. in
  118. ()
  119. end
  120. structure Str4 = Str1 : sig
  121. type t1
  122. type 'a t2
  123. val v1 : t1
  124. val f1 : 'a t2
  125. val f2 : t1 t2
  126. datatype d2 = datatype StrDt.d1
  127. datatype 'a d3 = D3 of 'a
  128. type at1
  129. val v2 : at1
  130. exception Exn1
  131. val f3 : unit -> 'a
  132. structure Str1 : sig
  133. val v1 : int
  134. end
  135. end
  136. fun testStrDeclSigTransparent2 () =
  137. let
  138. val _ = assertEqualInt 1 Str4.v1
  139. val _ = assertEqualInt 1 (Str4.f1 1)
  140. val _ = assertEqualString "A" (Str4.f1 "A")
  141. val _ = assertEqualInt 1 (Str4.f2 1)
  142. val v1 : Str4.t1 = 1
  143. val _ = assertTrue (Str4.D1 = Str4.D1)
  144. val v2 : Str4.d2 = Str4.D1
  145. val v3 : int Str4.d3 = Str4.D3 1
  146. val _ = assertTrue (Str4.D3 "A" = Str4.D3 "A")
  147. val v4 : Str4.at1 = Str4.v2
  148. val _ = Str4.f3 () handle Str4.Exn1 => ()
  149. | _ => fail "NG"
  150. val _ = assertEqualInt 4 Str4.Str1.v1
  151. in
  152. ()
  153. end
  154. structure Str5 :> sig
  155. type t1
  156. type 'a t2
  157. val v1 : t1
  158. val f1 : 'a t2
  159. val f2 : t1 t2
  160. datatype d2 = datatype StrDt.d1
  161. datatype 'a d3 = D3 of 'a
  162. type at1
  163. val v2 : at1
  164. exception Exn1
  165. val f3 : unit -> 'a
  166. structure Str1 : sig
  167. val v1 : int
  168. end
  169. end = Str1
  170. fun testStrDeclSigOpaque1 () =
  171. let
  172. val v1 : Str5.t1 = Str5.v1
  173. val f1 : 'a Str5.t2 = Str5.f1
  174. val f2 : Str5.t1 Str5.t2 = Str5.f2
  175. val _ = assertTrue (Str5.D1 = Str5.D1)
  176. val v2 : Str5.d2 = Str5.D1
  177. val v3 : int Str5.d3 = Str5.D3 1
  178. val _ = assertTrue (Str5.D3 "A" = Str5.D3 "A")
  179. val v4 : Str5.at1 = Str5.v2
  180. val _ = Str5.f3 () handle Str5.Exn1 => ()
  181. | _ => fail "NG"
  182. val _ = assertEqualInt 4 Str5.Str1.v1
  183. in
  184. ()
  185. end
  186. structure Str5 = Str1 :> sig
  187. type t1
  188. type 'a t2
  189. val v1 : t1
  190. val f1 : 'a t2
  191. val f2 : t1 t2
  192. datatype d2 = datatype StrDt.d1
  193. datatype 'a d3 = D3 of 'a
  194. type at1
  195. val v2 : at1
  196. exception Exn1
  197. val f3 : unit -> 'a
  198. structure Str1 : sig
  199. val v1 : int
  200. end
  201. end
  202. fun testStrDeclSigOpaque2 () =
  203. let
  204. val v1 : Str5.t1 = Str5.v1
  205. val f1 : 'a Str5.t2 = Str5.f1
  206. val f2 : Str5.t1 Str5.t2 = Str5.f2
  207. val _ = assertTrue (Str5.D1 = Str5.D1)
  208. val v2 : Str5.d2 = Str5.D1
  209. val v3 : int Str5.d3 = Str5.D3 1
  210. val _ = assertTrue (Str5.D3 "A" = Str5.D3 "A")
  211. val v4 : Str5.at1 = Str5.v2
  212. val _ = Str5.f3 () handle Str5.Exn1 => ()
  213. | _ => fail "NG"
  214. val _ = assertEqualInt 4 Str5.Str1.v1
  215. in
  216. ()
  217. end
  218. structure Str6 :> sig
  219. type t1 = int
  220. val v1 : int
  221. val f1 : 'a -> 'a
  222. val f2 : word -> word
  223. datatype d2 = datatype StrDt.d1
  224. datatype 'a d3 = D3 of 'a
  225. type at1
  226. val v2 : at1
  227. exception Exn1
  228. val f3 : unit -> 'a
  229. structure Str1 : sig
  230. val v1 : int
  231. end
  232. end = Str1
  233. fun testStrDeclSigOpaque3 () =
  234. let
  235. val _ = assertEqualInt 1 Str6.v1
  236. val _ = assertEqualInt 1 (Str6.f1 1)
  237. val _ = assertEqualString "A" (Str6.f1 "A")
  238. val _ = assertEqualWord 0w1 (Str6.f2 0w1)
  239. val v1 : Str6.t1 = 1
  240. val _ = assertTrue (Str6.D1 = Str6.D1)
  241. val v2 : Str6.d2 = Str6.D1
  242. val v3 : int Str6.d3 = Str6.D3 1
  243. val _ = assertTrue (Str6.D3 "A" = Str6.D3 "A")
  244. val v4 : Str6.at1 = Str6.v2
  245. val _ = Str6.f3 () handle Str6.Exn1 => ()
  246. | _ => fail "NG"
  247. val _ = assertEqualInt 4 Str6.Str1.v1
  248. in
  249. ()
  250. end
  251. structure Str7 = struct
  252. open Str1.Str1
  253. val v5 = v1
  254. open Str1
  255. val v6 = v1
  256. open Str1
  257. end
  258. fun testStrDeclOpen () =
  259. let
  260. val _ = assertEqualInt 4 Str7.v1
  261. val _ = assertEqualInt 1 (Str7.f1 1)
  262. val _ = assertEqualString "A" (Str7.f1 "A")
  263. val _ = assertEqualInt 1 (Str7.f2 1)
  264. val v1 : Str7.t1 = 1
  265. val _ = assertTrue (Str7.D1 = Str7.D1)
  266. val v2 : Str7.d2 = Str7.D1
  267. val v3 : int Str7.d3 = Str7.D3 1
  268. val _ = assertTrue (Str7.D3 "A" = Str7.D3 "A")
  269. val v4 : Str7.at1 = Str7.v2
  270. val _ = Str7.f3 () handle Str7.Exn1 => ()
  271. | _ => fail "NG"
  272. val _ = assertEqualInt 3 (Str7.opf1 ())
  273. val _ = assertEqualInt 1 (Str7.opf2 ())
  274. val _ = assertEqualInt 4 Str7.Str1.v1
  275. val _ = assertEqualInt 4 Str7.v5
  276. val _ = assertEqualInt 1 Str7.v6
  277. in
  278. ()
  279. end
  280. structure Str8 = struct
  281. val v1 = 1
  282. end
  283. structure Str9 = struct
  284. val v1 = 2
  285. end
  286. structure Str8 = Str9
  287. and Str9 = Str8
  288. fun testStrDeclAnd () =
  289. let
  290. val _ = assertEqualInt 2 Str8.v1
  291. val _ = assertEqualInt 1 Str9.v1
  292. in
  293. ()
  294. end
  295. structure Str10 =
  296. let
  297. structure Str10 = Str1
  298. structure Str1 = struct
  299. val v1 = 10
  300. end
  301. in
  302. struct
  303. val v5 = Str1.v1
  304. open Str10
  305. end
  306. end
  307. fun testStrDeclLet () =
  308. let
  309. val _ = assertEqualInt 1 Str10.v1
  310. val _ = assertEqualInt 1 (Str10.f1 1)
  311. val _ = assertEqualString "A" (Str10.f1 "A")
  312. val _ = assertEqualInt 1 (Str10.f2 1)
  313. val v1 : Str10.t1 = 1
  314. val _ = assertTrue (Str10.D1 = Str10.D1)
  315. val v2 : Str10.d2 = Str10.D1
  316. val v3 : int Str10.d3 = Str10.D3 1
  317. val _ = assertTrue (Str10.D3 "A" = Str10.D3 "A")
  318. val v4 : Str10.at1 = Str10.v2
  319. val _ = Str10.f3 () handle Str10.Exn1 => ()
  320. | _ => fail "NG"
  321. val _ = assertEqualInt 3 (Str10.opf1 ())
  322. val _ = assertEqualInt 1 (Str10.opf2 ())
  323. val _ = assertEqualInt 4 Str10.Str1.v1
  324. val _ = assertEqualInt 10 Str10.v5
  325. in
  326. ()
  327. end
  328. local
  329. structure Str11 = Str1
  330. structure Str1 = struct
  331. val v1 = 10
  332. end
  333. in
  334. structure Str11 = struct
  335. open Str11
  336. end
  337. end
  338. fun testStrDeclLocal () =
  339. let
  340. val _ = assertEqualInt 1 Str11.v1
  341. val _ = assertEqualInt 1 (Str11.f1 1)
  342. val _ = assertEqualString "A" (Str11.f1 "A")
  343. val _ = assertEqualInt 1 (Str11.f2 1)
  344. val v1 : Str11.t1 = 1
  345. val _ = assertTrue (Str11.D1 = Str11.D1)
  346. val v2 : Str11.d2 = Str11.D1
  347. val v3 : int Str11.d3 = Str11.D3 1
  348. val _ = assertTrue (Str11.D3 "A" = Str11.D3 "A")
  349. val v4 : Str11.at1 = Str11.v2
  350. val _ = Str11.f3 () handle Str11.Exn1 => ()
  351. | _ => fail "NG"
  352. val _ = assertEqualInt 3 (Str11.opf1 ())
  353. val _ = assertEqualInt 1 (Str11.opf2 ())
  354. val _ = assertEqualInt 4 Str11.Str1.v1
  355. val _ = assertEqualInt 1 Str1.v1
  356. in
  357. ()
  358. end
  359. val tests = TestList [
  360. Test ("testStrDecl", testStrDecl),
  361. Test ("testStrDeclStrID", testStrDeclLongStrID),
  362. Test ("testStrDeclLongStrID", testStrDeclLongStrID),
  363. Test ("testStrDeclSigTransparent1", testStrDeclSigTransparent1),
  364. Test ("testStrDeclSigTransparent2", testStrDeclSigTransparent2),
  365. Test ("testStrDeclSigOpaque1", testStrDeclSigOpaque1),
  366. Test ("testStrDeclSigOpaque2", testStrDeclSigOpaque2),
  367. Test ("testStrDeclSigOpaque3", testStrDeclSigOpaque3),
  368. Test ("testStrDeclOpen", testStrDeclOpen),
  369. Test ("testStrDeclAnd", testStrDeclAnd),
  370. Test ("testStrDeclLet", testStrDeclLet),
  371. Test ("testStrDeclLocal", testStrDeclLocal)
  372. ]
  373. end