module Numeric.CompatSpec (main, spec) where
import Test.Hspec
import Numeric.Compat
main :: IO ()
main = hspec spec
spec :: Spec
spec = do
describe "showFFloatAlt" $ do
it "shows a RealFloat value, always using decimal notation" $
showFFloatAlt Nothing (12 :: Double) "" `shouldBe` "12.0"
it "allows to specify the number of decimal places" $
showFFloatAlt (Just 4) (12 :: Double) "" `shouldBe` "12.0000"
describe "showGFloatAlt" $ do
it "shows a RealFloat value, using decimal notation if the absolute value lies between 0.1 and 9,999,999" $
showGFloatAlt Nothing (12 :: Double) "" `shouldBe` "12.0"
it "shows a RealFloat value, using decimal notation and specifying the number of decimal places" $
showGFloatAlt (Just 4) (12 :: Double) "" `shouldBe` "12.0000"
it "shows a RealFloat value, using scientific notation if the absolute value falls outside of the range" $
showGFloatAlt Nothing (1234567890 :: Double) "" `shouldBe` "1.23456789e9"
it "shows a RealFloat value, using scientific notation and specifying the number of decimal places" $
showGFloatAlt (Just 4) (1234567890 :: Double) "" `shouldBe` "1.2346e9"
describe "readBin" $ do
it "parses an entirely binary Integer" $
readBinInteger "00000111" `shouldBe` [(7, "")]
it "does not parse a non-binary Integer" $
readBinInteger "-24" `shouldBe` []
it "parses the binary prefix of an Integer" $
readBinInteger "1011784372843778438743" `shouldBe` [(11,"784372843778438743")]
describe "showBin" $ do
it "shows small Ints in base 2" $
map (\ x -> showBinInt x "") [1..32] `shouldBe`
[ "1","10","11","100","101","110","111","1000","1001","1010","1011","1100","1101","1110","1111"
, "10000","10001","10010","10011","10100","10101","10110","10111","11000"
, "11001","11010","11011","11100","11101","11110","11111","100000" ]
it "shows a large Int in base 2" $
showBinInt 241324784 "" `shouldBe` "1110011000100101001011110000"
where
readBinInteger :: ReadS Integer
readBinInteger = readBin
showBinInt :: Int -> ShowS
showBinInt = showBin