packages feed

hup-0.2.0.0: test/Distribution/Hup/Parse/Test.hs


{- |

Support code for testing Distribution.Hup.Parse 

-}
module Distribution.Hup.Parse.Test where

import Data.List                  (dropWhileEnd,isSuffixOf,stripPrefix
                                  ,intercalate)
import Data.ByteString.Lazy.Char8 (pack)
import Test.QuickCheck

import Distribution.Hup.Parse


arbWord = do
  len <- choose (1, 10)
  vectorOf len $
      oneof [choose ('a', 'z')
           ,choose ('A', 'Z')]


arbName :: Gen String
arbName = do
  len <- choose (1, 4)
  intercalate "-" <$> vectorOf len arbWord

arbVersion = do
  numComponents <- choose (1,10)
  numbers <- vectorOf numComponents $ getNonNegative <$> 
                                      (arbitrary :: Gen (NonNegative Int))
  return $ intercalate "." $ map show numbers 

-- Generate an Upload, including an empty file contents.
arbUpload :: Gen Upload
arbUpload = do
  name   <- arbName
  ver    <- arbVersion
  isPack <- elements [IsPackage, IsDocumentation]
  isCand <- elements [NormalPkg, CandidatePkg]
  let pk   = Package name ver
      file = name ++ "-" ++ ver ++ 
                if isPack == IsPackage
                then ".tar.gz"
                else "-docs.tar.gz"
  return $ Upload pk file (Just $ pack "") isPack isCand

prop_parseTgzFilename_roundtripsOK  = 
  forAll arbUpload $ \upl -> 
    let 
         parsed :: Either String (IsDocumentation, Package)  
         parsed = (parseTgzFilename' $ fileToUpload upl )  

    in case parsed of
            Right (isDoc, Package parsedName parsedVer) -> 
                  isDoc       == uploadType upl 
              &&  parsedName  == packageName    ( package upl)
              &&  parsedVer   == packageVersion ( package upl)
            Left  msg -> 
                  False