never executed always true always false
    1 {-# LANGUAGE FlexibleInstances #-}
    2 {-# LANGUAGE RankNTypes #-}
    3 
    4 module Conjure.RepresentationsTest ( tests ) where
    5 
    6 -- conjure
    7 import Conjure.Prelude
    8 import Conjure.Language.Definition
    9 import Conjure.Language.Type
   10 import Conjure.Language.Domain
   11 import Conjure.Language.Pretty
   12 import Conjure.Process.Enumerate ( EnumerateDomainNoIO(..) )
   13 import Conjure.Representations ( downC, up, downC1, up1 )
   14 
   15 -- tasty
   16 import Test.Tasty
   17 import Test.Tasty.HUnit ( Assertion, testCase, assertFailure, (@?=) )
   18 -- import Test.Tasty.QuickCheck as QC
   19 -- import Test.Tasty.SmallCheck as SC
   20 
   21 
   22 tests ::
   23     (?typeCheckerMode :: TypeCheckerMode) =>
   24     TestTree
   25 tests = testGroup "representations"
   26 
   27     [ testCase "bool #1" $
   28         let
   29             highDomain = DomainBool
   30             highConstant = ConstantBool False
   31             low = [("x", highDomain, highConstant)]
   32         in  testCases "x" highDomain highConstant (const Nothing) low low
   33 
   34     , testCase "bool #2" $
   35         let
   36             highDomain = DomainBool
   37             highConstant = ConstantBool True
   38             low = [("x", highDomain, highConstant)]
   39         in  testCases "x" highDomain highConstant (const Nothing) low low
   40 
   41     , testCase "int #1" $
   42         let
   43             highDomain = intDomain 1 4
   44             highConstant = (ConstantInt TagInt) 3
   45             low = [("x", highDomain, highConstant)]
   46         in  testCases "x" highDomain highConstant (const Nothing) low low
   47 
   48     , testCase "matrix of bool" $
   49         let
   50             highDomain = DomainMatrix (intDomain 1 3) DomainBool
   51             highConstant = ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True]
   52             low = [("x", highDomain, highConstant)]
   53         in  testCases "x" highDomain highConstant (const Nothing) low low
   54 
   55     , testCase "matrix of int" $
   56         let
   57             highDomain = DomainMatrix (intDomain 1 3) (intDomain 1 5)
   58             highConstant = ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2, (ConstantInt TagInt) 3, (ConstantInt TagInt) 5]
   59             low = [("x", highDomain, highConstant)]
   60         in  testCases "x" highDomain highConstant (const Nothing) low low
   61 
   62     , testCase "matrix 2d of bool" $
   63         let
   64             highDomain =
   65                 DomainMatrix (intDomain 1 3) (DomainMatrix (intDomain 1 2) DomainBool)
   66             highConstant =
   67                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
   68                     [ ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [ConstantBool False, ConstantBool True ]
   69                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [ConstantBool True , ConstantBool False]
   70                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [ConstantBool True , ConstantBool True ]
   71                     ]
   72             low = [("x", highDomain, highConstant)]
   73         in  testCases "x" highDomain highConstant (const Nothing) low low
   74 
   75     , testCase "matrix 2d of int" $
   76         let
   77             highDomain =
   78                 DomainMatrix (intDomain 1 3) (DomainMatrix (intDomain 1 2) (intDomain 0 9))
   79             highConstant =
   80                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
   81                     [ ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 3, (ConstantInt TagInt) 7]
   82                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 2, (ConstantInt TagInt) 8]
   83                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 0, (ConstantInt TagInt) 1]
   84                     ]
   85             low = [("x", highDomain, highConstant)]
   86         in  testCases "x" highDomain highConstant (const Nothing) low low
   87 
   88     , testCase "(bool, int)" $
   89         let
   90             highDomain = DomainTuple [DomainBool, intDomain 1 3]
   91             highConstant = ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2]
   92             low = [ ( "x_1", DomainBool   , ConstantBool False )
   93                   , ( "x_2", intDomain 1 3, (ConstantInt TagInt) 2      )
   94                   ]
   95         in  testCases "x" highDomain highConstant Just low low
   96 
   97     , testCase "(bool, int, bool)" $
   98         let
   99             highDomain = DomainTuple [DomainBool, intDomain 1 3, DomainBool]
  100             highConstant = ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2, ConstantBool True]
  101             low = [ ( "x_1", DomainBool   , ConstantBool False )
  102                   , ( "x_2", intDomain 1 3, (ConstantInt TagInt) 2      )
  103                   , ( "x_3", DomainBool   , ConstantBool True  )
  104                   ]
  105         in  testCases "x" highDomain highConstant Just low low
  106 
  107     , testCase "((bool, int), bool)" $
  108         let
  109             highDomain = DomainTuple [DomainTuple [DomainBool, intDomain 1 3], DomainBool]
  110             highConstant = ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantBool True]
  111             mid = [ ( "x_1", DomainTuple [DomainBool, intDomain 1 3], ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2] )
  112                   , ( "x_2", DomainBool, ConstantBool True )
  113                   ]
  114             low = [ ( "x_1_1", DomainBool   , ConstantBool False )
  115                   , ( "x_1_2", intDomain 1 3, (ConstantInt TagInt) 2      )
  116                   , ( "x_2"  , DomainBool   , ConstantBool True  )
  117                   ]
  118         in  testCases "x" highDomain highConstant Just mid low
  119 
  120     , testCase "(bool, (int, bool))" $
  121         let
  122             highDomain = DomainTuple [DomainBool, DomainTuple [intDomain 1 3, DomainBool]]
  123             highConstant = ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool True]]
  124             mid = [ ( "x_1", DomainBool, ConstantBool False )
  125                   , ( "x_2", DomainTuple [intDomain 1 3, DomainBool], ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool True] )
  126                   ]
  127             low = [ ( "x_1"  , DomainBool   , ConstantBool False )
  128                   , ( "x_2_1", intDomain 1 3, (ConstantInt TagInt) 2      )
  129                   , ( "x_2_2", DomainBool   , ConstantBool True  )
  130                   ]
  131         in  testCases "x" highDomain highConstant Just mid low
  132 
  133     , testCase "(bool, int, bool, int)" $
  134         let
  135             highDomain = DomainTuple [DomainBool, intDomain 1 3, DomainBool, intDomain 2 5]
  136             highConstant = ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2, ConstantBool True, (ConstantInt TagInt) 4]
  137             low = [ ( "x_1", DomainBool   , ConstantBool False )
  138                   , ( "x_2", intDomain 1 3, (ConstantInt TagInt) 2      )
  139                   , ( "x_3", DomainBool   , ConstantBool True  )
  140                   , ( "x_4", intDomain 2 5, (ConstantInt TagInt) 4      )
  141                   ]
  142         in  testCases "x" highDomain highConstant Just low low
  143 
  144     , testCase "((bool, int), (bool, int))" $
  145         let
  146             highDomain = DomainTuple [DomainTuple [DomainBool, intDomain 1 3], DomainTuple [DomainBool, intDomain 2 5]]
  147             highConstant = ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantAbstract $ AbsLitTuple [ConstantBool True, (ConstantInt TagInt) 4]]
  148             mid = [ ( "x_1", DomainTuple [DomainBool, intDomain 1 3], ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2] )
  149                   , ( "x_2", DomainTuple [DomainBool, intDomain 2 5], ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4] )
  150                   ]
  151             low = [ ( "x_1_1", DomainBool   , ConstantBool False )
  152                   , ( "x_1_2", intDomain 1 3, (ConstantInt TagInt) 2      )
  153                   , ( "x_2_1", DomainBool   , ConstantBool True  )
  154                   , ( "x_2_2", intDomain 2 5, (ConstantInt TagInt) 4      )
  155                   ]
  156         in  testCases "x" highDomain highConstant Just mid low
  157 
  158     , testCase "(bool, (int, (bool, int)))" $
  159         let
  160             highDomain = DomainTuple [DomainBool, DomainTuple [intDomain 1 3, DomainTuple [DomainBool, intDomain 2 5]]]
  161             highConstant = ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantAbstract $ AbsLitTuple [ConstantBool True, (ConstantInt TagInt) 4]]]
  162             mid = [ ( "x_1", DomainBool   , ConstantBool False )
  163                   , ( "x_2", DomainTuple [intDomain 1 3, DomainTuple [DomainBool, intDomain 2 5]]
  164                            , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantAbstract $ AbsLitTuple [ConstantBool True, (ConstantInt TagInt) 4]] )
  165                   ]
  166             low = [ ( "x_1"    , DomainBool   , ConstantBool False )
  167                   , ( "x_2_1"  , intDomain 1 3, (ConstantInt TagInt) 2      )
  168                   , ( "x_2_2_1", DomainBool   , ConstantBool True  )
  169                   , ( "x_2_2_2", intDomain 2 5, (ConstantInt TagInt) 4      )
  170                   ]
  171         in  testCases "x" highDomain highConstant Just mid low
  172 
  173     , testCase "(bool, (int, bool), int)" $
  174         let
  175             highDomain = DomainTuple [DomainBool, DomainTuple [intDomain 1 3, DomainBool], intDomain 2 5]
  176             highConstant = ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool True], (ConstantInt TagInt) 4]
  177             mid = [ ( "x_1", DomainBool   , ConstantBool False )
  178                   , ( "x_2", DomainTuple [intDomain 1 3, DomainBool], ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool True] )
  179                   , ( "x_3", intDomain 2 5, (ConstantInt TagInt) 4 )
  180                   ]
  181             low = [ ( "x_1"  , DomainBool   , ConstantBool False )
  182                   , ( "x_2_1", intDomain 1 3, (ConstantInt TagInt) 2      )
  183                   , ( "x_2_2", DomainBool   , ConstantBool True  )
  184                   , ( "x_3"  , intDomain 2 5, (ConstantInt TagInt) 4      )
  185                   ]
  186         in  testCases "x" highDomain highConstant Just mid low
  187 
  188     , testCase "(((bool, int), bool), int)" $
  189         let
  190             highDomain = DomainTuple [DomainTuple [ DomainTuple [DomainBool, intDomain 1 3], DomainBool], intDomain 2 5]
  191             highConstant = ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantBool True], (ConstantInt TagInt) 4]
  192             mid = [ ( "x_1", DomainTuple [ DomainTuple [DomainBool, intDomain 1 3], DomainBool]
  193                            , ConstantAbstract $ AbsLitTuple [ ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantBool True] )
  194                   , ( "x_2", intDomain 2 5, (ConstantInt TagInt) 4 )
  195                   ]
  196             low = [ ( "x_1_1_1", DomainBool   , ConstantBool False )
  197                   , ( "x_1_1_2", intDomain 1 3, (ConstantInt TagInt) 2      )
  198                   , ( "x_1_2"  , DomainBool   , ConstantBool True  )
  199                   , ( "x_2"    , intDomain 2 5, (ConstantInt TagInt) 4      )
  200                   ]
  201         in  testCases "x" highDomain highConstant Just mid low
  202 
  203     , testCase "matrix of (bool, int)" $
  204         let
  205             highDomain =
  206                 DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, intDomain 0 9])
  207             highConstant =
  208                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  209                     [ ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 0]
  210                     , ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 3]
  211                     , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 4]
  212                     ]
  213             low = [ ( "x_1", DomainMatrix (intDomain 1 3) DomainBool
  214                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool True, ConstantBool False] )
  215                   , ( "x_2", DomainMatrix (intDomain 1 3) (intDomain 0 9)
  216                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 0, (ConstantInt TagInt) 3, (ConstantInt TagInt) 4] )
  217                   ]
  218         in  testCases "x" highDomain highConstant Just low low
  219 
  220     , testCase "matrix of (bool, int, bool)" $
  221         let
  222             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, intDomain 1 3, DomainBool])
  223             highConstant =
  224                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  225                     [ ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2, ConstantBool True]
  226                     , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3, ConstantBool False]
  227                     , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 4, ConstantBool False]
  228                     ]
  229             low = [ ( "x_1", DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool False] )
  230                   , ( "x_2", DomainMatrix (intDomain 1 3) (intDomain 1 3), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2     , (ConstantInt TagInt) 3     , (ConstantInt TagInt) 4     ] )
  231                   , ( "x_3", DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False] )
  232                   ]
  233         in  testCases "x" highDomain highConstant Just low low
  234 
  235     , testCase "matrix of ((bool, int), bool)" $
  236         let
  237             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainTuple [DomainBool, intDomain 1 3], DomainBool])
  238             highConstant =
  239                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  240                     [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantBool True]
  241                     , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3], ConstantBool False]
  242                     , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4], ConstantBool False]
  243                     ]
  244             mid = [ ( "x_1", DomainMatrix   (intDomain 1 3) (DomainTuple [DomainBool, intDomain 1 3])
  245                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  246                                 [ ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2]
  247                                 , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3]
  248                                 , ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4]
  249                                 ] )
  250                   , ( "x_2", DomainMatrix   (intDomain 1 3) DomainBool
  251                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False] )
  252                   ]
  253             low = [ ( "x_1_1", DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True ] )
  254                   , ( "x_1_2", DomainMatrix (intDomain 1 3) (intDomain 1 3), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2     , (ConstantInt TagInt) 3     , (ConstantInt TagInt) 4     ] )
  255                   , ( "x_2"  , DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False] )
  256                   ]
  257         in  testCases "x" highDomain highConstant Just mid low
  258 
  259     , testCase "matrix of (bool, (int, bool))" $
  260         let
  261             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, DomainTuple [intDomain 0 9, DomainBool]])
  262             highConstant =
  263                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  264                     [ ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 0, ConstantBool True]]
  265                     , ConstantAbstract $ AbsLitTuple [ConstantBool True , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantBool False]]
  266                     , ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantBool True]]
  267                     ]
  268             mid = [ ( "x_1", DomainMatrix (intDomain 1 3) DomainBool
  269                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool True, ConstantBool False] )
  270                   , ( "x_2", DomainMatrix (intDomain 1 3) (DomainTuple [intDomain 0 9, DomainBool])
  271                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  272                                [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 0, ConstantBool True]
  273                                , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantBool False]
  274                                , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantBool True]
  275                                ] )
  276                   ]
  277             low = [ ( "x_1"  , DomainMatrix (intDomain 1 3) DomainBool
  278                              , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool True, ConstantBool False] )
  279                   , ( "x_2_1", DomainMatrix (intDomain 1 3) (intDomain 0 9)
  280                              , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 0, (ConstantInt TagInt) 3, (ConstantInt TagInt) 4] )
  281                   , ( "x_2_2", DomainMatrix (intDomain 1 3) DomainBool
  282                              , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True, ConstantBool False, ConstantBool True] )
  283                   ]
  284         in  testCases "x" highDomain highConstant Just mid low
  285 
  286     , testCase "matrix of (bool, int, bool, int)" $
  287         let
  288             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, intDomain 1 3, DomainBool, intDomain 2 5])
  289             highConstant =
  290                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  291                     [ ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2, ConstantBool True , (ConstantInt TagInt) 4]
  292                     , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3, ConstantBool False, (ConstantInt TagInt) 6]
  293                     , ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4, ConstantBool False, (ConstantInt TagInt) 8]
  294                     ]
  295             low = [ ( "x_1", DomainMatrix (intDomain 1 3) DomainBool , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True ] )
  296                   , ( "x_2", DomainMatrix (intDomain 1 3) (intDomain 1 3), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2     , (ConstantInt TagInt) 3     , (ConstantInt TagInt) 4     ] )
  297                   , ( "x_3", DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False] )
  298                   , ( "x_4", DomainMatrix (intDomain 1 3) (intDomain 2 5), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4     , (ConstantInt TagInt) 6     , (ConstantInt TagInt) 8     ] )
  299                   ]
  300         in  testCases "x" highDomain highConstant Just low low
  301 
  302     , testCase "matrix of ((bool, int), (bool, int))" $
  303         let
  304             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainTuple [DomainBool, intDomain 1 3], DomainTuple [DomainBool, intDomain 2 5]])
  305             highConstant =
  306                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  307                     [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4]]
  308                     , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3], ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 6]]
  309                     , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4], ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 8]]
  310                     ]
  311             mid = [ ( "x_1"
  312                     , DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, intDomain 1 3])
  313                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  314                         [ ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2]
  315                         , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3]
  316                         , ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4]
  317                         ] )
  318                   , ( "x_2"
  319                     , DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, intDomain 2 5])
  320                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  321                         [ ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4]
  322                         , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 6]
  323                         , ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 8]
  324                         ] )
  325                   ]
  326             low = [ ( "x_1_1", DomainMatrix   (intDomain 1 3) DomainBool
  327                              , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True ] )
  328                   , ( "x_1_2", DomainMatrix   (intDomain 1 3) (intDomain 1 3)
  329                              , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2     , (ConstantInt TagInt) 3     , (ConstantInt TagInt) 4     ] )
  330                   , ( "x_2_1", DomainMatrix   (intDomain 1 3) DomainBool
  331                              , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False] )
  332                   , ( "x_2_2", DomainMatrix   (intDomain 1 3) (intDomain 2 5)
  333                              , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4     , (ConstantInt TagInt) 6     , (ConstantInt TagInt) 8     ] )
  334                   ]
  335         in  testCases "x" highDomain highConstant Just mid low
  336 
  337     , testCase "matrix of (bool, (int, (bool, int)))" $
  338         let
  339             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, DomainTuple [intDomain 1 3, DomainTuple [DomainBool, intDomain 2 5]]])
  340             highConstant =
  341                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  342                     [ ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4]]]
  343                     , ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 6]]]
  344                     , ConstantAbstract $ AbsLitTuple [ConstantBool True , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 8]]]
  345                     ]
  346             mid = [ ( "x_1", DomainMatrix   (intDomain 1 3) DomainBool
  347                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True] )
  348                   , ( "x_2", DomainMatrix   (intDomain 1 3) (DomainTuple [intDomain 1 3, DomainTuple [DomainBool, intDomain 2 5]])
  349                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  350                                [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4]]
  351                                , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 6]]
  352                                , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 8]]
  353                                ] )
  354                   ]
  355             low = [ ( "x_1"    , DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True ])
  356                   , ( "x_2_1"  , DomainMatrix (intDomain 1 3) (intDomain 1 3), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2     , (ConstantInt TagInt) 3     , (ConstantInt TagInt) 4     ])
  357                   , ( "x_2_2_1", DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False])
  358                   , ( "x_2_2_2", DomainMatrix (intDomain 1 3) (intDomain 2 5), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4     , (ConstantInt TagInt) 6     , (ConstantInt TagInt) 8     ])
  359                   ]
  360         in  testCases "x" highDomain highConstant Just mid low
  361 
  362     , testCase "matrix of (bool, (int, bool), int)" $
  363         let
  364             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainBool, DomainTuple [intDomain 1 3, DomainBool], intDomain 2 5])
  365             highConstant =
  366                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  367                     [ ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool True ], (ConstantInt TagInt) 4]
  368                     , ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantBool False], (ConstantInt TagInt) 6]
  369                     , ConstantAbstract $ AbsLitTuple [ConstantBool True , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantBool False], (ConstantInt TagInt) 8]
  370                     ]
  371             mid = [ ( "x_1", DomainMatrix   (intDomain 1 3) DomainBool
  372                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True] )
  373                   , ( "x_2", DomainMatrix   (intDomain 1 3) (DomainTuple [intDomain 1 3, DomainBool])
  374                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  375                                [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool True ]
  376                                , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantBool False]
  377                                , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantBool False]
  378                                ] )
  379                   , ( "x_3", DomainMatrix   (intDomain 1 3) (intDomain 2 5)
  380                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4, (ConstantInt TagInt) 6, (ConstantInt TagInt) 8]
  381                            )
  382                   ]
  383             low = [ ( "x_1"  , DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True ])
  384                   , ( "x_2_1", DomainMatrix (intDomain 1 3) (intDomain 1 3), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2     , (ConstantInt TagInt) 3     , (ConstantInt TagInt) 4     ])
  385                   , ( "x_2_2", DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False])
  386                   , ( "x_3"  , DomainMatrix (intDomain 1 3) (intDomain 2 5), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4     , (ConstantInt TagInt) 6     , (ConstantInt TagInt) 8     ])
  387                   ]
  388         in  testCases "x" highDomain highConstant Just mid low
  389 
  390     , testCase "matrix of (((bool, int), bool), int)" $
  391         let
  392             highDomain = DomainMatrix (intDomain 1 3) (DomainTuple [DomainTuple [DomainTuple [DomainBool, intDomain 1 3], DomainBool], intDomain 2 5])
  393             highConstant =
  394                 ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  395                     [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantBool True ], (ConstantInt TagInt) 4]
  396                     , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3], ConstantBool False], (ConstantInt TagInt) 6]
  397                     , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4], ConstantBool False], (ConstantInt TagInt) 8]
  398                     ]
  399             mid = [ ( "x_1", DomainMatrix   (intDomain 1 3) (DomainTuple [DomainTuple [DomainBool,intDomain 1 3],DomainBool])
  400                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  401                                [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantBool True ]
  402                                , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3], ConstantBool False]
  403                                , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4], ConstantBool False]
  404                                ])
  405                   , ( "x_2", DomainMatrix   (intDomain 1 3) (intDomain 2 5)
  406                            , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4, (ConstantInt TagInt) 6, (ConstantInt TagInt) 8]
  407                            )
  408                   ]
  409             low = [ ( "x_1_1_1", DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False, ConstantBool False, ConstantBool True ])
  410                   , ( "x_1_1_2", DomainMatrix (intDomain 1 3) (intDomain 1 3), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2     , (ConstantInt TagInt) 3     , (ConstantInt TagInt) 4     ])
  411                   , ( "x_1_2"  , DomainMatrix (intDomain 1 3) DomainBool     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True , ConstantBool False, ConstantBool False])
  412                   , ( "x_2"    , DomainMatrix (intDomain 1 3) (intDomain 2 5), ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4     , (ConstantInt TagInt) 6     , (ConstantInt TagInt) 8     ])
  413                   ]
  414         in  testCases "x" highDomain highConstant Just mid low
  415 
  416     , testCase "matrix 2d of (((bool, int), bool), int)" $
  417         let
  418             highDomain =
  419                 DomainMatrix (intDomain 1 2)
  420                     (DomainMatrix (intDomain 1 3)
  421                         (DomainTuple [DomainTuple [DomainTuple [DomainBool, intDomain 1 3], DomainBool], intDomain 2 5]))
  422             highConstant =
  423                 ConstantAbstract $ AbsLitMatrix (intDomain 1 2)
  424                     [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  425                         [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 2], ConstantBool True ], (ConstantInt TagInt) 4]
  426                         , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 3], ConstantBool False], (ConstantInt TagInt) 6]
  427                         , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 4], ConstantBool False], (ConstantInt TagInt) 8]
  428                         ]
  429                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  430                         [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False, (ConstantInt TagInt) 4], ConstantBool True ], (ConstantInt TagInt) 4]
  431                         , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 5], ConstantBool False], (ConstantInt TagInt) 7]
  432                         , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True , (ConstantInt TagInt) 6], ConstantBool False], (ConstantInt TagInt) 9]
  433                         ]
  434                     ]
  435             mid =
  436                 [ ( "x_1" , DomainMatrix (intDomain 1 2)
  437                               (DomainMatrix (intDomain 1 3)
  438                                   (DomainTuple [DomainTuple [DomainBool, intDomain 1 3], DomainBool]))
  439                           , ConstantAbstract $ AbsLitMatrix (intDomain 1 2)
  440                               [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  441                                   [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False,(ConstantInt TagInt) 2],ConstantBool True]
  442                                   , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False,(ConstantInt TagInt) 3],ConstantBool False]
  443                                   , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True,(ConstantInt TagInt) 4],ConstantBool False]
  444                                   ]
  445                               , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  446                                   [ ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool False,(ConstantInt TagInt) 4],ConstantBool True]
  447                                   , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True,(ConstantInt TagInt) 5],ConstantBool False]
  448                                   , ConstantAbstract $ AbsLitTuple [ConstantAbstract $ AbsLitTuple [ConstantBool True,(ConstantInt TagInt) 6],ConstantBool False]
  449                                   ]
  450                               ] )
  451                 , ( "x_2" , DomainMatrix (intDomain 1 2)
  452                                   (DomainMatrix (intDomain 1 3)
  453                                       (intDomain 2 5))
  454                           , ConstantAbstract $ AbsLitMatrix (intDomain 1 2)
  455                                 [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4,(ConstantInt TagInt) 6,(ConstantInt TagInt) 8]
  456                                 , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4,(ConstantInt TagInt) 7,(ConstantInt TagInt) 9]
  457                                 ] )
  458                 ]
  459             low =
  460                 [ ( "x_1_1_1" , DomainMatrix   (intDomain 1 2) (DomainMatrix (intDomain 1 3) DomainBool)
  461                               , ConstantAbstract $ AbsLitMatrix (intDomain 1 2)
  462                                   [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False,ConstantBool False,ConstantBool True]
  463                                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False,ConstantBool True,ConstantBool True]
  464                                   ] )
  465                 , ( "x_1_1_2" , DomainMatrix   (intDomain 1 2) (DomainMatrix (intDomain 1 3) (intDomain 1 3))
  466                               , ConstantAbstract $ AbsLitMatrix (intDomain 1 2)
  467                                   [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 3,(ConstantInt TagInt) 4]
  468                                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4,(ConstantInt TagInt) 5,(ConstantInt TagInt) 6]
  469                                   ] )
  470                 , ( "x_1_2"   , DomainMatrix   (intDomain 1 2) (DomainMatrix (intDomain 1 3) DomainBool)
  471                               , ConstantAbstract $ AbsLitMatrix (intDomain 1 2)
  472                                   [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True,ConstantBool False,ConstantBool False]
  473                                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True,ConstantBool False,ConstantBool False]
  474                                   ] )
  475                 , ( "x_2"     , DomainMatrix   (intDomain 1 2) (DomainMatrix (intDomain 1 3) (intDomain 2 5))
  476                               , ConstantAbstract $ AbsLitMatrix (intDomain 1 2)
  477                                   [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4,(ConstantInt TagInt) 6,(ConstantInt TagInt) 8]
  478                                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 4,(ConstantInt TagInt) 7,(ConstantInt TagInt) 9]
  479                                   ] )
  480                 ]
  481         in  testCases "x" highDomain highConstant Just mid low
  482 
  483     , testCase "(bool, bool, bool)" $ testCasesAuto "x"
  484         ( DomainTuple [DomainBool, DomainBool, DomainBool] )
  485         ( ConstantAbstract $ AbsLitTuple [ConstantBool False, ConstantBool False, ConstantBool True] )
  486 
  487     , testCase "(bool, matrix of int) {auto}" $ testCasesAuto "x"
  488         ( DomainTuple
  489             [ DomainBool
  490             , DomainMatrix (intDomain 1 3) (intDomain 0 9)
  491             ] )
  492         ( ConstantAbstract $ AbsLitTuple
  493             [ ConstantBool False
  494             , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2, (ConstantInt TagInt) 4, (ConstantInt TagInt) 5]
  495             ] )
  496 
  497     , testCase "(bool, matrix of int)" $
  498         let
  499             highDomain =
  500                 DomainTuple
  501                     [ DomainBool
  502                     , DomainMatrix (intDomain 1 3) (intDomain 0 9)
  503                     ]
  504             highConstant =
  505                 ConstantAbstract $ AbsLitTuple
  506                     [ ConstantBool False
  507                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2, (ConstantInt TagInt) 4, (ConstantInt TagInt) 5]
  508                     ]
  509             low =
  510                 [ ( "x_1", DomainBool,ConstantBool False)
  511                 , ( "x_2", DomainMatrix (intDomain 1 3) (intDomain 0 9)
  512                          , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 4,(ConstantInt TagInt) 5] )
  513                 ]
  514         in  testCases "x" highDomain highConstant Just low low
  515 
  516     , testCase "(bool, matrix of (int, bool)) {auto}" $ testCasesAuto "x"
  517         ( DomainTuple
  518             [ DomainBool
  519             , DomainMatrix (intDomain 1 3) (DomainTuple [intDomain 0 9, DomainBool])
  520             ] )
  521         ( ConstantAbstract $ AbsLitTuple
  522             [ ConstantBool False
  523             , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  524                 [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool False]
  525                 , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantBool True]
  526                 , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool False]
  527                 ]
  528             ] )
  529 
  530     , testCase "(bool, matrix of (int, bool))" $
  531         let
  532             highDomain =
  533                 DomainTuple
  534                     [ DomainBool
  535                     , DomainMatrix (intDomain 1 3) (DomainTuple [intDomain 0 9, DomainBool])
  536                     ]
  537             highConstant =
  538                 ConstantAbstract $ AbsLitTuple
  539                     [ ConstantBool False
  540                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  541                         [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool False]
  542                         , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantBool True]
  543                         , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool False]
  544                         ]
  545                     ]
  546             mid =
  547                 [ ( "x_1" , DomainBool , ConstantBool False )
  548                 , ( "x_2" , DomainMatrix (intDomain 1 3) (DomainTuple [intDomain 0 9,DomainBool])
  549                           , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  550                               [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2,ConstantBool False]
  551                               , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4,ConstantBool True]
  552                               , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5,ConstantBool False]
  553                               ] )
  554                 ]
  555             low =
  556                 [ ( "x_1"   , DomainBool , ConstantBool False )
  557                 , ( "x_2_1" , DomainMatrix (intDomain 1 3) (intDomain 0 9) , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 4,(ConstantInt TagInt) 5] )
  558                 , ( "x_2_2" , DomainMatrix (intDomain 1 3) DomainBool      , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False,ConstantBool True,ConstantBool False] )
  559                 ]
  560         in  testCases "x" highDomain highConstant Just mid low
  561 
  562     , testCase "(bool, matrix of (int, matrix of int)) {auto}" $ testCasesAuto "x"
  563         ( DomainTuple
  564             [ DomainBool
  565             , DomainMatrix (intDomain 1 3) (DomainTuple
  566                 [ intDomain 0 9
  567                 , DomainMatrix (intDomain 1 2) (intDomain 0 9)
  568                 ])
  569             ] )
  570         ( ConstantAbstract $ AbsLitTuple
  571             [ ConstantBool False
  572             , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  573                 [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 1, (ConstantInt TagInt) 3]]
  574                 , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 3, (ConstantInt TagInt) 5]]
  575                 , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 5, (ConstantInt TagInt) 6]]
  576                 ]
  577             ] )
  578 
  579     , testCase "(bool, matrix of (int, matrix of int))" $
  580         let
  581             highDomain =
  582                 DomainTuple
  583                     [ DomainBool
  584                     , DomainMatrix (intDomain 1 3) (DomainTuple
  585                         [ intDomain 0 9
  586                         , DomainMatrix (intDomain 1 2) (intDomain 0 9)
  587                         ])
  588                     ]
  589             highConstant =
  590                 ConstantAbstract $ AbsLitTuple
  591                     [ ConstantBool False
  592                     , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  593                         [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 1, (ConstantInt TagInt) 3]]
  594                         , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4, ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 3, (ConstantInt TagInt) 5]]
  595                         , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 5, (ConstantInt TagInt) 6]]
  596                         ]
  597                     ]
  598             mid =
  599                 [ ( "x_1" , DomainBool,ConstantBool False )
  600                 , ( "x_2" , DomainMatrix   (intDomain 1 3) (DomainTuple [intDomain 0 9,DomainMatrix (intDomain 1 2) (intDomain 0 9)])
  601                           , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  602                               [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2,ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 1,(ConstantInt TagInt) 3]]
  603                               , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 4,ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 3,(ConstantInt TagInt) 5]]
  604                               , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5,ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 5,(ConstantInt TagInt) 6]]
  605                               ] )
  606                 ]
  607             low =
  608                 [ ( "x_1"   , DomainBool,ConstantBool False )
  609                 , ( "x_2_1" , DomainMatrix   (intDomain 1 3) (intDomain 0 9)
  610                             , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 4,(ConstantInt TagInt) 5])
  611                 , ( "x_2_2" , DomainMatrix   (intDomain 1 3) (DomainMatrix (intDomain 1 2) (intDomain 0 9))
  612                             , ConstantAbstract $ AbsLitMatrix (intDomain 1 3)
  613                                 [ ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 1,(ConstantInt TagInt) 3]
  614                                 , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 3,(ConstantInt TagInt) 5]
  615                                 , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 5,(ConstantInt TagInt) 6]
  616                                 ] )
  617                 ]
  618         in  testCases "x" highDomain highConstant Just mid low
  619 
  620 -- Explicit
  621     , testCase "Explicit: set (size 4) of int {auto}" $ testCasesAuto "x"
  622         ( DomainSet
  623             Set_Explicit
  624             (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 4)))
  625             (intDomain 0 9) )
  626         ( ConstantAbstract $ AbsLitSet
  627             [(ConstantInt TagInt) 2, (ConstantInt TagInt) 3, (ConstantInt TagInt) 5, (ConstantInt TagInt) 6] )
  628 
  629     , testCase "Explicit: set (size 4) of int" $
  630         let
  631             highDomain =
  632                 DomainSet
  633                     Set_Explicit
  634                     (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 4)))
  635                     (intDomain 0 9)
  636             highConstant =
  637                 ConstantAbstract $ AbsLitSet
  638                     [(ConstantInt TagInt) 2, (ConstantInt TagInt) 3, (ConstantInt TagInt) 5, (ConstantInt TagInt) 6]
  639             low =
  640                 [ ( "x_Explicit"
  641                   , DomainMatrix   (intDomain 1 4) (intDomain 0 9)
  642                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  643                         [(ConstantInt TagInt) 2,(ConstantInt TagInt) 3,(ConstantInt TagInt) 5,(ConstantInt TagInt) 6]
  644                   ) ]
  645         in  testCases "x" highDomain highConstant Just low low
  646 
  647     , testCase "Explicit: set (size 4) of set (size 2) of int {auto}" $ testCasesAuto "x"
  648         ( DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 4)))
  649             ( DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 2)))
  650                 (intDomain 0 9)
  651             )
  652         )
  653         ( ConstantAbstract $ AbsLitSet
  654             [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 3]
  655             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 6]
  656             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 7]
  657             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 8]
  658             ] )
  659 
  660     , testCase "Explicit: set (size 4) of set (size 2) of int" $
  661         let
  662             highDomain =
  663                 DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 4)))
  664                     (DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 2)))
  665                         (intDomain 0 9))
  666             highConstant =
  667                 ConstantAbstract $ AbsLitSet
  668                     [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 3]
  669                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 6]
  670                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 7]
  671                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 8]
  672                     ]
  673             mid =
  674                 [ ( "x_ExplicitR3"
  675                   , DomainMatrix   (intDomain 1 4) (DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 2))) (intDomain 0 9))
  676                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  677                         [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 3]
  678                         , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 6]
  679                         , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 7]
  680                         , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 5, (ConstantInt TagInt) 8]
  681                         ]
  682                   ) ]
  683             low =
  684                 [ ( "x_ExplicitR3_Explicit"
  685                   , DomainMatrix   (intDomain 1 4) (DomainMatrix (intDomain 1 2) (intDomain 0 9))
  686                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  687                         [ ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 2, (ConstantInt TagInt) 3]
  688                         , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 5, (ConstantInt TagInt) 6]
  689                         , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 5, (ConstantInt TagInt) 7]
  690                         , ConstantAbstract $ AbsLitMatrix (intDomain 1 2) [(ConstantInt TagInt) 5, (ConstantInt TagInt) 8]
  691                         ]
  692                   ) ]
  693         in  testCases "x" highDomain highConstant Just mid low
  694 
  695     , testCase "Explicit: set (size 4) of set (size 2) of (int, bool) {auto}" $ testCasesAuto "x"
  696         ( DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 4)))
  697             ( DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 2)))
  698                 (DomainTuple [intDomain 0 9, DomainBool])
  699             )
  700         )
  701         ( ConstantAbstract $ AbsLitSet
  702             [ ConstantAbstract $ AbsLitSet [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool False]
  703                           , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantBool True ]
  704                           ]
  705             , ConstantAbstract $ AbsLitSet [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool True ]
  706                           , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 6, ConstantBool True ]
  707                           ]
  708             , ConstantAbstract $ AbsLitSet [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool True ]
  709                           , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 7, ConstantBool False]
  710                           ]
  711             , ConstantAbstract $ AbsLitSet [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool False]
  712                           , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 8, ConstantBool False]
  713                           ]
  714             ] )
  715 
  716     , testCase "Explicit: set (size 4) of (int, set (size 2) of (int, bool)) {auto}" $ testCasesAuto "x"
  717         ( DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 4)))
  718             ( DomainTuple
  719                 [ intDomain 0 8
  720                 , DomainSet Set_Explicit (SetAttr (SizeAttr_Size ((ConstantInt TagInt) 2)))
  721                     (DomainTuple [intDomain 0 9, DomainBool])
  722                 ]
  723             )
  724         )
  725         ( ConstantAbstract $ AbsLitSet
  726             [ ConstantAbstract $ AbsLitTuple
  727                 [ (ConstantInt TagInt) 1
  728                 , ConstantAbstract $ AbsLitSet
  729                     [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 2, ConstantBool False]
  730                     , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 3, ConstantBool True ]
  731                     ]
  732                 ]
  733             , ConstantAbstract $ AbsLitTuple
  734                 [ (ConstantInt TagInt) 2
  735                 , ConstantAbstract $ AbsLitSet
  736                     [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool True ]
  737                     , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 6, ConstantBool True ]
  738                     ]
  739                 ]
  740             , ConstantAbstract $ AbsLitTuple
  741                 [ (ConstantInt TagInt) 3
  742                 , ConstantAbstract $ AbsLitSet
  743                     [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool True ]
  744                     , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 7, ConstantBool False]
  745                     ]
  746                 ]
  747             , ConstantAbstract $ AbsLitTuple
  748                 [ (ConstantInt TagInt) 4
  749                 , ConstantAbstract $ AbsLitSet
  750                     [ ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 5, ConstantBool False]
  751                     , ConstantAbstract $ AbsLitTuple [(ConstantInt TagInt) 8, ConstantBool False]
  752                     ]
  753                 ]
  754             ] )
  755 
  756 -- ExplicitVarSizeWithMarker
  757     , testCase "ExplicitVarSizeWithMarker: set (maxSize 4) of int {auto}" $ testCasesAuto "x"
  758         ( DomainSet
  759             Set_ExplicitVarSizeWithMarker
  760             (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  761             (intDomain 0 9) )
  762         ( ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5] )
  763 
  764     , testCase "ExplicitVarSizeWithMarker: set (maxSize 4) of int" $
  765         let
  766             highDomain =
  767                 DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4))) (intDomain 0 9)
  768             highConstant =
  769                 ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  770             low =
  771                 [ ( "x_ExplicitVarSizeWithMarker_Marker"
  772                   , intDomain 0 4
  773                   , (ConstantInt TagInt) 2
  774                   )
  775                 , ( "x_ExplicitVarSizeWithMarker_Values"
  776                   , DomainMatrix (intDomain 1 4) (intDomain 0 9)
  777                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5,(ConstantInt TagInt) 0,(ConstantInt TagInt) 0]
  778                   )
  779                 ]
  780         in  testCases "x" highDomain highConstant Just low low
  781 
  782     , testCase "ExplicitVarSizeWithMarker: set (maxSize 4) of set (maxSize 3) int {auto}" $ testCasesAuto "x"
  783         ( DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  784             ( DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
  785                 (intDomain 0 9)
  786             )
  787         )
  788         ( ConstantAbstract $ AbsLitSet
  789             [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  790             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  791             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
  792             ]
  793         )
  794 
  795     , testCase "ExplicitVarSizeWithMarker: set (maxSize 4) of set (maxSize 3) int" $
  796         let
  797             highDomain =
  798                 DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  799                     ( DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
  800                         (intDomain 0 9) )
  801             highConstant =
  802                 ConstantAbstract $ AbsLitSet
  803                     [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  804                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  805                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
  806                     ]
  807             mid =
  808                 [ ( "x_ExplicitVarSizeWithMarkerR5_Marker"
  809                   , intDomain 0 4
  810                   , (ConstantInt TagInt) 3
  811                   )
  812                 , ( "x_ExplicitVarSizeWithMarkerR5_Values"
  813                   , DomainMatrix   (intDomain 1 4) (DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3))) (intDomain 0 9))
  814                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  815                       [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  816                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5]
  817                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3,(ConstantInt TagInt) 4,(ConstantInt TagInt) 6]
  818                       , ConstantAbstract $ AbsLitSet []
  819                       ]
  820                   )
  821                 ]
  822             low =
  823                 [ ( "x_ExplicitVarSizeWithMarkerR5_Marker"
  824                   , intDomain 0 4
  825                   , (ConstantInt TagInt) 3
  826                   )
  827                 , ( "x_ExplicitVarSizeWithMarkerR5_Values_ExplicitVarSizeWithMarker_Marker"
  828                   , DomainMatrix   (intDomain 1 4) (intDomain 0 3)
  829                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [(ConstantInt TagInt) 1,(ConstantInt TagInt) 2,(ConstantInt TagInt) 3,(ConstantInt TagInt) 0]
  830                   )
  831                 , ( "x_ExplicitVarSizeWithMarkerR5_Values_ExplicitVarSizeWithMarker_Values"
  832                   , DomainMatrix   (intDomain 1 4) (DomainMatrix (intDomain 1 3) (intDomain 0 9))
  833                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  834                       [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 0,(ConstantInt TagInt) 0]
  835                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5,(ConstantInt TagInt) 0]
  836                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 3,(ConstantInt TagInt) 4,(ConstantInt TagInt) 6]
  837                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 0,(ConstantInt TagInt) 0,(ConstantInt TagInt) 0]
  838                       ]
  839                   )
  840                 ]
  841         in  testCases "x" highDomain highConstant Just mid low
  842 
  843 -- ExplicitVarSizeWithFlags
  844     , testCase "ExplicitVarSizeWithFlags: set (maxSize 4) of int {auto}" $ testCasesAuto "x"
  845         ( DomainSet
  846             Set_ExplicitVarSizeWithFlags
  847             (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  848             (intDomain 0 9) )
  849         ( ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5] )
  850 
  851     , testCase "ExplicitVarSizeWithFlags: set (maxSize 4) of int" $
  852         let
  853             highDomain =
  854                 DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4))) (intDomain 0 9)
  855             highConstant =
  856                 ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  857             low =
  858                 [ ( "x_ExplicitVarSizeWithFlags_Flags"
  859                   , DomainMatrix   (intDomain 1 4) DomainBool
  860                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [ConstantBool True,ConstantBool True,ConstantBool False,ConstantBool False]
  861                   )
  862                 , ( "x_ExplicitVarSizeWithFlags_Values"
  863                   , DomainMatrix   (intDomain 1 4) (intDomain 0 9)
  864                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5,(ConstantInt TagInt) 0,(ConstantInt TagInt) 0]
  865                   )
  866                 ]
  867         in  testCases "x" highDomain highConstant Just low low
  868 
  869     , testCase "ExplicitVarSizeWithFlags: set (maxSize 4) of set (maxSize 3) int {auto}" $ testCasesAuto "x"
  870         ( DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  871             ( DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
  872                 (intDomain 0 9)
  873             )
  874         )
  875         ( ConstantAbstract $ AbsLitSet
  876             [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  877             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  878             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
  879             ]
  880         )
  881 
  882     , testCase "ExplicitVarSizeWithFlags: set (maxSize 4) of set (maxSize 3) int" $
  883         let
  884             highDomain =
  885                 DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  886                     ( DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
  887                         (intDomain 0 9) )
  888             highConstant =
  889                 ConstantAbstract $ AbsLitSet
  890                     [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  891                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  892                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
  893                     ]
  894             mid =
  895                 [ ( "x_ExplicitVarSizeWithFlagsR4_Flags"
  896                   , DomainMatrix   (intDomain 1 4) DomainBool
  897                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [ConstantBool True,ConstantBool True,ConstantBool True,ConstantBool False]
  898                   )
  899                 , ( "x_ExplicitVarSizeWithFlagsR4_Values"
  900                   , DomainMatrix   (intDomain 1 4) (DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3))) (intDomain 0 9))
  901                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  902                       [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  903                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5]
  904                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3,(ConstantInt TagInt) 4,(ConstantInt TagInt) 6]
  905                       , ConstantAbstract $ AbsLitSet []
  906                       ]
  907                   )
  908                 ]
  909             low =
  910                 [ ( "x_ExplicitVarSizeWithFlagsR4_Flags"
  911                   , DomainMatrix   (intDomain 1 4) DomainBool
  912                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [ConstantBool True,ConstantBool True,ConstantBool True,ConstantBool False]
  913                   )
  914                 , ( "x_ExplicitVarSizeWithFlagsR4_Values_ExplicitVarSizeWithFlags_Flags"
  915                   , DomainMatrix   (intDomain 1 4) (DomainMatrix (intDomain 1 3) DomainBool)
  916                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  917                       [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True,ConstantBool False,ConstantBool False]
  918                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True,ConstantBool True,ConstantBool False]
  919                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool True,ConstantBool True,ConstantBool True]
  920                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [ConstantBool False,ConstantBool False,ConstantBool False]
  921                       ]
  922                   )
  923                 , ( "x_ExplicitVarSizeWithFlagsR4_Values_ExplicitVarSizeWithFlags_Values"
  924                   , DomainMatrix   (intDomain 1 4) (DomainMatrix (intDomain 1 3) (intDomain 0 9))
  925                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
  926                       [ ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 0,(ConstantInt TagInt) 0]
  927                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5,(ConstantInt TagInt) 0]
  928                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 3,(ConstantInt TagInt) 4,(ConstantInt TagInt) 6]
  929                       , ConstantAbstract $ AbsLitMatrix (intDomain 1 3) [(ConstantInt TagInt) 0,(ConstantInt TagInt) 0,(ConstantInt TagInt) 0]
  930                       ]
  931                   ) ]
  932         in  testCases "x" highDomain highConstant Just mid low
  933 
  934 -- Occurrence
  935     , testCase "Occurrence: set (maxSize 4) of int {auto}" $ testCasesAuto "x"
  936         ( DomainSet
  937             Set_Occurrence
  938             (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  939             (intDomain 0 9) )
  940         ( ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5] )
  941 
  942     , testCase "Occurrence: set (maxSize 4) of int" $
  943         let
  944             highDomain =
  945                 DomainSet Set_Occurrence (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4))) (intDomain 0 9)
  946             highConstant =
  947                 ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  948             low =
  949                 [ ( "x_Occurrence"
  950                   , DomainMatrix   (intDomain 0 9) DomainBool
  951                   , ConstantAbstract $ AbsLitMatrix (intDomain 0 9)
  952                       [ ConstantBool False
  953                       , ConstantBool False
  954                       , ConstantBool True -- 2
  955                       , ConstantBool False
  956                       , ConstantBool False
  957                       , ConstantBool True -- 5
  958                       , ConstantBool False
  959                       , ConstantBool False
  960                       , ConstantBool False
  961                       , ConstantBool False
  962                       ]
  963                   )
  964                 ]
  965         in  testCases "x" highDomain highConstant Just low low
  966 
  967     , testCase "ExplicitVarSizeWithMarker & Occurrence: set (maxSize 4) of set (maxSize 3) int {auto}" $ testCasesAuto "x"
  968         ( DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  969             ( DomainSet Set_Occurrence (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
  970                 (intDomain 0 9)
  971             )
  972         )
  973         ( ConstantAbstract $ AbsLitSet
  974             [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  975             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  976             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
  977             ]
  978         )
  979 
  980     , testCase "ExplicitVarSizeWithMarker & Occurrence: set (maxSize 4) of set (maxSize 3) int" $
  981         let
  982             highDomain =
  983                 DomainSet Set_ExplicitVarSizeWithMarker (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
  984                     ( DomainSet Set_Occurrence (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
  985                         (intDomain 0 9) )
  986             highConstant =
  987                 ConstantAbstract $ AbsLitSet
  988                     [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
  989                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
  990                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
  991                     ]
  992             mid =
  993                 [ ( "x_ExplicitVarSizeWithMarkerR2_Marker"
  994                   , intDomain 0 4
  995                   , (ConstantInt TagInt) 3
  996                   )
  997                 , ( "x_ExplicitVarSizeWithMarkerR2_Values"
  998                   , DomainMatrix   (intDomain 1 4) (DomainSet Set_Occurrence (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3))) (intDomain 0 9))
  999                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
 1000                       [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
 1001                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5]
 1002                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3,(ConstantInt TagInt) 4,(ConstantInt TagInt) 6]
 1003                       , ConstantAbstract $ AbsLitSet []
 1004                       ]
 1005                   )
 1006                 ]
 1007             low =
 1008                 [ ( "x_ExplicitVarSizeWithMarkerR2_Marker"
 1009                   , intDomain 0 4
 1010                   , (ConstantInt TagInt) 3
 1011                   )
 1012                 , ( "x_ExplicitVarSizeWithMarkerR2_Values_Occurrence"
 1013                   , DomainMatrix   (intDomain 1 4) (DomainMatrix (intDomain 0 9) DomainBool)
 1014                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
 1015                       [ ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- 2
 1016                           [ ConstantBool False, ConstantBool False, ConstantBool True , ConstantBool False, ConstantBool False
 1017                           , ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False ]
 1018                       , ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- 2,5
 1019                           [ ConstantBool False, ConstantBool False, ConstantBool True , ConstantBool False, ConstantBool False
 1020                           , ConstantBool True , ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False ]
 1021                       , ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- 3,4,6
 1022                           [ ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool True , ConstantBool True
 1023                           , ConstantBool False, ConstantBool True , ConstantBool False, ConstantBool False, ConstantBool False ]
 1024                       , ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- {}
 1025                           [ ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False
 1026                           , ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False ]
 1027                       ]
 1028                   )
 1029                 ]
 1030         in  testCases "x" highDomain highConstant Just mid low
 1031 
 1032     , testCase "ExplicitVarSizeWithFlags & Occurrence: set (maxSize 4) of set (maxSize 3) int {auto}" $ testCasesAuto "x"
 1033         ( DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
 1034             ( DomainSet Set_Occurrence (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
 1035                 (intDomain 0 9)
 1036             )
 1037         )
 1038         ( ConstantAbstract $ AbsLitSet
 1039             [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
 1040             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
 1041             , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
 1042             ]
 1043         )
 1044 
 1045     , testCase "ExplicitVarSizeWithFlags & Occurrence: set (maxSize 4) of set (maxSize 3) int" $
 1046         let
 1047             highDomain =
 1048                 DomainSet Set_ExplicitVarSizeWithFlags (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 4)))
 1049                     ( DomainSet Set_Occurrence (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3)))
 1050                         (intDomain 0 9) )
 1051             highConstant =
 1052                 ConstantAbstract $ AbsLitSet
 1053                     [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
 1054                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2, (ConstantInt TagInt) 5]
 1055                     , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3, (ConstantInt TagInt) 4, (ConstantInt TagInt) 6]
 1056                     ]
 1057             mid =
 1058                 [ ( "x_ExplicitVarSizeWithFlagsR2_Flags"
 1059                   , DomainMatrix   (intDomain 1 4) DomainBool
 1060                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [ConstantBool True,ConstantBool True,ConstantBool True,ConstantBool False]
 1061                   )
 1062                 , ( "x_ExplicitVarSizeWithFlagsR2_Values"
 1063                   , DomainMatrix   (intDomain 1 4) (DomainSet Set_Occurrence (SetAttr (SizeAttr_MaxSize ((ConstantInt TagInt) 3))) (intDomain 0 9))
 1064                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
 1065                       [ ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2]
 1066                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 2,(ConstantInt TagInt) 5]
 1067                       , ConstantAbstract $ AbsLitSet [(ConstantInt TagInt) 3,(ConstantInt TagInt) 4,(ConstantInt TagInt) 6]
 1068                       , ConstantAbstract $ AbsLitSet []
 1069                       ]
 1070                   )
 1071                 ]
 1072             low =
 1073                 [ ( "x_ExplicitVarSizeWithFlagsR2_Flags"
 1074                   , DomainMatrix   (intDomain 1 4) DomainBool
 1075                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4) [ConstantBool True,ConstantBool True,ConstantBool True,ConstantBool False]
 1076                   )
 1077                 , ( "x_ExplicitVarSizeWithFlagsR2_Values_Occurrence"
 1078                   , DomainMatrix   (intDomain 1 4) (DomainMatrix (intDomain 0 9) DomainBool)
 1079                   , ConstantAbstract $ AbsLitMatrix (intDomain 1 4)
 1080                       [ ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- 2
 1081                           [ ConstantBool False, ConstantBool False, ConstantBool True , ConstantBool False, ConstantBool False
 1082                           , ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False ]
 1083                       , ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- 2,5
 1084                           [ ConstantBool False, ConstantBool False, ConstantBool True , ConstantBool False, ConstantBool False
 1085                           , ConstantBool True , ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False ]
 1086                       , ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- 3,4,6
 1087                           [ ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool True , ConstantBool True
 1088                           , ConstantBool False, ConstantBool True , ConstantBool False, ConstantBool False, ConstantBool False ]
 1089                       , ConstantAbstract $ AbsLitMatrix (intDomain 0 9) -- {}
 1090                           [ ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False
 1091                           , ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False, ConstantBool False ]
 1092                       ]
 1093                   )
 1094                 ]
 1095         in  testCases "x" highDomain highConstant Just mid low
 1096 
 1097     ]
 1098 
 1099 
 1100 testCases ::
 1101     (?typeCheckerMode :: TypeCheckerMode) =>
 1102     Name ->                                     -- high level variable name
 1103     Domain HasRepresentation Constant ->        -- high level domain
 1104     Constant ->                                 -- high level value (constant)
 1105     (forall a . a -> Maybe a) ->                -- `const Nothing` - if going one level downC produces Nothing
 1106                                                 -- `Just`          - if going one level downC produces (Just mid)
 1107     [(Name, Domain HasRepresentation Constant, Constant)] ->    -- "mid" result, if we go one level down
 1108     [(Name, Domain HasRepresentation Constant, Constant)] ->    -- "low" result, if we go all the way down
 1109     Assertion
 1110 testCases highName highDomain highConstant mkMid mid low = do
 1111     downC1Test  (highName, highDomain, highConstant) (mkMid mid)
 1112     downTest    (highName, highDomain, highConstant) low
 1113     up1Test     (highName, highDomain) (map dropDomain mid) (highName, highConstant)
 1114     upTest      (highName, highDomain) (map dropDomain low) (highName, highConstant)
 1115     downUp1Test (highName, highDomain, highConstant)
 1116     downUpTest  (highName, highDomain, highConstant)
 1117 
 1118 downC1Test ::
 1119     (?typeCheckerMode :: TypeCheckerMode) =>
 1120     (Name, Domain HasRepresentation Constant, Constant) ->
 1121     Maybe [(Name, Domain HasRepresentation Constant, Constant)] ->
 1122     Assertion
 1123 downC1Test high low' =
 1124     case downC1 high of
 1125         TriedIO -> assertFailure "TriedIO"
 1126         Failed err -> assertFailure (show err)
 1127         Done low -> Pr low @?= Pr low'
 1128 
 1129 downTest ::
 1130     (?typeCheckerMode :: TypeCheckerMode) =>
 1131     (Name, Domain HasRepresentation Constant, Constant) ->
 1132     [(Name, Domain HasRepresentation Constant, Constant)] ->
 1133     Assertion
 1134 downTest high lows' =
 1135     case downC high of
 1136         TriedIO -> assertFailure "TriedIO"
 1137         Failed err -> assertFailure (show err)
 1138         Done lows -> Pr lows @?= Pr lows'
 1139 
 1140 up1Test ::
 1141     (?typeCheckerMode :: TypeCheckerMode) =>
 1142     (Name, Domain HasRepresentation Constant) ->
 1143     [(Name, Constant)] ->
 1144     (Name, Constant) ->
 1145     Assertion
 1146 up1Test info lows high' =
 1147     case up1 info lows of
 1148         TriedIO -> assertFailure "TriedIO"
 1149         Failed err -> assertFailure (show err)
 1150         Done high -> Pr high @?= Pr high'
 1151 
 1152 upTest ::
 1153     (?typeCheckerMode :: TypeCheckerMode) =>
 1154     (Name, Domain HasRepresentation Constant) ->
 1155     [(Name, Constant)] ->
 1156     (Name, Constant) ->
 1157     Assertion
 1158 upTest info lows high' =
 1159     case up lows info of
 1160         TriedIO -> assertFailure "TriedIO"
 1161         Failed err -> assertFailure (show err)
 1162         Done high -> Pr high @?= Pr high'
 1163 
 1164 
 1165 testCasesAuto ::
 1166     (?typeCheckerMode :: TypeCheckerMode) =>
 1167     Name ->                                         -- high level variable name
 1168     Domain HasRepresentation Constant ->            -- high level domain
 1169     Constant ->                                     -- high level value (constant)
 1170     Assertion
 1171 testCasesAuto highName highDomain highConstant = do
 1172     downUp1Test (highName, highDomain, highConstant)
 1173     downUpTest  (highName, highDomain, highConstant)
 1174 
 1175 
 1176 downUp1Test ::
 1177     (?typeCheckerMode :: TypeCheckerMode) =>
 1178     (Name, Domain HasRepresentation Constant, Constant) ->
 1179     Assertion
 1180 downUp1Test high =
 1181     case downC1 high of
 1182         TriedIO -> assertFailure "TriedIO"
 1183         Failed err -> assertFailure (show err)
 1184         Done mlows -> do
 1185             let lows = maybe [dropDomain high] (map dropDomain) mlows   -- use high if we cannot go downC1
 1186             case up1 (dropConstant high) lows of
 1187                 TriedIO -> assertFailure "TriedIO"
 1188                 Failed err -> assertFailure (show err)
 1189                 Done high' -> Pr high' @?= Pr (dropDomain high)
 1190 
 1191 downUpTest ::
 1192     (?typeCheckerMode :: TypeCheckerMode) =>
 1193     (Name, Domain HasRepresentation Constant, Constant) ->
 1194     Assertion
 1195 downUpTest high =
 1196     case downC high of
 1197         TriedIO -> assertFailure "TriedIO"
 1198         Failed err -> assertFailure (show err)
 1199         Done lows ->
 1200             case up (map dropDomain lows) (dropConstant high) of
 1201                 TriedIO -> assertFailure "TriedIO"
 1202                 Failed err -> assertFailure (show err)
 1203                 Done high' -> Pr high' @?= Pr (dropDomain high)
 1204 
 1205 
 1206 intDomain :: Default r => Integer -> Integer -> Domain r Constant
 1207 intDomain lb ub = defRepr $ mkDomainIntB ((ConstantInt TagInt) lb) ((ConstantInt TagInt) ub)
 1208 
 1209 dropConstant :: (a,b,c) -> (a,b)
 1210 dropConstant (a,b,_) = (a,b)
 1211 
 1212 dropDomain :: (a,b,c) -> (a,c)
 1213 dropDomain (a,_,c) = (a,c)
 1214 
 1215 
 1216 data Pr a = Pr a
 1217     deriving Eq
 1218 
 1219 instance Show (Pr [(Name, Domain HasRepresentation Constant, Constant)]) where
 1220     show (Pr xs) = show $ vcat $ concatMap show' xs
 1221         where
 1222             show' (name, dom, cons) = [ hang (pretty name) 4 $ vcat
 1223                                         [ ":" <+> pretty dom
 1224                                         , "=" <+> pretty cons
 1225                                         ] ]
 1226 
 1227 instance Show (Pr (Maybe [(Name, Domain HasRepresentation Constant, Constant)])) where
 1228     show (Pr Nothing) = "Nothing"
 1229     show (Pr (Just xs)) = show (Pr xs)
 1230 
 1231 instance Show (Pr (Name, Constant)) where
 1232     show (Pr (name, cons)) = show $ pretty name <+> "=" <+> pretty cons
 1233 
 1234 instance Show (Pr [(Name, Constant)]) where
 1235     show (Pr xs) = intercalate "\n" $ map (show . Pr) xs
 1236 
 1237