packages feed

fortran-vars-0.3.1: test/BozConstantSpec.hs

-- TODO 2022-08-22 raehik: essentially obsoleted by
-- @Language.Fortran.AST.Literal.BozSpec@ in fortran-src

module BozConstantSpec
  ( spec
  )
where

import           Test.Hspec

import           Language.Fortran.Vars.BozConstant
                                                ( bozToInt2
                                                , bozToInt4
                                                , bozToInt8
                                                )
import           Language.Fortran.Vars.Types    ( ExpVal(..) )
import qualified Language.Fortran.AST.Literal.Boz      as AST

boz :: String -> AST.Boz
boz = AST.parseBoz

spec :: Spec
spec = describe "Boz Constant Conversion" $ do
  it "Mixed case BOZ constant conversions" $ do
    bozToInt2 (boz "'ffff'x") `shouldBe` Int (-1)
    bozToInt2 (boz "'FfFf'x") `shouldBe` Int (-1)
    bozToInt4 (boz "'FFFFFFFF'x") `shouldBe` Int (-1)

  it "BOZ constant to Integer*2" $ do
    bozToInt2 (boz "'1'x") `shouldBe` Int 1
    bozToInt2 (boz "'10'x") `shouldBe` Int 16
    bozToInt2 (boz "'7fff'x") `shouldBe` Int 32767
    bozToInt2 (boz "'8000'x") `shouldBe` Int (-32768)
    bozToInt2 (boz "'ffff'x") `shouldBe` Int (-1)

  it "BOZ constant to Integer*4" $ do
    bozToInt4 (boz "'1'x") `shouldBe` Int 1
    bozToInt4 (boz "'10'x") `shouldBe` Int 16
    bozToInt4 (boz "'7fff'x") `shouldBe` Int 32767
    bozToInt4 (boz "'8000'x") `shouldBe` Int 32768
    bozToInt4 (boz "'ffff'x") `shouldBe` Int 65535
    bozToInt4 (boz "'7fffffff'x") `shouldBe` Int 2147483647
    bozToInt4 (boz "'80000000'x") `shouldBe` Int (-2147483648)
    bozToInt4 (boz "'ffffffff'x") `shouldBe` Int (-1)

  it "BOZ constant to Integer*8" $ do
    bozToInt8 (boz "'1'x") `shouldBe` Int 1
    bozToInt8 (boz "'10'x") `shouldBe` Int 16
    bozToInt8 (boz "'7fff'x") `shouldBe` Int 32767
    bozToInt8 (boz "'8000'x") `shouldBe` Int 32768
    bozToInt8 (boz "'ffff'x") `shouldBe` Int 65535
    bozToInt8 (boz "'7fffffff'x") `shouldBe` Int 2147483647
    bozToInt8 (boz "'80000000'x") `shouldBe` Int 2147483648
    bozToInt8 (boz "'ffffffff'x") `shouldBe` Int 4294967295
    bozToInt8 (boz "'7fffffffffffffff'x") `shouldBe` Int 9223372036854775807
    bozToInt8 (boz "'8000000000000000'x") `shouldBe` Int (-9223372036854775808)
    bozToInt8 (boz "'ffffffffffffffff'x") `shouldBe` Int (-1)