packages feed

javelin-0.1.0.0: test/Test/Data/Series/Index.hs

module Test.Data.Series.Index (tests) where

import qualified Data.Series.Index    as Index
import qualified Data.Series.Index.Internal as Index.Internal
import qualified Data.Set             as Set
import qualified Data.Vector          as Vector

import           Hedgehog             ( property, forAll, tripping, assert, (===) )
import qualified Hedgehog.Gen         as Gen
import qualified Hedgehog.Range       as Range


import           Test.Tasty           ( testGroup, TestTree ) 
import           Test.Tasty.Hedgehog  ( testProperty )


tests :: TestTree
tests = testGroup "Data.Series.Index" [ testPropRange
                                      , testPropFromToSet
                                      , testPropFromToList
                                      , testPropFromToAscList
                                      , testPropFromToVector
                                      , testPropFromToAscVector
                                      , testPropMemberNotMember
                                      , testPropFilter
                                      ]


testPropRange :: TestTree
testPropRange = testProperty "range always includes the start, and all elements less than/equal to end" $ property $ do
    start <- forAll $ Gen.int (Range.linear 0 50)
    end   <- forAll $ Gen.int (Range.linear 51 100)
    step  <- forAll $ Gen.int (Range.linear 1 5)

    let ix = Index.range (+step) start end 

    assert $ start `Index.member` ix
    assert $ maximum ix <= end

    if (end - start) `mod` step == 0
        then assert (end `Index.member` ix)
        else assert (end `Index.notMember` ix)


testPropFromToSet :: TestTree
testPropFromToSet = testGroup "conversion to/from Set" 
    [ testProperty "fromSet / toSet" $ property $ do
        ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
        tripping (Set.fromList ms) Index.fromSet (Just . Index.toSet)
    , testProperty "toIndex / fromIndex" $ property $ do
        ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
        tripping (Set.fromList ms) (Index.toIndex :: Set.Set (Char, Char) -> Index.Index (Char, Char)) (Just . Index.fromIndex)
    ]


testPropFromToList :: TestTree
testPropFromToList = testGroup "conversion to/from list" 
    [ testProperty "fromList / toAscList" $ property $ do
        ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
        let index = Index.fromList ms
        tripping index (reverse . Index.toAscList) (Just . Index.fromList)
    , testProperty "toIndex / fromIndex" $ property $ do
        ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
        let index = Index.toIndex ms :: Index.Index (Char, Char)
        tripping index (reverse . Index.fromIndex) (Just . (Index.toIndex :: [(Char, Char)] -> Index.Index (Char, Char)))
    ]


testPropFromToAscList :: TestTree
testPropFromToAscList = testProperty "fromAscList / toAscList" $ property $ do
    ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
    let index = Index.fromList ms
    tripping index Index.toAscList (Just . Index.Internal.fromAscList)


testPropFromToVector :: TestTree
testPropFromToVector = testGroup "conversion to/from Vector"
    [ testProperty "fromVector / toAscVector" $ property $ do
        ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
        let index = Index.fromList ms
        tripping index (Vector.reverse . Index.toAscVector) (Just . Index.fromVector)
    , testProperty "toIndex / fromIndex" $ property $ do
        ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
        let index = Index.toIndex ms :: Index.Index (Char, Char)
        tripping index (Vector.reverse . Index.fromIndex) (Just . (Index.toIndex :: Vector.Vector (Char, Char) -> Index.Index (Char, Char)))
    ]


testPropFromToAscVector :: TestTree
testPropFromToAscVector = testProperty "fromAscVector / toAscVector" $ property $ do
    ms <- forAll $ Gen.list (Range.linear 0 50) ((,) <$> Gen.alpha <*> Gen.alpha)
    let index = Index.fromList ms
    tripping index (Index.toAscVector :: Index.Index (Char, Char) -> Vector.Vector (Char, Char)) (Just . Index.Internal.fromAscVector)


testPropMemberNotMember :: TestTree
testPropMemberNotMember = testProperty "elements are either a member or not a member of the index" $ property $ do
    ms <- forAll $ Gen.list (Range.linear 0 50) (Gen.int (Range.linear (-100) 100))
    k  <- forAll $ Gen.int (Range.linear (-100) 100)

    let ix = Index.fromList ms
    assert $ (k `Index.member` ix) /= (k `Index.notMember` ix)


testPropFilter :: TestTree
testPropFilter = testProperty "filter works just like for Sets" $ property $ do
    ms <- forAll $ Gen.list (Range.linear 0 50) (Gen.int (Range.linear (-100) 100))

    let ss = Set.fromList ms
        ix = Index.fromSet ss
    
    Index.fromSet (Set.filter even ss) === Index.filter even ix