{-# 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 ]