hark-0.2: test/VersionParserTest.hs
{-----------------------------------------------------------------
this module tests the DEPEND parsing facility
(c) 2008 Markus Dittrich
This program is free software; you can redistribute it
and/or modify it under the terms of the GNU General Public
License Version 3 as published by the Free Software Foundation.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License Version 3 for more details.
You should have received a copy of the GNU General Public
License along with this program; if not, write to the Free
Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
--------------------------------------------------------------------}
module VersionParserTest ( version_parse_tester
, version_compare_tester
) where
-- basic imports
import qualified Data.ByteString as B(ByteString)
import qualified Data.ByteString.Char8 as BC
import Control.Monad
import Prelude
import System.IO
-- local imports
import Helpers.PrettyPrint
import Helpers.ByteString
import TestHelpers
import Parsers.Version
import Drivers.Version
--
-- main driver to test parsing of dependencies
--
version_parse_tester :: IO Bool
version_parse_tester = do
parseRes <- foldM check_version_parser True testParseVersions
return parseRes
--
-- check if a particular version string parser properly
-- into tokens
--
check_version_parser :: Bool -> VersionTestItem -> IO Bool
check_version_parser state item = do
-- short message
putColorStr Cyan $ "Testing version parser -- "
putColorBStr White $ (versionString item)
putColorStr Cyan $ " ... "
-- parse and compare
let parseResult = split_version $ versionString item
if parseResult == parsedVersion item
then do
print_success
return (state && True)
else do
print_failure
return (state && False)
--
-- main driver for checking if comparing versions works
--
version_compare_tester :: IO Bool
version_compare_tester = do
compRes <- foldM check_version_comparator True testCompVersions
return compRes
--
-- check if comparing two particular versions leads to the
-- expected results
--
check_version_comparator :: Bool -> VersionCompareItem -> IO Bool
check_version_comparator state item = do
-- short message
putColorStr Cyan $ "Testing version comparator -- "
putColorBStr White $ (firstV item)
putColorStr Magenta $ " <> "
putColorBStr White $ (secondV item)
putColorStr Cyan $ " ... "
-- compare
let compResult = (comparator item) (firstV item) (secondV item)
if compResult == (result item)
then do
print_success
return (state && True)
else do
print_failure
return (state && False)
------------------------------------------------------------------
-- beginning of section describing test and expected results
--
-- NOTE: To add a new test simply define a ref_<name>
-- ReferenceData structure with the expected values and add
-- the new test to dependTests with the search string supplied
-- as a String
------------------------------------------------------------------
--
-- define small helper data type that holds a versions
-- item as ByteString as well as a parsed list of VersionTok
--
data VersionTestItem = VersionTestItem
{
versionString :: B.ByteString
, parsedVersion :: [VersionTok]
}
--
-- a few small helpers to simplify live
--
emptyTok :: VersionTok
emptyTok = NumTok $ BC.pack ""
zeroTok :: VersionTok
zeroTok = NumTok $ BC.pack "0"
oneTok :: VersionTok
oneTok = NumTok $ BC.pack "1"
twoTok :: VersionTok
twoTok = NumTok $ BC.pack "2"
fourTok :: VersionTok
fourTok = NumTok $ BC.pack "4"
aTok :: VersionTok
aTok = NumTok $ BC.pack "a"
bTok :: VersionTok
bTok = NumTok $ BC.pack "b"
globTok :: VersionTok
globTok = NumTok glob
--
-- test data sets to check correct parsing of version
-- strings
--
-- test parser data 1
version1 :: VersionTestItem
version1 = VersionTestItem
{
versionString = BC.pack "1.1.2"
, parsedVersion = [oneTok, oneTok, twoTok]
}
-- test parser data 2
version2 :: VersionTestItem
version2 = VersionTestItem
{
versionString = BC.pack "1.1.2.1"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok]
}
-- test parser data 3
version3 :: VersionTestItem
version3 = VersionTestItem
{
versionString = BC.pack "1.1.2.1a"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, aTok]
}
-- test parser data 4
version4 :: VersionTestItem
version4 = VersionTestItem
{
versionString = BC.pack "1.1.2.1b"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, bTok]
}
-- test parser data 5
version5 :: VersionTestItem
version5 = VersionTestItem
{
versionString = BC.pack "1.1.2.1b-alpha"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, bTok,
Suffix Alpha, emptyTok]
}
-- test parser data 6
version6 :: VersionTestItem
version6 = VersionTestItem
{
versionString = BC.pack "1.1.2.1b-beta"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, bTok,
Suffix Beta, emptyTok]
}
-- test parser data 7
version7 :: VersionTestItem
version7 = VersionTestItem
{
versionString = BC.pack "1.1.2.1b-beta2"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, bTok,
Suffix Beta, twoTok]
}
-- test parser data 8
version8 :: VersionTestItem
version8 = VersionTestItem
{
versionString = BC.pack "1.1.2.1b-beta2-pre"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, bTok,
Suffix Beta, twoTok, Suffix Pre, emptyTok]
}
-- test parser data 9
version9 :: VersionTestItem
version9 = VersionTestItem
{
versionString = BC.pack "1.1.2.1b-beta2-p"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, bTok,
Suffix Beta, twoTok, Suffix P, emptyTok]
}
-- test parser data 10
version10 :: VersionTestItem
version10 = VersionTestItem
{
versionString = BC.pack "1.1.2.1b-beta2-p-r1"
, parsedVersion = [oneTok, oneTok, twoTok, oneTok, bTok,
Suffix Beta, twoTok, Suffix P, emptyTok, Revision, oneTok]
}
-- test parser data 11
version11 :: VersionTestItem
version11 = VersionTestItem
{
versionString = BC.pack "2.20081023a-r1"
, parsedVersion = [twoTok, NumTok $ BC.pack "20081023", aTok,
Revision, oneTok]
}
-- test parser data 12
version12 :: VersionTestItem
version12 = VersionTestItem
{
versionString = BC.pack "2.20081123b"
, parsedVersion = [twoTok, NumTok $ BC.pack "20081123", bTok]
}
-- test parser data 13
version13 :: VersionTestItem
version13 = VersionTestItem
{
versionString = BC.pack "1.22.2"
, parsedVersion = [oneTok, NumTok $ BC.pack "22", twoTok]
}
-- test parser data 14
version14 :: VersionTestItem
version14 = VersionTestItem
{
versionString = BC.pack "1.4.2"
, parsedVersion = [oneTok, NumTok $ BC.pack "4", twoTok]
}
-- test parser data 15
version15 :: VersionTestItem
version15 = VersionTestItem
{
versionString = BC.pack "1.1.2.0"
, parsedVersion = [oneTok, oneTok, twoTok, zeroTok]
}
-- test parser data 16
version16 :: VersionTestItem
version16 = VersionTestItem
{
versionString = BC.pack "1.1.2.0.0.0"
, parsedVersion = [oneTok, oneTok, twoTok, zeroTok, zeroTok, zeroTok]
}
-- test parser data 17
version17 :: VersionTestItem
version17 = VersionTestItem
{
versionString = BC.pack "1.2*"
, parsedVersion = [oneTok, twoTok, globTok]
}
-- test parser data 18
version18 :: VersionTestItem
version18 = VersionTestItem
{
versionString = BC.pack "1.1*"
, parsedVersion = [oneTok, oneTok, globTok]
}
-- test parser data 19
version19 :: VersionTestItem
version19 = VersionTestItem
{
versionString = BC.pack "2*"
, parsedVersion = [twoTok, globTok]
}
-- test parser data 20
version20 :: VersionTestItem
version20 = VersionTestItem
{
versionString = BC.pack "1.1.2-r5"
, parsedVersion = [oneTok, oneTok, twoTok, Revision,
NumTok $ BC.pack "5"]
}
-- test parser data 21
version21 :: VersionTestItem
version21 = VersionTestItem
{
versionString = BC.pack "2.20081023a-r4"
, parsedVersion = [twoTok, NumTok $ BC.pack "20081023", aTok,
Revision, fourTok]
}
-- list all version string to be tested
testParseVersions :: [VersionTestItem]
testParseVersions = [version1, version2, version3, version4, version5,
version6, version7, version8, version9, version10,
version11, version12, version13, version14,
version15, version16, version17, version18,
version19, version20, version21]
--
-- test data sets for checking correct comparison of version
-- string
--
--
-- helper data structure
--
data VersionCompareItem = VersionCompareItem
{
firstV :: B.ByteString
, secondV :: B.ByteString
, comparator :: B.ByteString -> B.ByteString -> Bool
, result :: Bool
}
-- test compare data 1
versionComp1 :: VersionCompareItem
versionComp1 = VersionCompareItem
{
firstV = versionString version1
, secondV = versionString version2
, comparator = is_larger
, result = False
}
-- test compare data 2
versionComp2 :: VersionCompareItem
versionComp2 = VersionCompareItem
{
firstV = versionString version1
, secondV = versionString version2
, comparator = is_smaller
, result = True
}
-- test compare data 3
versionComp3 :: VersionCompareItem
versionComp3 = VersionCompareItem
{
firstV = versionString version2
, secondV = versionString version3
, comparator = is_smaller
, result = True
}
-- test compare data 4
versionComp4 :: VersionCompareItem
versionComp4 = VersionCompareItem
{
firstV = versionString version3
, secondV = versionString version2
, comparator = is_larger
, result = True
}
-- test compare data 5
versionComp5 :: VersionCompareItem
versionComp5 = VersionCompareItem
{
firstV = versionString version3
, secondV = versionString version2
, comparator = is_larger_equal
, result = True
}
-- test compare data 6
versionComp6 :: VersionCompareItem
versionComp6 = VersionCompareItem
{
firstV = versionString version4
, secondV = versionString version3
, comparator = is_larger
, result = True
}
-- test compare data 7
versionComp7 :: VersionCompareItem
versionComp7 = VersionCompareItem
{
firstV = versionString version5
, secondV = versionString version4
, comparator = is_larger
, result = True
}
-- test compare data 8
versionComp8 :: VersionCompareItem
versionComp8 = VersionCompareItem
{
firstV = versionString version6
, secondV = versionString version5
, comparator = is_larger
, result = True
}
-- test compare data 9
versionComp9 :: VersionCompareItem
versionComp9 = VersionCompareItem
{
firstV = versionString version7
, secondV = versionString version6
, comparator = is_larger
, result = True
}
-- test compare data 10
versionComp10 :: VersionCompareItem
versionComp10 = VersionCompareItem
{
firstV = versionString version8
, secondV = versionString version7
, comparator = is_larger
, result = True
}
-- test compare data 11
versionComp11 :: VersionCompareItem
versionComp11 = VersionCompareItem
{
firstV = versionString version9
, secondV = versionString version8
, comparator = is_larger
, result = True
}
-- test compare data 12
versionComp12 :: VersionCompareItem
versionComp12 = VersionCompareItem
{
firstV = versionString version10
, secondV = versionString version9
, comparator = is_larger
, result = True
}
-- test compare data 13
versionComp13 :: VersionCompareItem
versionComp13 = VersionCompareItem
{
firstV = versionString version7
, secondV = versionString version8
, comparator = is_smaller
, result = True
}
-- test compare data 14
versionComp14 :: VersionCompareItem
versionComp14 = VersionCompareItem
{
firstV = versionString version3
, secondV = versionString version7
, comparator = is_larger
, result = False
}
-- test compare data 15
versionComp15 :: VersionCompareItem
versionComp15 = VersionCompareItem
{
firstV = versionString version6
, secondV = versionString version9
, comparator = is_smaller
, result = True
}
-- test compare data 16
versionComp16 :: VersionCompareItem
versionComp16 = VersionCompareItem
{
firstV = versionString version4
, secondV = versionString version10
, comparator = is_smaller
, result = True
}
-- test compare data 17
versionComp17 :: VersionCompareItem
versionComp17 = VersionCompareItem
{
firstV = versionString version11
, secondV = versionString version12
, comparator = is_smaller
, result = True
}
-- test compare data 18
versionComp18 :: VersionCompareItem
versionComp18 = VersionCompareItem
{
firstV = versionString version11
, secondV = versionString version1
, comparator = is_larger
, result = True
}
-- test compare data 19
versionComp19 :: VersionCompareItem
versionComp19 = VersionCompareItem
{
firstV = versionString version13
, secondV = versionString version14
, comparator = is_larger
, result = True
}
-- test compare data 20
versionComp20 :: VersionCompareItem
versionComp20 = VersionCompareItem
{
firstV = versionString version1
, secondV = versionString version15
, comparator = is_larger_equal
, result = True
}
-- test compare data 21
versionComp21 :: VersionCompareItem
versionComp21 = VersionCompareItem
{
firstV = versionString version15
, secondV = versionString version16
, comparator = is_larger_equal
, result = True
}
-- test compare data 22
versionComp22 :: VersionCompareItem
versionComp22 = VersionCompareItem
{
firstV = versionString version16
, secondV = versionString version17
, comparator = is_smaller
, result = True
}
-- test compare data 23
versionComp23 :: VersionCompareItem
versionComp23 = VersionCompareItem
{
firstV = versionString version14
, secondV = versionString version17
, comparator = is_larger_equal
, result = True
}
-- test compare data 24
versionComp24 :: VersionCompareItem
versionComp24 = VersionCompareItem
{
firstV = versionString version16
, secondV = versionString version18
, comparator = is_equal
, result = True
}
-- test compare data 25
versionComp25 :: VersionCompareItem
versionComp25 = VersionCompareItem
{
firstV = versionString version18
, secondV = versionString version2
, comparator = is_equal
, result = True
}
-- test compare data 26
versionComp26 :: VersionCompareItem
versionComp26 = VersionCompareItem
{
firstV = versionString version18
, secondV = versionString version4
, comparator = is_equal
, result = True
}
-- test compare data 27
versionComp27 :: VersionCompareItem
versionComp27 = VersionCompareItem
{
firstV = versionString version18
, secondV = versionString version7
, comparator = is_equal
, result = True
}
-- test compare data 28
versionComp28 :: VersionCompareItem
versionComp28 = VersionCompareItem
{
firstV = versionString version18
, secondV = versionString version8
, comparator = is_equal
, result = True
}
-- test compare data 29
versionComp29 :: VersionCompareItem
versionComp29 = VersionCompareItem
{
firstV = versionString version17
, secondV = versionString version2
, comparator = is_larger
, result = True
}
-- test compare data 30
versionComp30 :: VersionCompareItem
versionComp30 = VersionCompareItem
{
firstV = versionString version17
, secondV = versionString version4
, comparator = is_larger
, result = True
}
-- test compare data 31
versionComp31 :: VersionCompareItem
versionComp31 = VersionCompareItem
{
firstV = versionString version17
, secondV = versionString version7
, comparator = is_larger
, result = True
}
-- test compare data 32
versionComp32 :: VersionCompareItem
versionComp32 = VersionCompareItem
{
firstV = versionString version17
, secondV = versionString version8
, comparator = is_larger
, result = True
}
-- test compare data 33
versionComp33 :: VersionCompareItem
versionComp33 = VersionCompareItem
{
firstV = versionString version19
, secondV = versionString version12
, comparator = is_equal
, result = True
}
-- test compare data 34
versionComp34 :: VersionCompareItem
versionComp34 = VersionCompareItem
{
firstV = versionString version19
, secondV = versionString version11
, comparator = is_equal
, result = True
}
-- test compare data 35
versionComp35 :: VersionCompareItem
versionComp35 = VersionCompareItem
{
firstV = versionString version2
, secondV = versionString version17
, comparator = is_smaller
, result = True
}
-- test compare data 36
versionComp36 :: VersionCompareItem
versionComp36 = VersionCompareItem
{
firstV = versionString version4
, secondV = versionString version17
, comparator = is_smaller
, result = True
}
-- test compare data 37
versionComp37 :: VersionCompareItem
versionComp37 = VersionCompareItem
{
firstV = versionString version5
, secondV = versionString version17
, comparator = is_smaller
, result = True
}
-- test compare data 38
versionComp38 :: VersionCompareItem
versionComp38 = VersionCompareItem
{
firstV = versionString version9
, secondV = versionString version17
, comparator = is_smaller
, result = True
}
-- test compare data 39
versionComp39 :: VersionCompareItem
versionComp39 = VersionCompareItem
{
firstV = versionString version20
, secondV = versionString version1
, comparator = is_same_rev_class
, result = True
}
-- test compare data 40
versionComp40 :: VersionCompareItem
versionComp40 = VersionCompareItem
{
firstV = versionString version20
, secondV = versionString version11
, comparator = is_same_rev_class
, result = False
}
-- test compare data 41
versionComp41 :: VersionCompareItem
versionComp41 = VersionCompareItem
{
firstV = versionString version21
, secondV = versionString version11
, comparator = is_same_rev_class
, result = True
}
-- list all version comparison tests to be run
testCompVersions :: [VersionCompareItem]
testCompVersions = [versionComp1, versionComp2, versionComp3,
versionComp4, versionComp5, versionComp6, versionComp7,
versionComp8, versionComp9, versionComp10, versionComp11,
versionComp12, versionComp13, versionComp14, versionComp15,
versionComp16, versionComp17, versionComp18, versionComp19,
versionComp20, versionComp21, versionComp22, versionComp23,
versionComp24, versionComp25, versionComp26, versionComp27,
versionComp28, versionComp29, versionComp30, versionComp31,
versionComp32, versionComp33, versionComp34, versionComp35,
versionComp36, versionComp37, versionComp38, versionComp39,
versionComp40, versionComp41]
------------------------------------------------------------------
-- end of section describing test and expected results
------------------------------------------------------------------