ValDecl.sml 9.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. structure ValDecl =
  2. struct
  3. open SMLUnit.Test SMLUnit.Assert
  4. fun testValDecl () =
  5. let
  6. val v1 = 1
  7. val v2 = "A"
  8. val v3 = fn x => x
  9. val v4 : int = 1
  10. val v5 : string = "A"
  11. val _ = assertEqualInt 1 (v3 1)
  12. val _ = assertEqualString "A" (v3 "A")
  13. in
  14. ()
  15. end
  16. fun testValDeclTuple () =
  17. let
  18. val (v1, v2) = (1, "A")
  19. val (_, _) = (1, "A")
  20. val (v3, v4, v5) = (2, "B", #"a")
  21. val {1 = v6, 2 = v7} = (3, "C")
  22. val {1 = v8, ...} = (4, "D")
  23. val _ = assertEqualInt 1 v1
  24. val _ = assertEqualString "A" v2
  25. val _ = assertEqualInt 2 v3
  26. val _ = assertEqualString "B" v4
  27. val _ = assertEqualChar #"a" v5
  28. val _ = assertEqualInt 3 v6
  29. val _ = assertEqualString "C" v7
  30. val _ = assertEqualInt 4 v8
  31. in
  32. ()
  33. end
  34. fun testValDeclRecord () =
  35. let
  36. val {A = v1, B = v2} = {A = 1, B = "A"}
  37. val {A = _, B = _} = {A = 1, B = "A"}
  38. val {...} = {A = 1, B = "A"}
  39. val _ = {A = 1, B = "A"}
  40. val {A, B} = {A = 2, B = "B"}
  41. val {A = v3, ...} = {A = 3, B = "C"}
  42. val _ = assertEqualInt 1 v1
  43. val _ = assertEqualString "A" v2
  44. val _ = assertEqualInt 3 v3
  45. val _ = assertEqualInt 2 A
  46. val _ = assertEqualString "B" B
  47. val {A, ...} = {A = 4, B = "D"}
  48. val _ = assertEqualInt 4 A
  49. in
  50. ()
  51. end
  52. fun testValDeclTyvar () =
  53. let
  54. exception Exn1
  55. val 'a v1 = fn x => 1
  56. val 'a v2 = fn x : 'a => 1
  57. val 'a v3 = fn x => (raise Exn1) : 'a
  58. val _ = assertEqualInt (v1 "A") 1
  59. val _ = assertEqualInt (v2 "A") 1
  60. val _ = assertTrue (v3 "A" handle Exn1 => true)
  61. val _ = assertTrue ((v3 "A") : bool handle Exn1 => true)
  62. in
  63. ()
  64. end
  65. fun testValDeclTyvarSeq () =
  66. let
  67. val ('a, 'b) v1 = fn x : 'a => fn y : 'b => (x, y)
  68. val v2 : 'a -> 'b -> 'a * 'b = v1
  69. val 'a v3 : 'a -> 'b -> 'a * 'b = v1
  70. val 'a v4 : 'a -> 'a -> 'a * 'a = v1
  71. val ('a, 'b) v5 : 'a -> 'b -> 'a * 'b = v1
  72. val v6 = v1 : 'a -> 'b -> 'a * 'b
  73. val 'a v7 = v1 : 'a -> 'b -> 'a * 'b
  74. val 'a v8 = v1 : 'a -> 'a -> 'a * 'a
  75. val ('a, 'b) v9 = v1 : 'a -> 'b -> 'a * 'b
  76. val _ = assertTrue ((1, "A") = v1 1 "A")
  77. val _ = assertTrue ((1, "A") = v2 1 "A")
  78. val _ = assertTrue ((1, "A") = v3 1 "A")
  79. val _ = assertTrue ((1, 2) = v4 1 2)
  80. val _ = assertTrue ((1, "A") = v5 1 "A")
  81. val _ = assertTrue ((1, "A") = v6 1 "A")
  82. val _ = assertTrue ((1, "A") = v7 1 "A")
  83. val _ = assertTrue ((1, 2) = v8 1 2)
  84. val _ = assertTrue ((1, "A") = v9 1 "A")
  85. in
  86. ()
  87. end
  88. fun testValDeclEqTyvar () =
  89. let
  90. exception Exn1
  91. val ''a v1 = fn x : ''a => x = x
  92. val ''a v2 = fn x : ''a => 1
  93. val ''a v3 = fn x => (raise Exn1) : ''a
  94. val 'a v4 = fn x : 'a => x
  95. val ''a v5 = v4 : (''a -> ''a)
  96. val v6 = v4 : (''a -> ''a)
  97. val ''a v7 : ''a -> ''a = v4
  98. val v8 : ''a -> ''a = v4
  99. val v9 = fn x => (v5 x = v6 x)
  100. val _ = assertTrue (v1 1)
  101. val _ = assertTrue (v1 "A")
  102. val _ = assertEqualInt (v2 "A") 1
  103. val _ = assertTrue (v3 "A" handle Exn1 => true)
  104. val _ = assertTrue ((v3 "A") : bool handle Exn1 => true)
  105. val _ = assertTrue ("A" = (v5 "A"))
  106. val _ = assertTrue ("A" = (v6 "A"))
  107. val _ = assertTrue ("A" = (v7 "A"))
  108. val _ = assertTrue ("A" = (v8 "A"))
  109. val _ = assertTrue (v9 "A")
  110. in
  111. ()
  112. end
  113. fun testValDeclEqTyvarSeq1 () =
  114. let
  115. val ('a, 'b) v1 = fn x : 'a => fn y : 'b => (x, y)
  116. val v2 : ''a -> ''b -> ''a * ''b = v1
  117. val ''a v3 : ''a -> ''b -> ''a * ''b = v1
  118. val ''a v4 : ''a -> ''a -> ''a * ''a = v1
  119. val (''a, ''b) v5 : ''a -> ''b -> ''a * ''b = v1
  120. val _ = assertTrue ((1, "A") = v1 1 "A")
  121. val _ = assertTrue ((1, "A") = v2 1 "A")
  122. val _ = assertTrue ((1, "A") = v3 1 "A")
  123. val _ = assertTrue ((1, 2) = v4 1 2)
  124. val _ = assertTrue ((1, "A") = v5 1 "A")
  125. in
  126. ()
  127. end
  128. fun testValDeclEqTyvarSeq2 () =
  129. let
  130. val ('a, 'b) v1 = fn x : 'a => fn y : 'b => (x, y)
  131. val v2 = v1 : ''a -> ''b -> ''a * ''b
  132. val ''a v3 = v1 : ''a -> ''b -> ''a * ''b
  133. val ''a v4 = v1 : ''a -> ''a -> ''a * ''a
  134. val (''a, ''b) v5 = v1 : ''a -> ''b -> ''a * ''b
  135. val _ = assertTrue ((1, "A") = v1 1 "A")
  136. val _ = assertTrue ((1, "A") = v2 1 "A")
  137. val _ = assertTrue ((1, "A") = v3 1 "A")
  138. val _ = assertTrue ((1, 2) = v4 1 2)
  139. val _ = assertTrue ((1, "A") = v5 1 "A")
  140. in
  141. ()
  142. end
  143. fun testValDeclEqTyvarSeq3 () =
  144. let
  145. val (''a, ''b) v1 = fn x : ''a => fn y : ''b => (x, y) = (x, y)
  146. val ''a v2 = v1 : ''a -> ''a -> bool
  147. val v3 = v1 : ''a -> ''a -> bool
  148. val ''a v4 : ''a -> ''a -> bool = v1
  149. val v5 : ''a -> ''a -> bool = v1
  150. val _ = assertTrue (v1 1 "A")
  151. val _ = assertTrue (v2 1 2)
  152. val _ = assertTrue (v3 1 2)
  153. val _ = assertTrue (v4 1 2)
  154. val _ = assertTrue (v5 1 2)
  155. in
  156. ()
  157. end
  158. fun testValDeclPatternDatatype1 () =
  159. let
  160. datatype d1 = A1
  161. val A1 = A1
  162. val v1 : d1 = A1
  163. val v2 as A1 = A1
  164. val v3 as A1 : d1 = A1
  165. val _ = assertTrue (A1 = v1)
  166. val _ = assertTrue (A1 = v2)
  167. val _ = assertTrue (A1 = v3)
  168. in
  169. ()
  170. end
  171. fun testValDeclPatternDatatype2 () =
  172. let
  173. datatype d1 = A1 of int
  174. val v1 as A1 v2 = A1 1
  175. val v3 : d1 as A1 v4 = A1 1
  176. val A1 v5 = A1 1
  177. val A1 (v6 : int) = A1 1
  178. val A1 v7 : d1 = A1 1
  179. val A1 _ = A1 1
  180. val _ = assertTrue (A1 1 = v1)
  181. val _ = assertEqualInt 1 v2
  182. val _ = assertTrue (A1 1 = v3)
  183. val _ = assertEqualInt 1 v4
  184. val _ = assertEqualInt 1 v5
  185. val _ = assertEqualInt 1 v6
  186. val _ = assertEqualInt 1 v7
  187. in
  188. ()
  189. end
  190. fun testValDeclPatternDatatype3 () =
  191. let
  192. datatype d1 = A1 of int * string
  193. val A1 (v1, v2) = A1 (1, "A")
  194. val A1 (_, _) = A1 (1, "A")
  195. val A1 _ = A1 (1, "A")
  196. val A1 {...} = A1 (1, "A")
  197. val _ = assertEqualInt 1 v1
  198. val _ = assertEqualString "A" v2
  199. in
  200. ()
  201. end
  202. fun testValDeclPatternDatatype4 () =
  203. let
  204. datatype d4 = A1 of {A:int, B:string}
  205. val A1 {A = v1, B = v2} = A1 {B = "A", A = 4}
  206. val A1 {A, B} = A1 {B = "A", A = 4}
  207. val A1 {...} = A1 {B = "A", A = 4}
  208. val A1 _ = A1 {B = "A", A = 4}
  209. val _ = assertEqualInt 4 v1
  210. val _ = assertEqualString "A" v2
  211. val _ = assertEqualInt 4 A
  212. val _ = assertEqualString "A" B
  213. in
  214. ()
  215. end
  216. fun testValDeclPatternDatatype5 () =
  217. let
  218. datatype ('a, 'b) d1 = A1 of 'a * 'b
  219. val ('a, 'b) v1 = fn x : 'a => fn y : 'b => A1 (x, y)
  220. val ('a, 'b) v2 = fn x => fn y => A1 (x, y) : ('a, 'b) d1
  221. val 'a v3 = fn x => fn y => A1 (x, y) : ('a, 'b) d1
  222. val 'a v4 = fn x => fn y => A1 (x, y) : ('a, 'a) d1
  223. val v5 = fn x => fn y => A1 (x, y) : ('a, 'b) d1
  224. val ('a, 'b) v6 : 'a -> 'b -> ('a, 'b) d1 = fn x => fn y => A1 (x, y)
  225. val _ = assertTrue (A1 (1, "A") = v1 1 "A")
  226. val _ = assertTrue (A1 (1, "A") = v2 1 "A")
  227. val _ = assertTrue (A1 (1, "A") = v3 1 "A")
  228. val _ = assertTrue (A1 (1, 2) = v4 1 2)
  229. val _ = assertTrue (A1 (1, "A") = v5 1 "A")
  230. val _ = assertTrue (A1 (1, "A") = v6 1 "A")
  231. in
  232. ()
  233. end
  234. fun testValDeclPatternTuple () =
  235. let
  236. val (v1, v2) = (1, 2)
  237. val (v3, v4) = {2 = 3, 1 = 4}
  238. val 'a (v5, v6) = (fn x : 'a => x, 6)
  239. val ('a, 'b) (v7, v8) = (fn x : 'a => x, fn x : 'b => x)
  240. val _ = assertEqualInt 1 v1
  241. val _ = assertEqualInt 2 v2
  242. val _ = assertEqualInt 4 v3
  243. val _ = assertEqualInt 3 v4
  244. val _ = assertEqualInt 5 (v5 5)
  245. val _ = assertEqualInt 6 v6
  246. val _ = assertEqualInt 7 (v7 7)
  247. val _ = assertEqualInt 8 (v8 8)
  248. in
  249. ()
  250. end
  251. fun testValDeclRank1Ref () =
  252. let
  253. val v1 = fn x => fn y => (ref x, ref y)
  254. val v2 = v1 1
  255. val v3 = v2 2
  256. val v4 = v2 "A"
  257. val _ = assertTrue (ref 1 <> #1 v3)
  258. val _ = assertTrue (ref 2 <> #2 v3)
  259. val _ = assertTrue (ref 1 <> #1 v4)
  260. val _ = assertTrue (ref "A" <> #2 v4)
  261. val _ = assertTrue (#1 v3 <> #1 v4)
  262. in
  263. ()
  264. end
  265. val tests = TestList [
  266. Test ("testValDecl", testValDecl),
  267. Test ("testValDeclTuple", testValDeclTuple),
  268. Test ("testValDeclRecord", testValDeclRecord),
  269. Test ("testValDeclTyvar", testValDeclTyvar),
  270. Test ("testValDeclTyvarSeq", testValDeclTyvarSeq),
  271. Test ("testValDeclEqTyvar", testValDeclEqTyvar),
  272. Test ("testValDeclEqTyvarSeq1", testValDeclEqTyvarSeq1),
  273. Test ("testValDeclEqTyvarSeq2", testValDeclEqTyvarSeq2),
  274. Test ("testValDeclEqTyvarSeq3", testValDeclEqTyvarSeq3),
  275. Test ("testValDeclPatternDatatype1", testValDeclPatternDatatype1),
  276. Test ("testValDeclPatternDatatype2", testValDeclPatternDatatype2),
  277. Test ("testValDeclPatternDatatype3", testValDeclPatternDatatype3),
  278. Test ("testValDeclPatternDatatype4", testValDeclPatternDatatype4),
  279. Test ("testValDeclPatternDatatype5", testValDeclPatternDatatype5),
  280. Test ("testValDeclPatternTuple", testValDeclPatternTuple),
  281. Test ("testValDeclRank1Ref", testValDeclRank1Ref)
  282. ]
  283. end