packages feed

dataframe-0.3.0.3: tests/Operations/Filter.hs

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

module Operations.Filter where

import qualified Data.Text as T
import qualified Data.Vector as V
import qualified Data.Vector.Unboxed as VU
import qualified DataFrame as D
import qualified DataFrame as DE
import qualified DataFrame as DI

import Assertions
import Test.HUnit
import Type.Reflection (typeRep)

values :: [(T.Text, DI.Column)]
values =
    [ ("test1", DI.fromList ([1 .. 26] :: [Int]))
    , ("test2", DI.fromList (map show ['a' .. 'z']))
    , ("test3", DI.fromList ([1 .. 26] :: [Int]))
    , ("test4", DI.fromList ['a' .. 'z'])
    , ("test5", DI.fromList ([1 .. 26] :: [Int]))
    , ("test6", DI.fromList ['a' .. 'z'])
    , ("test7", DI.fromList ([1 .. 26] :: [Int]))
    , ("test8", DI.fromList ['a' .. 'z'])
    ]

testData :: D.DataFrame
testData = D.fromNamedColumns values

filterColumnDoesNotExist :: Test
filterColumnDoesNotExist =
    TestCase
        ( assertExpectException
            "[Error Case]"
            (DE.columnNotFound "test0" "filter" (D.columnNames testData))
            (print $ D.filter @Int "test0" even testData)
        )

filterColumnWrongType :: Test
filterColumnWrongType =
    TestCase
        ( assertExpectException
            "[Error Case]"
            (DE.typeMismatchError (show $ typeRep @Integer) (show $ typeRep @Int))
            (print $ D.filter @Integer "test1" even testData)
        )

filterByColumnDoesNotExist :: Test
filterByColumnDoesNotExist =
    TestCase
        ( assertExpectException
            "[Error Case]"
            (DE.columnNotFound "test0" "filter" (D.columnNames testData))
            (print $ D.filterBy @Int even "test0" testData)
        )

filterByColumnWrongType :: Test
filterByColumnWrongType =
    TestCase
        ( assertExpectException
            "[Error Case]"
            (DE.typeMismatchError (show $ typeRep @Integer) (show $ typeRep @Int))
            (print $ D.filterBy @Integer even "test1" testData)
        )

filterColumnInexistentValues :: Test
filterColumnInexistentValues =
    TestCase
        ( assertEqual
            "Non existent filter value returns no rows"
            (0, 8)
            (D.dimensions $ D.filter @Int "test1" (< 0) testData)
        )

filterColumnAllValues :: Test
filterColumnAllValues =
    TestCase
        ( assertEqual
            "Filters all columns"
            (26, 8)
            (D.dimensions $ D.filter @Int "test1" (const True) testData)
        )

filterJustWAI :: Test
filterJustWAI =
    TestCase
        ( assertEqual
            "Filters out Nothing and unwraps Maybe"
            (D.fromNamedColumns [("test", D.fromList $ replicate 5 (1 :: Int))])
            (D.filterJust "test" (D.fromNamedColumns [("test", D.fromList $ take 10 $ cycle [Just (1 :: Int), Nothing])]))
        )

tests :: [Test]
tests =
    [ TestLabel "filterColumnDoesNotExist" filterColumnDoesNotExist
    , TestLabel "filterColumnWrongType" filterColumnWrongType
    , TestLabel "filterByColumnDoesNotExist" filterByColumnDoesNotExist
    , TestLabel "filterByColumnWrongType" filterByColumnWrongType
    , TestLabel "filterColumnInexistentValues" filterColumnInexistentValues
    , TestLabel "filterColumnAllValues" filterColumnAllValues
    , TestLabel "filterJustWAI" filterJustWAI
    ]