packages feed

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)