packages feed

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

{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE OverloadedStrings #-}
{-# OPTIONS_GHC -Wno-ambiguous-fields -fno-warn-orphans #-}

module Haskoin.Wallet.VersionSpec where

import Haskoin.Wallet.TestUtils
import Haskoin.Wallet.Migration.SemVersion
import Test.Hspec
import Test.QuickCheck
import Test.Hspec.QuickCheck (prop)

instance Arbitrary SemVersion where
  arbitrary =
    oneof
      [ VerMajor <$> arbitraryNatural
      , VerMinor <$> arbitraryNatural <*> arbitraryNatural
      , VerPatch <$> arbitraryNatural <*> arbitraryNatural <*> arbitraryNatural
      ]

spec :: Spec
spec =
  describe "Semantic Version" $ do
    prop "parseSemVersion . verString identity" $
      forAll (arbitrary :: Gen SemVersion) $ \v ->
        parseSemVersion (verString v) `shouldBe` v
    it "passes equality tests" $ do
      parseSemVersion "0" == parseSemVersion "0" `shouldBe` True
      parseSemVersion "0" == parseSemVersion "0.9" `shouldBe` True
      parseSemVersion "0" == parseSemVersion "0.9.0" `shouldBe` True
      parseSemVersion "0.9" == parseSemVersion "0" `shouldBe` True
      parseSemVersion "0.9.0" == parseSemVersion "0" `shouldBe` True
      parseSemVersion "0.9" == parseSemVersion "0.9" `shouldBe` True
      parseSemVersion "0.9" == parseSemVersion "0.9.1" `shouldBe` True
      parseSemVersion "0.9.1" == parseSemVersion "0.9" `shouldBe` True
      parseSemVersion "0.9.1" == parseSemVersion "0.9.1" `shouldBe` True
      parseSemVersion "0" == parseSemVersion "1" `shouldBe` False
      parseSemVersion "0.9" == parseSemVersion "1" `shouldBe` False
      parseSemVersion "0.9.1" == parseSemVersion "1" `shouldBe` False
      parseSemVersion "1" == parseSemVersion "0.9" `shouldBe` False
      parseSemVersion "1" == parseSemVersion "0.9.1" `shouldBe` False
      parseSemVersion "0.9" == parseSemVersion "0.8" `shouldBe` False
      parseSemVersion "0.9" == parseSemVersion "0.8.1" `shouldBe` False
      parseSemVersion "0.8.1" == parseSemVersion "0.9" `shouldBe` False
      parseSemVersion "0.8.1" == parseSemVersion "0.8.2" `shouldBe` False
    it "passes toMajor and toMinor tests" $ do
      toMajor (parseSemVersion "0") `shouldBe` VerMajor 0
      toMajor (parseSemVersion "0.8") `shouldBe` VerMajor 0
      toMajor (parseSemVersion "0.8.1") `shouldBe` VerMajor 0
      toMinor (parseSemVersion "0.8") `shouldBe` VerMinor 0 8
      toMinor (parseSemVersion "0.8.1") `shouldBe` VerMinor 0 8