packages feed

Jikka-5.5.0.0: test/Jikka/Core/Convert/CumulativeSumSpec.hs

{-# LANGUAGE OverloadedStrings #-}

module Jikka.Core.Convert.CumulativeSumSpec
  ( spec,
  )
where

import Jikka.Common.Alpha
import Jikka.Common.Error
import Jikka.Core.Convert.CumulativeSum (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" $ do
    let prog =
          parseProgram'
            [ "let rec f: int =", -- Remove distinction between top-level and non-top-level.
              "    let a: int list = range 1000",
              "    in let n: int = 500",
              "    in sum (map (fun i -> a[i]) (range n))",
              "in f"
            ]
    let expected =
          parseProgram'
            [ "let rec f: int =",
              "    let a: int list = range 1000",
              "    in let n: int = 500",
              "    in let $0 = scanl (+) 0 a",
              "    in $0[n]",
              "in f"
            ]
    (formatProgram <$> run' prog) `shouldBe` Right (formatProgram expected)