{-# 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]