module Main where

import Control.Applicative
import Data.Bits
import Data.List (nub, sort, group)
import Data.Word (Word)
import Test.Tasty
import Test.Tasty.TH

import Data.PrimitiveArray.Index.IOC
import Data.PrimitiveArray.Index.Point
import Data.PrimitiveArray.Index.Set
import Data.PrimitiveArray.Index.Class

import QuickCheck
import SmallCheck



-- * Sets

-- TODO what exactly does the mask fix? Only bits already @1@, or every bit
-- as it is? The mask should actually freeze-fix those bits, where we are
-- set to @1@!

--prop_Fixed_BitSet_setSucc (u :: Word, Fixed m s :: Fixed (BitSet I)) = traceShow (tgo, tsu) $ tgo == tsu
--  where tgo = go s
--        tsu = (getFixed <$> setSucc (Fixed 0 0) (Fixed 0 h) (Fixed m s))
--        fb1 = m .&. s -- fixed bits to 1
--        fb0 = m .&. complement s  -- fixed bits to 0
--        h   = bit (fromIntegral $ u `mod` 8) - 1
--        go x -- continue creating successors, until the mask criterion is met (again).
--          | Nothing <- ssx = Nothing
--          | Just x' <- ssx
--          , fb0 == m .&. complement x'
--          , fb1 == m .&. x' = traceShow ('j',fb0,fb1,m,x,x') $ Just x'
--          | Just x' <- ssx  = traceShow ('g',fb0,fb1,m,x,x') $ go x'
--          where ssx = setSucc 0 h x



main :: IO ()
main = do
  defaultMain $ testGroup ""
    [ quickcheck_tests
    , smallcheck_tests
    ]