reset a3, kut Charlie ;)
[tt2015.git] / a3 / code / Gast / genLibTest.icl
diff --git a/a3/code/Gast/genLibTest.icl b/a3/code/Gast/genLibTest.icl
new file mode 100644 (file)
index 0000000..8241184
--- /dev/null
@@ -0,0 +1,141 @@
+implementation module genLibTest\r
+\r
+/*\r
+       GAST: A Generic Automatic Software Test-system\r
+       \r
+       genLibtest: library for generic testing: showing and comparing values\r
+\r
+       Pieter Koopman, 2004\r
+       Radboud Universty, Nijmegen\r
+       The Netherlands\r
+       pieter@cs.ru.nl\r
+*/\r
+\r
+import StdEnv, StdGeneric, GenEq\r
+\r
+instance + String where (+) s t = s +++ t\r
+\r
+(@)infixl 2 :: (a->b) a -> b\r
+(@) f x = f x\r
+\r
+(@!)infixl 2 :: (a->b) !a -> b\r
+(@!) f x = f x\r
+\r
+//--- show ---//\r
+generic genShow a :: String Bool a [String] -> [String]\r
+\r
+genShow{|Int|}                         sep p x                         rest = [toString x: rest]\r
+genShow{|Char|}                        sep p x                         rest = ["'",showChar x,"'": rest]\r
+genShow{|Bool|}                        sep p x                         rest = [toString x: rest]\r
+genShow{|Real|}                        sep p x                         rest = [toString x: rest]\r
+genShow{|String|}                      sep p s                         rest = ["\"",s,"\"":rest] \r
+genShow{|UNIT|}                        sep p _                         rest = rest\r
+genShow{|PAIR|}        fx fy   sep p (PAIR x y)        rest\r
+//     | p\r
+//             = ["(":fx sep p x [sep: fy sep p y [")":rest]]]\r
+               = fx sep p x [sep: fy sep p y rest]\r
+//genShow{|PAIR|}      fx fy   sep p (PAIR x y)        rest = fx sep True x [sep: fy sep True y rest]\r
+genShow{|EITHER|}      fl fr   sep p (LEFT x)          rest = fl sep p x rest\r
+genShow{|EITHER|}      fl fr   sep p (RIGHT x)         rest = fr sep p x rest\r
+genShow{|OBJECT|}      f       sep p (OBJECT x)        rest = f sep p x rest\r
+genShow{|(->)|}        fa fr   sep p f                         rest = ["<function>": rest]\r
+genShow{|{}|}          fx              sep p xs                        rest = ["{" :showList fx [x\\x<-:xs] ["}":rest]]\r
+genShow{|{!}|}         fx              sep p xs                        rest = ["{!":showList fx [x\\x<-:xs] ["}":rest]]\r
+//genShow{|{#}|}               fx              sep p xs                        rest = ["{#":showList fx [x\\x<-:xs] ["}":rest]]\r
+genShow{|[]|}          f               sep p xs                        rest = ["[" :showList f xs ["]":rest]]\r
+genShow{|(,)|}         f1 f2   sep p (x1,x2)           rest = ["(":f1 sep False x1 [",":f2 sep False x2 [")":rest]]]\r
+genShow{|(,,)|}                f1 f2 f3 sep p (x1,x2,x3)       rest = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [")":rest]]]]\r
+genShow{|(,,,)|}       f1 f2 f3 f4 sep p (x1,x2,x3,x4) rest\r
+ = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [",":f4 sep False x4 [")":rest]]]]]\r
+genShow{|(,,,,)|}      f1 f2 f3 f4 f5 sep p (x1,x2,x3,x4,x5) rest\r
+ = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [",":f4 sep False x4 [",":f5 sep False x5 [")":rest]]]]]]\r
+genShow{|(,,,,,)|}     f1 f2 f3 f4 f5 f6 sep p (x1,x2,x3,x4,x5, x6) rest = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [",":f4 sep False x4 [",":f5 sep False x5 [",":f6 sep False x6 [")":rest]]]]]]]\r
+genShow{|(,,,,,,)|}f1 f2 f3 f4 f5 f6 f7 sep p (x1,x2,x3,x4,x5,x6,x7) rest\r
+ = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [",":f4 sep False x4 [",":f5 sep False x5 [",":f6 sep False x6 [",":f7 sep False x7 [")":rest]]]]]]]]\r
+genShow{|(,,,,,,,)|}f1 f2 f3 f4 f5 f6 f7 f8 sep p (x1,x2,x3,x4,x5,x6,x7,x8) rest\r
+ = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [",":f4 sep False x4 [",":f5 sep False x5 [",":f6 sep False x6 [",":f7 sep False x7 [",":f8 sep False x8 [")":rest]]]]]]]]]\r
+genShow{|(,,,,,,,,)|}f1 f2 f3 f4 f5 f6 f7 f8 f9 sep p (x1,x2,x3,x4,x5,x6,x7,x8,x9) rest\r
+ = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [",":f4 sep False x4 [",":f5 sep False x5 [",":f6 sep False x6 [",":f7 sep False x7 [",":f8 sep False x8 [",":f9 sep False x9 [")":rest]]]]]]]]]]\r
+genShow{|(,,,,,,,,,)|}f1 f2 f3 f4 f5 f6 f7 f8 f9 f0 sep p (x1,x2,x3,x4,x5,x6,x7,x8,x9,x0) rest\r
+ = ["(":f1 sep False x1 [",":f2 sep False x2 [",":f3 sep False x3 [",":f4 sep False x4 [",":f5 sep False x5 [",":f6 sep False x6 [",":f7 sep False x7 [",":f8 sep False x8 [",":f9 sep False x9 [",":f0 sep False x0 [")":rest]]]]]]]]]]]\r
+genShow{|CONS of {gcd_name, gcd_arity, gcd_fields}|} fx sep p (CONS x) rest\r
+       | gcd_arity == 0\r
+               = [gcd_name: rest]\r
+       | isEmpty gcd_fields // ordinary constructor\r
+               | p // parentheses needed\r
+//                     = ["(",gcd_name," ":fx " " False x [")":rest]]\r
+//                     = [gcd_name," ":fx " " False x rest]\r
+                       = ["(",gcd_name," ":fx " " True x [")":rest]]\r
+                       = [gcd_name," ":fx " " True x rest]\r
+       | otherwise // record\r
+               = ["{",{gcd_name.[i]\\i<-[1..size gcd_name-1]},"|":fx "," False x ["}":rest]]\r
+genShow{|FIELD of {gfd_name}|} fx sep p (FIELD x) rest\r
+       = [gfd_name,"=":fx sep False x rest]\r
+\r
+showChar :: Char -> String\r
+showChar c\r
+ = case c of\r
+       '\n' = "\\n"\r
+       '\t' = "\\t"\r
+       '\r' = "\\r"\r
+       '\b' = "\\b"\r
+       '\'' = "\\'"\r
+       c = toString c\r
+\r
+showList :: (.String -> .(.Bool -> .(.a -> .(u:[v:String] -> w:[x:String])))) ![.a] z:[u0:String] -> w0:[x0:String], [w0 <= u,x0 <= v,z w <= w0,u0 x <= x0]\r
+showList f []          rest = rest\r
+showList f [x]         rest = f "" False x rest\r
+showList f [x:xs]      rest = f "" False x [",":showList f xs rest]\r
+\r
+show :: !a -> [String] | genShow{|*|} a\r
+show x = genShow{|*|} "" False x []\r
+\r
+show1 :: !a -> String | genShow{|*|} a\r
+show1 x = glue (genShow{|*|} "" True x [])\r
+where\r
+       glue :: [String] -> String\r
+       glue [] = ""\r
+       glue [x:xs]\r
+               = case xs of\r
+                       [] = x\r
+                          = x+glue xs\r
+\r
+//--- comparision ---//\r
+/*\r
+instance < Bool\r
+where\r
+       (<) True  b = not b\r
+       (<) False _ = False\r
+*/\r
+generic gLess a  :: a a -> Bool\r
+\r
+gLess{|UNIT|} _ _                                                              = False\r
+gLess{|PAIR|} fx fy (PAIR x1 y1) (PAIR x2 y2)  = fx x1 x2 || (not (fx x2 x1) && fy y1 y2) // x1<x2 || (x1==x2) && y1<y2\r
+gLess{|EITHER|} fl fr (LEFT x)   (LEFT y)              = fl x y\r
+gLess{|EITHER|} fl fr (RIGHT x)  (RIGHT y)             = fr x y\r
+gLess{|EITHER|} fl fr (LEFT x)   (RIGHT y)             = True\r
+gLess{|EITHER|} fl fr (RIGHT x)  (LEFT y)              = False\r
+gLess{|CONS|}   f     (CONS x)   (CONS y)              = f x y\r
+gLess{|OBJECT|} f     (OBJECT x) (OBJECT y)    = f x y\r
+gLess{|FIELD|}  f     (FIELD x)  (FIELD y)             = f x y\r
+gLess{|Int|}   x y                                                     = x < y\r
+gLess{|Char|} x y                                                              = x < y\r
+gLess{|Bool|} False y                                                  = y\r
+gLess{|Bool|} x y                                                              = False\r
+gLess{|Real|} x y                                                              = x < y\r
+gLess{|String|} x y                                                    = x < y\r
+\r
+derive gLess [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,), (,,,,,,,,), (,,,,,,,,,)\r
+\r
+(-<-) infix 4 :: !a !a -> Bool | gLess{|*|} a\r
+(-<-) x y = gLess{|*|} x y\r
+\r
+(->-) infix 4 :: !a !a -> Bool | gLess{|*|} a\r
+(->-) x y = gLess{|*|} y x\r
+\r
+(-<=) infix 4 :: !a !a -> Bool | gLess{|*|} a\r
+(-<=) x y = not (gLess{|*|} y x)\r
+\r
+(=>-) infix 4 :: !a !a -> Bool | gLess{|*|} a\r
+(=>-) x y = not (gLess{|*|} x y)\r
+\r