packages feed

futhark-0.7.3: unittests/Futhark/Representation/AST/Attributes/RearrangeTests.hs

module Futhark.Representation.AST.Attributes.RearrangeTests
       ( tests )
       where

import Control.Applicative

import Test.Tasty
import Test.Tasty.HUnit
import Test.Tasty.QuickCheck

import Prelude

import Futhark.Representation.AST.Attributes.Rearrange

tests :: TestTree
tests = testGroup "RearrangeTests" $
        isMapTransposeTests ++
        [isMapTransposeProp]

isMapTransposeTests :: [TestTree]
isMapTransposeTests =
  [ testCase (unwords ["isMapTranspose", show perm, "==", show dres]) $
    isMapTranspose perm @?= dres
  | (perm, dres) <- [ ([0,1,4,5,2,3], Just (2,2,2))
                    , ([1,0,4,5,2,3], Nothing)
                    , ([1,0], Just (0, 1, 1))
                    , ([0,2,1], Just (1, 1, 1))
                    , ([0,1,2], Nothing)
                    , ([1,0,2], Nothing)
                    ]
  ]

newtype Permutation = Permutation [Int]
                    deriving (Eq, Ord, Show)

instance Arbitrary Permutation where
  arbitrary = do
    Positive n <- arbitrary
    Permutation <$> shuffle [0..n-1]

isMapTransposeProp :: TestTree
isMapTransposeProp = testProperty "isMapTranspose corresponds to a map of transpose" prop
  where prop :: Permutation -> Bool
        prop (Permutation perm) =
          case isMapTranspose perm of
            Nothing -> True
            Just (r1, r2, r3) ->
              and [r1 >= 0,
                   r2 > 0,
                   r3 > 0,
                   r1 + r2 + r3 == length perm,
                   let (mapped, notmapped) =splitAt r1 perm
                       (pretrans, posttrans) = splitAt r2 notmapped
                   in mapped ++ posttrans ++ pretrans == [0..length perm-1]
                  ]