Jikka-5.4.0.0: test/Jikka/Core/Convert/PropagateModSpec.hs
{-# LANGUAGE OverloadedStrings #-}
module Jikka.Core.Convert.PropagateModSpec
( spec,
)
where
import Jikka.Common.Alpha
import Jikka.Common.Error
import Jikka.Core.Convert.PropagateMod (run)
import qualified Jikka.Core.Convert.TypeInfer as TypeInfer
import Jikka.Core.Format (formatProgram)
import Jikka.Core.Language.Expr
import Jikka.Core.Parse (parseProgram)
import Test.Hspec
run' :: Program -> Either Error Program
run' = flip evalAlphaT 0 . run
parseProgram' :: [String] -> Program
parseProgram' = fromSuccess . flip evalAlphaT 100 . (TypeInfer.run <=< parseProgram . unlines)
spec :: Spec
spec = describe "run" $ do
it "works over a function" $ do
let prog =
parseProgram'
[ "fun y ->",
" (fun x -> x * x + x) y % 1000000007"
]
let expected =
parseProgram'
[ "fun y ->",
" (fun x$0 -> modplus (x$0 % 1000000007) (modmult (x$0 % 1000000007) (x$0 % 1000000007) 1000000007) 1000000007) y"
]
(formatProgram <$> run' prog) `shouldBe` Right (formatProgram expected)
it "works with sum" $ do
let prog =
parseProgram'
[ "fun xs ->",
" sum (map (fun x -> 2 * x) xs) % 1000000007"
]
let expected =
parseProgram'
[ "fun xs ->",
" modsum (map (fun x$0 -> modmult (x$0 % 1000000007) 2 1000000007) xs) 1000000007"
]
(formatProgram <$> run' prog) `shouldBe` Right (formatProgram expected)