packages feed

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
  ]