+++ /dev/null
-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