import Test.QuickCheck
genInstruction :: Gen BFInstruction
genInstruction = elements [MemoryRight .. Input]
genProgram :: Gen BFProgram
genProgram = BFProgram [] <$> genInstruction <*> listOf genInstruction
advanceBy_prop :: Property
advanceBy_prop =
forAll genProgram $ \program ->
forAll (choose (0, maximumAdvance program)) $ \x ->
advanceBy (negate x) (advanceBy x program) === program
where
maximumAdvance (BFProgram _ _ r) = length r