packages feed

rpm-nvr-0.1.0: test/RPM/VersionSpec.hs

-- taken from codec-rpm-0.2.2 and based on rpm/tests/rpmvercmp.at
-- Copyright 2017-2018 Red Hat

module RPM.VersionSpec (verspec) where

import           Test.Hspec
import           Data.Foldable(forM_)
import           Data.RPM.VerCmp

-- can also call rpm vercmp():
-- `rpm --eval '%{lua: print(rpm.vercmp("$1", "$2"))}'`

verspec :: Spec
verspec = do
    describe "Data.RPM.Version.vercmp" $ do
        let vercmpCases = [
                         ("1.0", "1.0", EQ),
                         ("1.0", "2.0", LT),
                         ("2.0", "1.0", GT),

                         ("2.0.1", "2.0.1", EQ),
                         ("2.0", "2.0.1", LT),
                         ("2.0.1", "2.0", GT),

                         ("2.0.1a", "2.0.1a", EQ),
                         ("2.0.1a", "2.0.1", GT),
                         ("2.0.1", "2.0.1a", LT),

                         ("5.5p1", "5.5p1", EQ),
                         ("5.5p1", "5.5p2", LT),
                         ("5.5p2", "5.5p1", GT),

                         ("5.5p10", "5.5p10", EQ),
                         ("5.5p1", "5.5p10", LT),
                         ("5.5p10", "5.5p1", GT),

                         ("10xyz", "10.1xyz", LT),
                         ("10.1xyz", "10xyz", GT),

                         ("xyz10", "xyz10", EQ),
                         ("xyz10", "xyz10.1", LT),
                         ("xyz10.1", "xyz10", GT),

                         ("xyz.4", "xyz.4", EQ),
                         ("xyz.4", "8", LT),
                         ("8", "xyz.4", GT),
                         ("xyz.4", "2", LT),
                         ("2", "xyz.4", GT),

                         ("5.5p2", "5.6p1", LT),
                         ("5.6p1", "5.5p2", GT),

                         ("5.6p1", "6.5p1", LT),
                         ("6.5p1", "5.6p1", GT),

                         ("6.0.rc1", "6.0", GT),
                         ("6.0", "6.0.rc1", LT),

                         ("10b2", "10a1", GT),
                         ("10a2", "10b2", LT),

                         ("1.0aa", "1.0aa", EQ),
                         ("1.0a", "1.0aa", LT),
                         ("1.0aa", "1.0a", GT),

                         ("10.0001", "10.0001", EQ),
                         ("10.0001", "10.1", EQ),
                         ("10.1", "10.0001", EQ),
                         ("10.0001", "10.0039", LT),
                         ("10.0039", "10.0001", GT),

                         ("4.999.9", "5.0", LT),
                         ("5.0", "4.999.9", GT),

                         ("20101121", "20101121", EQ),
                         ("20101121", "20101122", LT),
                         ("20101122", "20101121", GT),

                         ("2_0", "2_0", EQ),
                         ("2.0", "2_0", EQ),
                         ("2_0", "2.0", EQ),

                         -- RhBug:178798 case
                         ("a", "a", EQ),
                         ("a+", "a+", EQ),
                         ("a+", "a_", EQ),
                         ("a_", "a+", EQ),
                         ("+a", "+a", EQ),
                         ("+a", "_a", EQ),
                         ("_a", "+a", EQ),
                         ("+_", "+_", EQ),
                         ("_+", "+_", EQ),
                         ("_+", "_+", EQ),
                         ("+", "_", EQ),
                         ("_", "+", EQ),

                         -- Basic testcases for tilde sorting
                         ("1.0~rc1", "1.0~rc1", EQ),
                         ("1.0~rc1", "1.0", LT),
                         ("1.0", "1.0~rc1", GT),
                         ("1.0~rc1", "1.0~rc2", LT),
                         ("1.0~rc2", "1.0~rc1", GT),
                         ("1.0~rc1~git123", "1.0~rc1~git123", EQ),
                         ("1.0~rc1~git123", "1.0~rc1", LT),
                         ("1.0~rc1", "1.0~rc1~git123", GT),

                         -- Basic testcases for caret sorting
                         ("1.0^", "1.0^", EQ),
                         ("1.0^", "1.0", GT),
                         ("1.0", "1.0^", LT),
                         ("1.0^git1", "1.0^git1", EQ),
                         ("1.0^git1", "1.0", GT),
                         ("1.0", "1.0^git1", LT),
                         ("1.0^git1", "1.0^git2", LT),
                         ("1.0^git2", "1.0^git1", GT),
                         ("1.0^git1", "1.01", LT),
                         ("1.01", "1.0^git1", GT),
                         ("1.0^20160101", "1.0^20160101", EQ),
                         ("1.0^20160101", "1.0.1", LT),
                         ("1.0.1", "1.0^20160101", GT),
                         ("1.0^20160101^git1", "1.0^20160101^git1", EQ),
                         ("1.0^20160102", "1.0^20160101^git1", GT),
                         ("1.0^20160101^git1", "1.0^20160102", LT),

                         -- Basic testcases for tilde and caret sorting
                         ("1.0~rc1^git1", "1.0~rc1^git1", EQ),
                         ("1.0~rc1^git1", "1.0~rc1", GT),
                         ("1.0~rc1", "1.0~rc1^git1", LT),
                         ("1.0^git1~pre", "1.0^git1~pre", EQ),
                         ("1.0^git1", "1.0^git1~pre", GT),
                         ("1.0^git1~pre", "1.0^git1", LT)
                         ]

        forM_ vercmpCases $ \(verA, verB, ord) ->
          it (verA ++ " " ++ show ord ++ " " ++ verB) $
          rpmVerCompare verA verB `shouldBe` ord