Skip to content

Commit

Permalink
Added new test file and generators.
Browse files Browse the repository at this point in the history
  • Loading branch information
PiotrJustyna committed Nov 24, 2015
1 parent 6074d11 commit 8047b46
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 45 deletions.
7 changes: 6 additions & 1 deletion Roller/Parse.hs
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
module Roller.Parse (parse, naturalNumber) where
module Roller.Parse
(
parse,
naturalNumber,
dieTerm
) where

import Roller.Types

Expand Down
62 changes: 62 additions & 0 deletions Tests/ParseTests.hs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import Roller.Types
import Roller.Parse

import Data.Char
import Test.QuickCheck
import Text.Regex.Applicative

newtype NumericalTextGenerator = NumericalTextGenerator String deriving Show
newtype CorrectDieTermGenerator = CorrectDieTermGenerator String deriving Show

instance Arbitrary NumericalTextGenerator where arbitrary = NumericalTextGenerator <$> generateNumberText
instance Arbitrary CorrectDieTermGenerator where arbitrary = CorrectDieTermGenerator <$> generateCorrectDieTerm

main :: IO ()
main = do
print $ "Verify parse natural number given numerical text."
quickCheck prop_ParseNaturalNumberGivenNumericalText

print $ "Verify parse natural number given nonnumerical text."
quickCheck prop_ParseNaturalNumberGivenNonnumericalText

print $ "Verify parse Die Term given correct die term text."
quickCheck prop_ParseDieTermGivenCorrectDieTermText

generateDigit :: Gen Char
generateDigit = elements ['0' .. '9']

generateNumberText :: Gen String
generateNumberText = listOf1 generateDigit

generateCorrectNumberOfDiceText :: Gen String
generateCorrectNumberOfDiceText = resize 2 $ listOf1 generateDigit

generateCorrectNumberOfFacesOfEachDieText :: Gen String
generateCorrectNumberOfFacesOfEachDieText = resize 2 $ listOf1 generateDigit

generateCorrectDieTerm :: Gen String
generateCorrectDieTerm = (++) <$> generateCorrectNumberOfDiceText <*> ((:) <$> pure 'd' <*> generateCorrectNumberOfFacesOfEachDieText)

prop_ParseNaturalNumberGivenNumericalText :: NumericalTextGenerator -> Bool
prop_ParseNaturalNumberGivenNumericalText (NumericalTextGenerator text) =
case (text =~ naturalNumber) of
Just x -> if x >= 0 then True else False
Nothing -> False

prop_ParseNaturalNumberGivenNonnumericalText :: String -> Property
prop_ParseNaturalNumberGivenNonnumericalText text =
containsNoDigits text ==>
case (text =~ naturalNumber) of
Just x -> False
Nothing -> True
where
containsNoDigits x = (foldl (\y z -> if y == 0 && z `elem` x then y + 1 else y) 0 ['0' .. '9']) == 0

prop_ParseDieTermGivenCorrectDieTermText :: CorrectDieTermGenerator -> Property
prop_ParseDieTermGivenCorrectDieTermText (CorrectDieTermGenerator text) =
collect text $
collect (show (text =~ dieTerm)) $
True ==>
case (text =~ dieTerm) of
Just (DieTerm x y) -> True
Nothing -> False
44 changes: 0 additions & 44 deletions Tests/TypesTests.hs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
import Roller.Types
import Roller.Parse

import Data.Char
import Data.Word
import Test.QuickCheck
import Text.Regex.Applicative

main :: IO ()
main = do
Expand All @@ -26,15 +23,6 @@ main = do
print $ "Verify show SubtractedConstantTerm."
quickCheck prop_ShowSubtractedConstantTerm

print $ "Verify parse natural number given numerical text."
quickCheck prop_ParseNaturalNumberGivenNumericalText

print $ "Verify parse natural number given nonnumerical text."
quickCheck prop_ParseNaturalNumberGivenNonnumericalText

print $ "Verify parse natural number given mixed text."
quickCheck prop_ParseNaturalNumberGivenMixedText

prop_ShowDieTerm :: Word8 -> Word8 -> Bool
prop_ShowDieTerm x y = show (DieTerm x y) == show x ++ show dieSymbol ++ show y

Expand All @@ -52,35 +40,3 @@ prop_ShowAddedConstantTerm x = show (AddedConstantTerm x) == show additionSymbol

prop_ShowSubtractedConstantTerm :: Word8 -> Bool
prop_ShowSubtractedConstantTerm x = show (SubtractedConstantTerm x) == show subtractionSymbol ++ show x

newtype NumericalTextGenerator = NumericalTextGenerator String deriving Show
newtype NonNumericalTextGenerator = NonNumericalTextGenerator String deriving Show

instance Arbitrary NumericalTextGenerator where arbitrary = NumericalTextGenerator <$> generateNumberString

generateDigit :: Gen Char
generateDigit = elements ['0' .. '9']

generateNumberString :: Gen String
generateNumberString = listOf generateDigit

prop_ParseNaturalNumberGivenNumericalText :: NumericalTextGenerator -> Bool
prop_ParseNaturalNumberGivenNumericalText (NumericalTextGenerator x) =
case (x =~ naturalNumber) of
Just naturalNumber -> if naturalNumber >= 0 then True else False -- input: numerical text
Nothing -> True -- input: empty text

prop_ParseNaturalNumberGivenNonnumericalText :: String -> Property
prop_ParseNaturalNumberGivenNonnumericalText x =
containsNoDigits x ==>
case (x =~ naturalNumber) of
Just naturalNumber -> False -- input: nonnumerical text, only Nothing expected
Nothing -> True -- input: empty text
where
containsNoDigits x = (foldl (\y z -> if y == 0 && z `elem` x then y + 1 else y) 0 ['0' .. '9']) == 0

prop_ParseNaturalNumberGivenMixedText :: String -> Bool
prop_ParseNaturalNumberGivenMixedText x =
case (x =~ naturalNumber) of
Just naturalNumber -> if naturalNumber >= 0 then True else False -- input: random, but numerical/parsable text
Nothing -> True -- input: random, non-parsable text

0 comments on commit 8047b46

Please sign in to comment.