bf-optimize/test/Arbitrary/InvalidBrainfuckText.hs

26 lines
893 B
Haskell

{-# LANGUAGE InstanceSigs #-}
{-# LANGUAGE DerivingStrategies #-}
module Arbitrary.InvalidBrainfuckText (InvalidBrainfuckText(..)) 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.ValidBrainfuckText as ValidBrainfuckText
newtype InvalidBrainfuckText = InvalidBrainfuckText { get :: Text }
deriving stock Show
instance Arbitrary InvalidBrainfuckText where
arbitrary :: Gen InvalidBrainfuckText
arbitrary = do
validText <- ValidBrainfuckText.get <$> arbitrary
index <- Gen.choose (0, Text.length validText)
badBrace <- Gen.oneof $ map pure "[]"
let (prefix, suffix) = Text.splitAt index validText
pure . InvalidBrainfuckText $ Text.concat [prefix, Text.singleton badBrace, suffix]