packages feed

haskoin-wallet-0.9.4: test/Haskoin/Wallet/AmountsSpec.hs

{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}

module Haskoin.Wallet.AmountsSpec where

import Haskoin.Wallet.Amounts
import Haskoin.Wallet.TestUtils (genNatural)
import Test.Hspec (Spec, describe, it, shouldBe)
import Test.Hspec.QuickCheck (prop)
import Test.QuickCheck (Arbitrary (arbitrary), elements, forAll)

spec :: Spec
spec =
  describe "Amount parser" $ do
    prop "readAmount . showAmount identity" $
      forAll genNatural $ \n unit ->
        readAmount unit (showAmount unit n) `shouldBe` Just n
    prop "readIntegerAmount . showIntegerAmount identity" $ \i unit ->
      readIntegerAmount unit (showIntegerAmount unit i) `shouldBe` Just i
    it "Satoshi amounts vectors" $ do
      readAmount UnitSatoshi "0" `shouldBe` Just 0
      readAmount UnitSatoshi "0000" `shouldBe` Just 0
      readAmount UnitSatoshi "0.0" `shouldBe` Nothing
      readAmount UnitSatoshi "8" `shouldBe` Just 8
      readAmount UnitSatoshi "100" `shouldBe` Just 100
      readAmount UnitSatoshi "1234567890" `shouldBe` Just 1234567890
      readAmount UnitSatoshi "1'234'567'890" `shouldBe` Just 1234567890
      readAmount UnitSatoshi "1 234 567 890" `shouldBe` Just 1234567890
      readAmount UnitSatoshi "1_234_567_890" `shouldBe` Just 1234567890
    it "Bit amounts vectors" $ do
      readAmount UnitBit "0" `shouldBe` Just 0
      readAmount UnitBit "0000" `shouldBe` Just 0
      readAmount UnitBit "0.0" `shouldBe` Just 0
      readAmount UnitBit "0.00" `shouldBe` Just 0
      readAmount UnitBit "0.000" `shouldBe` Nothing
      readAmount UnitBit "0.10" `shouldBe` Just 10
      readAmount UnitBit "0.1" `shouldBe` Just 10
      readAmount UnitBit "0.01" `shouldBe` Just 1
      readAmount UnitBit "1" `shouldBe` Just 100
      readAmount UnitBit "100" `shouldBe` Just 10000
      readAmount UnitBit "100.00" `shouldBe` Just 10000
      readAmount UnitBit "100.01" `shouldBe` Just 10001
      readAmount UnitBit "1234567890.9" `shouldBe` Just 123456789090
      readAmount UnitBit "1'234'567'890.90" `shouldBe` Just 123456789090
      readAmount UnitBit "1 234 567 890.90" `shouldBe` Just 123456789090
      readAmount UnitBit "1_234_567_890.90" `shouldBe` Just 123456789090
    it "Bitcoin amounts vectors" $ do
      readAmount UnitBitcoin "0" `shouldBe` Just 0
      readAmount UnitBitcoin "0000" `shouldBe` Just 0
      readAmount UnitBitcoin "0.0" `shouldBe` Just 0
      readAmount UnitBitcoin "0.00000000" `shouldBe` Just 0
      readAmount UnitBitcoin "0.000000000" `shouldBe` Nothing
      readAmount UnitBitcoin "0.1" `shouldBe` Just 10000000
      readAmount UnitBitcoin "0.1000" `shouldBe` Just 10000000
      readAmount UnitBitcoin "0.10000000" `shouldBe` Just 10000000
      readAmount UnitBitcoin "0.100000000" `shouldBe` Nothing
      readAmount UnitBitcoin "1" `shouldBe` Just 100000000
      readAmount UnitBitcoin "100" `shouldBe` Just 10000000000
      readAmount UnitBitcoin "1234567890.9" `shouldBe` Just 123456789090000000
      readAmount UnitBitcoin "1'234'567'890.9009"
        `shouldBe` Just 123456789090090000
      readAmount UnitBitcoin "1 234 567 890.9009"
        `shouldBe` Just 123456789090090000
      readAmount UnitBitcoin "1_234_567_890.9009"
        `shouldBe` Just 123456789090090000

instance Arbitrary AmountUnit where
  arbitrary = elements [UnitBitcoin, UnitBit, UnitSatoshi]