module Futhark.Analysis.DataDependenciesTests (tests) where

import Data.Map qualified as M
import Futhark.Analysis.DataDependencies
import Futhark.IR.SOACS
import Futhark.IR.SOACSTests ()
import Test.Tasty
import Test.Tasty.HUnit

names :: [VName] -> Names
names :: [VName] -> Names
names = [VName] -> Names
namesFromList

tests :: TestTree
tests :: TestTree
tests =
  TestName -> [TestTree] -> TestTree
testGroup
    TestName
"DataDependenciesTests"
    [ TestName -> [TestTree] -> TestTree
testGroup
        TestName
"lambdaDependencies"
        [ TestName -> Assertion -> TestTree
testCase TestName
"if" (Assertion -> TestTree) -> Assertion -> TestTree
forall a b. (a -> b) -> a -> b
$
            Dependencies -> Lambda SOACS -> [Names] -> [Names]
forall rep.
ASTRep rep =>
Dependencies -> Lambda rep -> [Names] -> [Names]
lambdaDependencies
              Dependencies
forall a. Monoid a => a
mempty
              (Lambda SOACS
"\\{x_0: i32} : {i32} -> {x_0}" :: Lambda SOACS)
              [[VName] -> Names
names [VName
"y_1"]]
              [Names] -> [Names] -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= [[VName] -> Names
names [VName
"y_1"]],
          TestName -> Assertion -> TestTree
testCase TestName
"flip" (Assertion -> TestTree) -> Assertion -> TestTree
forall a b. (a -> b) -> a -> b
$
            Dependencies -> Lambda SOACS -> [Names] -> [Names]
forall rep.
ASTRep rep =>
Dependencies -> Lambda rep -> [Names] -> [Names]
lambdaDependencies
              Dependencies
forall a. Monoid a => a
mempty
              (Lambda SOACS
"\\{x_0: i32, x_1: bool} : {bool, i32} -> {x_1, x_0}" :: Lambda SOACS)
              [[VName] -> Names
names [VName
"y_2"], [VName] -> Names
names [VName
"y_3"]]
              [Names] -> [Names] -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= [[VName] -> Names
names [VName
"y_3"], [VName] -> Names
names [VName
"y_2"]],
          TestName -> Assertion -> TestTree
testCase TestName
"add" (Assertion -> TestTree) -> Assertion -> TestTree
forall a b. (a -> b) -> a -> b
$
            Dependencies -> Lambda SOACS -> [Names] -> [Names]
forall rep.
ASTRep rep =>
Dependencies -> Lambda rep -> [Names] -> [Names]
lambdaDependencies
              Dependencies
forall a. Monoid a => a
mempty
              (Lambda SOACS
"\\{x_0: i32, x_1: i32} : {i32} -> let {x_2: i32} = add32(x_1, x_0) in {x_2}" :: Lambda SOACS)
              [[VName] -> Names
names [VName
"y_2"], [VName] -> Names
names [VName
"y_3"]]
              [Names] -> [Names] -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= [[VName] -> Names
names [VName
"y_3", VName
"y_2"]],
          TestName -> Assertion -> TestTree
testCase TestName
"outer" (Assertion -> TestTree) -> Assertion -> TestTree
forall a b. (a -> b) -> a -> b
$
            Dependencies -> Lambda SOACS -> [Names] -> [Names]
forall rep.
ASTRep rep =>
Dependencies -> Lambda rep -> [Names] -> [Names]
lambdaDependencies
              ([(VName, Names)] -> Dependencies
forall k a. Ord k => [(k, a)] -> Map k a
M.fromList [(VName
"x_1", [VName] -> Names
names [VName
"x_4"])])
              (Lambda SOACS
"\\{x_0: i32} : {i32} -> let {x_2: i32} = add32(x_1, x_0) in {x_2}" :: Lambda SOACS)
              [[VName] -> Names
names [VName
"y_2"]]
              [Names] -> [Names] -> Assertion
forall a. (Eq a, Show a, HasCallStack) => a -> a -> Assertion
@?= [[VName] -> Names
names [VName
"y_2", VName
"x_1"]]
        ]
    ]