robin-hood-profit-0.0.2: test/RobinHood/Test/Money.hs
module RobinHood.Test.Money where
import Data.Attoparsec.ByteString (parseOnly)
import Data.Text.Encoding as DTE
import RobinHood.Money
import RobinHood.Prelude
import Test.Tasty.QuickCheck
prop_parseMoney_showed_positive_int :: Positive Int -> Bool
prop_parseMoney_showed_positive_int (Positive n) =
parseOnly parseMoney (DTE.encodeUtf8 $ "$" <> show n <> ".00") == pure (Money $ fromIntegral n)
prop_parseMoney_showed_negative_int :: Positive Int -> Bool
prop_parseMoney_showed_negative_int (Positive n) =
parseOnly parseMoney (DTE.encodeUtf8 $ "-$" <> show n <> ".00") == pure (Money $ fromIntegral (-n))
prop_parseMoney_zero :: Bool
prop_parseMoney_zero =
parseOnly parseMoney "$0.00" == pure 0
prop_parseMoney_showed_positive_cents :: Positive Int -> Bool
prop_parseMoney_showed_positive_cents (Positive n) =
parseOnly parseMoney (DTE.encodeUtf8 $ toText centsStr) == pure (Money $ fromIntegral n / 100)
where
cents = n `mod` 100
centsStr :: String = printf "$0.%02d" cents
prop_parseMoney_thousands :: Positive Int -> Bool
prop_parseMoney_thousands (Positive n) =
parseOnly parseMoney (DTE.encodeUtf8 $ "$" <> show n <> ",000.00") == pure (Money $ fromIntegral n * 1_000)
-- new report uses parentheses for encoding negative values
-- lol
prop_parseMoney_parentheses :: Positive Int -> Bool
prop_parseMoney_parentheses (Positive n) =
parseOnly parseMoney (DTE.encodeUtf8 $ "($" <> show n <> ".00)") == pure (Money $ fromIntegral n * (-1))
prop_parseMoney_parentheses_negative :: Positive Int -> Bool
prop_parseMoney_parentheses_negative (Positive n) =
parseOnly parseMoney (DTE.encodeUtf8 $ "(-$" <> show n <> ".00)") == pure (Money $ fromIntegral n)