packages feed

openapi3-code-generator-0.1.0.6: test/OpenAPI/Generate/Internal/UtilSpec.hs

module OpenAPI.Generate.Internal.UtilSpec where

import qualified Data.Char as Char
import Data.GenValidity.Text ()
import qualified Data.Text as T
import Data.Validity.Text ()
import OpenAPI.Generate.Internal.Util
import Test.Hspec
import Test.Validity

-- See https://www.haskell.org/onlinereport/lexemes.html § 2.4
isValidVarId :: String -> Bool
isValidVarId "" = False
isValidVarId "case" = False
isValidVarId "class" = False
isValidVarId "data" = False
isValidVarId "default" = False
isValidVarId "deriving" = False
isValidVarId "do" = False
isValidVarId "else" = False
isValidVarId "if" = False
isValidVarId "import" = False
isValidVarId "in" = False
isValidVarId "infix" = False
isValidVarId "infixl" = False
isValidVarId "infixr" = False
isValidVarId "instance" = False
isValidVarId "let" = False
isValidVarId "module" = False
isValidVarId "newtype" = False
isValidVarId "of" = False
isValidVarId "then" = False
isValidVarId "type" = False
isValidVarId "where" = False
isValidVarId (x : xs) = isValidSmall x && isValidSuffix xs

isValidConId :: String -> Bool
isValidConId "" = False
isValidConId (x : xs) = isValidLarge x && isValidSuffix xs

isValidSmall :: Char -> Bool
isValidSmall x = x == '_' || Char.isLower x

isValidLarge :: Char -> Bool
isValidLarge = Char.isUpper

isValidSuffix :: String -> Bool
isValidSuffix = all (\x -> isValidSmall x || isValidLarge x || Char.isDigit x || x == '\'')

spec :: Spec
spec = do
  describe "splitOn" $ do
    it "should split string into pieces" $
      splitOn 'a' "abcabca" `shouldBe` ["", "bc", "bc", ""]
    it "should have one split more than elements to split on"
      $ forAllValid
      $ \(x, list) ->
        length (splitOn (x :: Char) list)
          == length (filter (== x) list) + 1
  describe "haskellifyText" $ do
    it "uppercase without CamelCase"
      $ forAllValid
      $ isValidConId . haskellifyText False True
    it "uppercase with CamelCase"
      $ forAllValid
      $ isValidConId . haskellifyText True True
    it "lowercase without CamelCase"
      $ forAllValid
      $ isValidVarId . haskellifyText False False
    it "lowercase with CamelCase"
      $ forAllValid
      $ isValidVarId . haskellifyText True False
  describe "transformToModuleName"
    $ it "should be valid module name"
    $ forAllValid
    $ isValidConId . T.unpack . transformToModuleName