miss-0: tests/Tests/RefNameSpec.hs
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE ImplicitParams #-}
-- stolen from https://github.com/git/git/blob/master/t/t1402-check-ref-format.sh
module Tests.RefNameSpec (tests) where
import Data.Git.RefName
import System.Posix.FilePath
import TestUtil
tests :: TestTree
tests = testGroup "RefName"
[ checkRefFormatSpec
, checkRemoteNameSpec
]
valid_ref :: Bool -> Bool -> RawFilePath -> Assertion
valid_ref allowOneLevel refSpecPattern name =
name `shouldSatisfy` checkRefFormat allowOneLevel refSpecPattern
invalid_ref :: Bool -> Bool -> RawFilePath -> Assertion
invalid_ref allowOneLevel refSpecPattern name =
name `shouldNotSatisfy` checkRefFormat allowOneLevel refSpecPattern
checkRefFormatSpec :: TestTree
checkRefFormatSpec = testGroup "checkRefFormat"
[ testCase "passes the tests from git" $ do
invalid_ref False False ""
invalid_ref False False "/"
invalid_ref True False "/"
-- invalid_ref !MINGW '/' --normalize
-- invalid_ref !MINGW '/' '--allow-onelevel --normalize'
valid_ref False False "foo/bar/baz"
-- valid_ref 'foo/bar/baz' --normalize
invalid_ref False False "refs///heads/foo"
-- valid_ref 'refs///heads/foo' --normalize
invalid_ref False False "heads/foo/"
invalid_ref False False "/heads/foo"
-- valid_ref !MINGW '/heads/foo' --normalize
invalid_ref False False "///heads/foo"
-- valid_ref '///heads/foo' --normalize
invalid_ref False False "./foo"
invalid_ref False False "./foo/bar"
invalid_ref False False "foo/./bar"
invalid_ref False False "foo/bar/."
invalid_ref False False ".refs/foo"
invalid_ref False False "refs/heads/foo."
invalid_ref False False "heads/foo..bar"
invalid_ref False False "heads/foo?bar"
valid_ref False False "foo./bar"
invalid_ref False False "heads/foo.lock"
invalid_ref False False "heads///foo.lock"
invalid_ref False False "foo.lock/bar"
invalid_ref False False "foo.lock///bar"
valid_ref False False "heads/foo@bar"
invalid_ref False False "heads/v@{ation"
invalid_ref False False "heads/foo\\bar"
invalid_ref False False "heads/foo\t"
invalid_ref False False "heads/foo\o177"
valid_ref False False "heads/fu\o303\o237"
valid_ref False True "heads/*foo/bar"
valid_ref False True "heads/foo*/bar"
valid_ref False True "heads/f*o/bar"
invalid_ref False True "heads/f*o*/bar"
invalid_ref False True "heads/foo*/bar*"
let ref1 = "foo"
invalid_ref False False ref1
valid_ref True False ref1
invalid_ref False True ref1
valid_ref True True ref1
-- invalid_ref "$ref" --normalize
-- valid_ref "$ref" '--allow-onelevel --normalize'
let ref2 = "foo/bar"
valid_ref False False ref2
valid_ref True False ref2
valid_ref False True ref2
valid_ref True False ref2
-- valid_ref "$ref" --normalize
let ref3 = "foo/*"
invalid_ref False False ref3
invalid_ref True False ref3
valid_ref False True ref3
valid_ref True True ref3
let ref4 = "*/foo"
invalid_ref False False ref4
invalid_ref True False ref4
valid_ref False True ref4
valid_ref True True ref4
-- invalid_ref "$ref" --normalize
-- valid_ref "$ref" '--refspec-pattern --normalize'
let ref5 = "foo/*/bar"
invalid_ref False False ref5
invalid_ref True False ref5
valid_ref False True ref5
valid_ref True True ref5
let ref6 = "*"
invalid_ref False False ref6
invalid_ref True False ref6
invalid_ref False True ref6
valid_ref True True ref6
let ref7 = "foo/*/*"
invalid_ref False True ref7
invalid_ref True True ref7
let ref8 = "*/foo/*"
invalid_ref False True ref8
invalid_ref True True ref8
let ref9 = "*/*/foo"
invalid_ref False True ref9
invalid_ref True True ref9
let refA = "/foo"
invalid_ref False False refA
invalid_ref True False refA
invalid_ref False True refA
invalid_ref True False refA
-- invalid_ref !MINGW "$ref" --normalize
-- valid_ref !MINGW "$ref" '--allow-onelevel --normalize'
-- invalid_ref !MINGW "$ref" '--refspec-pattern --normalize'
-- valid_ref !MINGW "$ref" '--refspec-pattern --allow-onelevel --normalize'
]
checkRemoteNameSpec :: TestTree
checkRemoteNameSpec = testGroup "checkRemoteName"
[ testCase "rejects \"\"" $ "" `shouldNotSatisfy` checkRemoteName
, testCase "rejects \".\"" $ "." `shouldNotSatisfy` checkRemoteName
, testCase "rejects \"..\"" $ ".." `shouldNotSatisfy` checkRemoteName
, testCase "rejects any '/'" $ "foo/bar" `shouldNotSatisfy` checkRemoteName
]