module TestDSL where
import DSL
import Test.QuickCheck -- only used for testing

----------------------------------------------------------------
-- Testing code: not part of the exam.
  
instance Arbitrary C where
  arbitrary = sized arbC
  
arbC :: Int -> Gen C  
arbC 0 = elements [false, true]
arbC n = frequency [ (1, fmap inv   (arbC (n-1)))
                   , (1, fmap delay (arbC (n-1)))
                   , (1, fmap ands  (arbListC n))
                   , (1, fmap ors   (arbListC n))
                   ]
  
arbListC :: Int -> Gen [C]
arbListC n = do len <- choose (1, n `div` 2)
                let m = n `div` len
                vectorOf len  (arbC m)

test = take 5 $ run toggle

-- limit the list length to keep the running time down
q f = quickCheck (forAll (choose (0,100)) f)

main = do q prop_inv
          quickCheck prop_delay0
          q prop_delay
          q prop_toggle
          q prop_true