bf-optimize/test/Arbitrary/InvalidBrainfuckProgram.hs

26 lines
932 B
Haskell

{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE DerivingStrategies #-}
module Arbitrary.InvalidBrainfuckProgram (InvalidBrainfuckProgram(..)) where
import Data.Text (Text)
import Test.QuickCheck.Gen (Gen)
import Test.QuickCheck.Arbitrary (Arbitrary (arbitrary))
import qualified Data.Text as Text
import qualified Test.QuickCheck.Gen as Gen
import qualified Arbitrary.ValidBrainfuckProgram as ValidBrainfuckProgram
newtype InvalidBrainfuckProgram = InvalidBrainfuckProgram { get :: Text }
deriving stock Show
instance Arbitrary InvalidBrainfuckProgram where
arbitrary :: Gen InvalidBrainfuckProgram
arbitrary = do
validProgram <- ValidBrainfuckProgram.get <$> arbitrary
index <- Gen.choose (0, Text.length validProgram)
badBrace <- Gen.oneof $ map pure "[]"
let (prefix, suffix) = Text.splitAt index validProgram
pure . InvalidBrainfuckProgram $ Text.concat [prefix, Text.singleton badBrace, suffix]