packages feed

hhlo-0.1.0.0: test/Test/IR/Builder.hs

{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeApplications #-}

module Test.IR.Builder where

import qualified Data.Text as T
import Test.Tasty
import Test.Tasty.HUnit

import HHLO.IR.AST
import HHLO.IR.Builder
import HHLO.IR.Pretty
import HHLO.Core.Types

tests :: TestTree
tests = testGroup "Builder"
    [ testCase "value ids are sequential" $ do
        let modu = moduleFromBuilder @'[2, 2] @'F32 "main"
                [ FuncArg "arg0" (TensorType [2, 2] F32)
                , FuncArg "arg1" (TensorType [2, 2] F32)
                ]
                $ do
                    x <- arg @'[2, 2] @'F32
                    y <- arg @'[2, 2] @'F32
                    let (Tensor v1) = x
                        (Tensor v2) = y
                    return $ Tensor (ValueId 42)  -- dummy, we just check ids
        let rendered = render modu
        assertBool "arg0 present" $ "%arg0" `T.isInfixOf` rendered
        assertBool "arg1 present" $ "%arg1" `T.isInfixOf` rendered
    , testCase "module has func.func wrapper" $ do
        let modu = moduleFromBuilder @'[2] @'F32 "test_fn"
                [ FuncArg "x" (TensorType [2] F32) ]
                $ do
                    x <- arg @'[2] @'F32
                    return x
        let rendered = render modu
        assertBool "module keyword" $ "module {" `T.isInfixOf` rendered
        assertBool "func.func keyword" $ "func.func @test_fn" `T.isInfixOf` rendered
        assertBool "return present" $ "return" `T.isInfixOf` rendered
    , testCase "single result type in signature" $ do
        let modu = moduleFromBuilder @'[3, 4] @'F32 "main"
                [ FuncArg "arg0" (TensorType [3, 4] F32) ]
                $ do
                    x <- arg
                    return x
        let rendered = render modu
        assertBool "return type" $ "-> tensor<3x4xf32>" `T.isInfixOf` rendered
    ]