packages feed

penny-0.24.0.0: tests/Copper/Gen/Terminals.hs

module Copper.Gen.Terminals where

import qualified Test.QuickCheck.Gen as G
import Test.QuickCheck.Gen (Gen)
import qualified Penny.Copper.Terminals as T

invalid :: Gen Char
invalid = G.choose ('\xD800', '\xDFFF')

unicode :: Gen Char
unicode = G.suchThat (G.choose (minBound, maxBound)) (not . T.invalid)

newline :: Gen Char
newline = return '\x0A'

space :: Gen Char
space = return '\x20'

tab :: Gen Char
tab = return '\x09'

white :: Gen Char
white = G.oneof [space, tab]

nonNewline :: Gen Char
nonNewline = G.suchThat unicode (not . T.newline)

nonNewlineNonSpace :: Gen Char
nonNewlineNonSpace = G.suchThat nonNewline (not . T.white)

upperCaseAscii :: Gen Char
upperCaseAscii = G.choose ('A', 'Z')

lowerCaseAscii :: Gen Char
lowerCaseAscii = G.choose ('a', 'z')

digit :: Gen Char
digit = G.choose ('0', '9')

nonAscii :: Gen Char
nonAscii = G.suchThat nonNewline (> '\x7f')

letter :: Gen Char
letter = G.oneof [upperCaseAscii, lowerCaseAscii, nonAscii]

dollar :: Gen Char
dollar = return '$'

colon :: Gen Char
colon = return ':'

openCurly :: Gen Char
openCurly = return '{'

closeCurly :: Gen Char
closeCurly = return '}'

openSquare :: Gen Char
openSquare = return '['

closeSquare :: Gen Char
closeSquare = return ']'

doubleQuote :: Gen Char
doubleQuote = return '"'

period :: Gen Char
period = return '.'

hash :: Gen Char
hash = return '#'

thinSpace :: Gen Char
thinSpace = return '\x2009'

dateSep :: Gen Char
dateSep = G.elements "/-"

plus :: Gen Char
plus = return '+'

minus :: Gen Char
minus = return '-'

lessThan :: Gen Char
lessThan = return '<'

greaterThan :: Gen Char
greaterThan = return '>'

openParen :: Gen Char
openParen = return '('

closeParen :: Gen Char
closeParen = return ')'

semicolon :: Gen Char
semicolon = return ';'

apostrophe :: Gen Char
apostrophe = return '\x27'

tilde :: Gen Char
tilde = return '~'

underscore :: Gen Char
underscore = return '_'

asterisk :: Gen Char
asterisk = return '*'

atSign :: Gen Char
atSign = return '@'

lvl1AcctChar :: Gen Char
lvl1AcctChar = G.suchThat nonNewline
  (\c -> (not . T.closeCurly $ c) && (not . T.colon $ c))

lvl2AcctOtherChar :: Gen Char
lvl2AcctOtherChar =
  G.suchThat nonNewline
  (\c -> (not . T.white $ c)
    && (not . T.colon $ c) && (not . T.asterisk $ c)
    && (not . T.greaterThan $ c) && (not . T.lessThan $ c))


lvl1CmdtyChar :: Gen Char
lvl1CmdtyChar = G.suchThat nonNewline (not . T.doubleQuote)

lvl2CmdtyFirstChar :: Gen Char
lvl2CmdtyFirstChar = G.oneof [letter, dollar]

lvl2CmdtyOtherChar :: Gen Char
lvl2CmdtyOtherChar = G.suchThat nonNewline (not . T.white)

lvl3CmdtyChar :: Gen Char
lvl3CmdtyChar = G.oneof [letter, dollar]

flagChar :: Gen Char
flagChar = G.suchThat nonNewline (not . T.closeSquare)

numberChar :: Gen Char
numberChar = G.suchThat nonNewline (not . T.closeParen)

quotedPayeeChar :: Gen Char
quotedPayeeChar = G.suchThat nonNewline (not . T.tilde)

tagChar :: Gen Char
tagChar = G.suchThat nonNewlineNonSpace
  (\c -> (not . T.asterisk $ c) && (not . T.greaterThan $ c)
    && (not . T.lessThan $ c))